Как по номеру колонки узнать в excel

Для загрузки товаров в накладную или в каталог из Excel необходимо правильно определить номера столбцов с данными в документе.

В некоторых случаях может оказаться, что данные находятся не в том столбце, в котором кажется.

На примере выше может показаться, что стоимость товара указана в столбце 33, но это не так. Это связано с тем, что несколько ячеек в строке объединены в одну. Для того, чтобы правильно определить, в каком столбце находится информация, кликните на ячейку с данными (она будет выделена зеленым прямоугольником) и посмотрите адрес в информационной строке.

Excel может отображать номера столбцов в разных форматах, разберем ситуация для каждого из них:

Цифровая нумерация столбцов

Адрес ячейки указан как R19C30:

  • R, значит “Row” (строка) – 19
  • C, значит “Column” (Столбце) – 30

Т.е. в рассматриваемом примере столбец с ценой имеет номер 30. Именно его и необходимо указать.

Буквенная нумерация столбцов

В данном случае адрес ячейки имеет вид: AD19

  • AD – номер столбца
  • 19 – номер строки

Нас интересует значение номера столбца, именно его и необходимо заполнить. В программе при вводе номера в цифровом значении отображается и буквенный эквивалент:

Как переключить вид нумерации

В Excel можно переключить вид отображения адреса ячейки. Сделать это можно, открыв Файл-Параметры, вкладка “Формулы”:

MS Excel columns have a pattern like A, B, C, …, Z, AA, AB, AC, …., AZ, BA, BB, … ZZ, AAA, AAB ….. etc. In other words, column 1 is named “A”, column 2 as “B”, and column 27 as “AA”.
Given a column number, find its corresponding Excel column name. The following are more examples.

Input          Output
 26             Z
 51             AY
 52             AZ
 80             CB
 676            YZ
 702            ZZ
 705            AAC

Thanks to Mrigank Dembla for suggesting the below solution in a comment.
Suppose we have a number n, let’s say 28. so corresponding to it we need to print the column name. We need to take the remainder with 26. 

If the remainder with 26 comes out to be 0 (meaning 26, 52, and so on) then we put ‘Z’ in the output string and new n becomes n/26 -1 because here we are considering 26 to be ‘Z’ while in actuality it’s 25th with respect to ‘A’.

Similarly, if the remainder comes out to be non-zero. (like 1, 2, 3, and so on) then we need to just insert the char accordingly in the string and do n = n/26.

Finally, we reverse the string and print. 

Example: 
n = 700
The remainder (n%26) is 24. So we put ‘X’ in the output string and n becomes n/26 which is 26. 
Remainder (26%26) is 0. So we put ‘Z’ in the output string and n becomes n/26 -1 which is 0.

Following is the implementation of the above approach.

C++

#include <bits/stdc++.h>

#define MAX 50

using namespace std;

void printString(int n)

{

    char str[MAX];

    int i = 0;

    while (n > 0) {

        int rem = n % 26;

        if (rem == 0) {

            str[i++] = 'Z';

            n = (n / 26) - 1;

        }

        else

        {

            str[i++] = (rem - 1) + 'A';

            n = n / 26;

        }

    }

    str[i] = '';

    reverse(str, str + strlen(str));

    cout << str << endl;

    return;

}

int main()

{

    printString(26);

    printString(51);

    printString(52);

    printString(80);

    printString(676);

    printString(702);

    printString(705);

    return 0;

}

Java

public class ExcelColumnTitle {

    private static void printString(int columnNumber)

    {

        StringBuilder columnName = new StringBuilder();

        while (columnNumber > 0) {

            int rem = columnNumber % 26;

            if (rem == 0) {

                columnName.append("Z");

                columnNumber = (columnNumber / 26) - 1;

            }

            else

            {

                columnName.append((char)((rem - 1) + 'A'));

                columnNumber = columnNumber / 26;

            }

        }

        System.out.println(columnName.reverse());

    }

    public static void main(String[] args)

    {

        printString(26);

        printString(51);

        printString(52);

        printString(80);

        printString(676);

        printString(702);

        printString(705);

    }

}

Python

MAX = 50

def printString(n):

    string = [""] * MAX

    i = 0

    while n > 0:

        rem = n % 26

        if rem == 0:

            string[i] = 'Z'

            i += 1

            n = (n / 26) - 1

        else:

            string[i] = chr((rem - 1) + ord('A'))

            i += 1

            n = n / 26

    string[i] = ''

    string = string[::-1]

    print "".join(string)

printString(26)

printString(51)

printString(52)

printString(80)

printString(676)

printString(702)

printString(705)

C#

using System;

class GFG{

static String reverse(String input)

{

    char[] reversedString = input.ToCharArray();

    Array.Reverse(reversedString);

    return new String(reversedString);

}

private static void printString(int columnNumber)

{

    String columnName = "";

    while (columnNumber > 0)

    {

        int rem = columnNumber % 26;

        if (rem == 0)

        {

            columnName += "Z";

            columnNumber = (columnNumber / 26) - 1;

        }

        else

        {

            columnName += (char)((rem - 1) + 'A');

            columnNumber = columnNumber / 26;

        }

    }

    columnName = reverse(columnName);

    Console.WriteLine(columnName.ToString());

}

public static void Main(String[] args)

{

    printString(26);

    printString(51);

    printString(52);

    printString(80);

    printString(676);

    printString(702);

    printString(705);

}

}

Javascript

<script>

function printString(columnNumber)

{

        let columnName = [];

        while (columnNumber > 0) {

            let rem = columnNumber % 26;

            if (rem == 0) {

                columnName.push("Z");

                columnNumber = Math.floor(columnNumber / 26) - 1;

            }

            else

            {

                columnName.push(String.fromCharCode((rem - 1) + 'A'.charCodeAt(0)));

                columnNumber = Math.floor(columnNumber / 26);

            }

        }

        document.write(columnName.reverse().join("")+"<br>");

}

printString(26);

printString(51);

printString(52);

printString(80);

printString(676);

printString(702);

printString(705);

</script>

Output

Z
AY
AZ
CB
YZ
ZZ
AAC

Time Complexity: O(log26n), as we are using a loop and in each traversal, we decrement by floor division of 26.

Auxiliary Space: O(50), as we are using extra space for storing the result.
Method 2 
The problem is similar to converting a decimal number to its binary representation but instead of a binary base system where we have two digits only 0 and 1, here we have 26 characters from A-Z.
So, we are dealing with base 26 instead of base binary. 
That’s not where the fun ends, we don’t have zero in this number system, as A represents 1, B represents 2 and so on Z represents 26. 
To make the problem easily understandable, we approach the problem in two steps:

  1. Convert the number to base 26 representation, considering we have 0 also in the system.
  2. Change the representation to the one without having 0 in its system.

HOW? Here is an example

Step 1: 
Consider we have number 676, How to get its representation in the base 26 system? In the same way, we do for a binary system, Instead of division and remainder by 2, we do division and remainder by 26.

Base 26 representation of 676 is : 100 

Step2
But Hey, we can’t have zero in our representation. Right? Because it’s not part of our number system. How do we get rid of zero? Well it’s simple, but before doing that let’s remind one simple math trick:

Subtraction: 
5000 - 9, How do you subtract 9 from 0 ? You borrow
from next significant bit, right.  
  • In a decimal number system to deal with zero, we borrow 10 and subtract 1 from the next significant.
  • In the Base 26 Number System to deal with zero, we borrow 26 and subtract 1 from the next significant bit.

So Convert 10026 to a number system that does not have ‘0’, we get (25 26)26 
Symbolic representation of the same is: YZ 

Here is the implementation of the same:

C++

#include <iostream>

using namespace std;

void printString(int n)

{

    int arr[10000];

    int i = 0;

    while (n) {

        arr[i] = n % 26;

        n = n / 26;

        i++;

    }

    for (int j = 0; j < i - 1; j++) {

        if (arr[j] <= 0) {

            arr[j] += 26;

            arr[j + 1] = arr[j + 1] - 1;

        }

    }

    for (int j = i; j >= 0; j--) {

        if (arr[j] > 0)

            cout << char('A' + arr[j] - 1);

    }

    cout << endl;

}

int main()

{

    printString(26);

    printString(51);

    printString(52);

    printString(80);

    printString(676);

    printString(702);

    printString(705);

    return 0;

}

Java

import java.util.*;

class GFG{

static void printString(int n)

{

    int []arr = new int[10000];

    int i = 0;

    while (n > 0)

    {

        arr[i] = n % 26;

        n = n / 26;

        i++;

    }

    for(int j = 0; j < i - 1; j++)

    {

        if (arr[j] <= 0)

        {

            arr[j] += 26;

            arr[j + 1] = arr[j + 1] - 1;

        }

    }

    for(int j = i; j >= 0; j--)

    {

        if (arr[j] > 0)

            System.out.print(

                (char)('A' + arr[j] - 1));

    }

    System.out.println();

}

public static void main(String[] args)

{

    printString(26);

    printString(51);

    printString(52);

    printString(80);

    printString(676);

    printString(702);

    printString(705);

}

}

Python3

def printString(n):

    arr = [0] * 10000

    i = 0

    while (n > 0):

        arr[i] = n % 26

        n = int(n // 26)

        i += 1

    for j in range(0, i - 1):

        if (arr[j] <= 0):

            arr[j] += 26

            arr[j + 1] = arr[j + 1] - 1

    for j in range(i, -1, -1):

        if (arr[j] > 0):

            print(chr(ord('A') +

                  (arr[j] - 1)), end = "");

    print();

if __name__ == '__main__':

    printString(26);

    printString(51);

    printString(52);

    printString(80);

    printString(676);

    printString(702);

    printString(705);

C#

using System;

class GFG{

static void printString(int n)

{

  int []arr = new int[10000];

  int i = 0;

  while (n > 0)

  {

    arr[i] = n % 26;

    n = n / 26;

    i++;

  }

  for(int j = 0; j < i - 1; j++)

  {

    if (arr[j] <= 0)

    {

      arr[j] += 26;

      arr[j + 1] = arr[j + 1] - 1;

    }

  }

  for(int j = i; j >= 0; j--)

  {

    if (arr[j] > 0)

      Console.Write((char)('A' +

                     arr[j] - 1));

  }

  Console.WriteLine();

}

public static void Main(String[] args)

{

  printString(26);

  printString(51);

  printString(52);

  printString(80);

  printString(676);

  printString(702);

  printString(705);

}

}

Javascript

<script>

function printString(n){

    let arr = [];

    let i = 0;

    while (n) {

        arr[i] = n % 26;

        n = Math.floor(n / 26);

        i++;

    }

    for (let j = 0; j < i - 1; j++) {

        if (arr[j] <= 0) {

            arr[j] += 26;

            arr[j + 1] = arr[j + 1] - 1;

        }

    }

    let ans = '';

    for (let j = i; j >= 0; j--) {

        if (arr[j] > 0)

            ans += String.fromCharCode(65 + arr[j] - 1);

    }

    document.write(ans + "<br>");

}

printString(26);

printString(51);

printString(52);

printString(80);

printString(676);

printString(702);

printString(705);

</script>

Output

Z
AY
AZ
CB
YZ
ZZ
AAC

Time Complexity: O(log26n), as we are using a loop and in each traversal, we decrement by floor division of 26.

Auxiliary Space: O(10000), as we are using extra space for the array.

Method 3:

We can use a recursive function which definitely reduces the time and  increase the efficiency:

Alphabets are in sequential order like: ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’. You have experienced while using excel when you see columns and rows numbering are done in  Alphabetical ways.

Here’s How I purposefully think about the logic of how it is arranged.

(In Mathematical  terms, [a , b ] means from ‘a’ to ‘b’).

[1,26] = [A,Z] (Understand by ‘1’ stands for ‘A’ and ’26” stands for “Z”). For [27,52] ,it will be like [AA,AZ], For [57,78] it will be [BA,BZ]

Logic is to append an Alphabet sequentially whenever it ends up numbering at 26.

For example, if the number is ’27’ which is greater than  ’26’, then we simply need to divide by 26, and we get the remainder as 1, We see “1” as “A” and can be recursively done.

we will be using python for this.

Algorithm is:

1. Take an array and Sort the letters from A to Z . (You can also use the import string and string function to get “A to Z” in uppercase.)

2. If the number is less than or equal to ’26’, simply get the letter from the array and print it.

3. If it is greater than 26, use the Quotient  Remainder rule, if the remainder is zero, there are 2 possible ways, if the quotient is “1”, simply hash out the letter from the index [r-1]( ‘r’ is remainder), else call out the function from the num =(q-1) and append at the front to the letter indexing [r-1].

4. If the remainder is not equal to “0”, call the function for the num = (q) and append at the front to the letter indexing [r-1].

The code concerned with this is:

C++

#include<bits/stdc++.h>

using namespace std;

string alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

string num_hash(int num){

    if(num < 26){

      string res = "";

      res += alpha[num-1];

      return res;

    }

    else{

      int q = (num / 26);

      int r = num % 26;

      string res = "";

      if(r == 0){

        if(q == 1){

          res.append(1,alpha[(26 + r-1)%26]);

        }

        else{

          res = num_hash(q-1);

          res.append(1,alpha[(26 + r-1)%26]);

        }

      }

      else{

        res = num_hash(q);

        res.append(1,alpha[(26 + r-1)%26]);

      }

      return res;

    }

}

int main () {

    cout<< num_hash(26) << endl;

    cout<< num_hash(51) << endl;

    cout<< num_hash(52) << endl;

    cout<< num_hash(80) << endl;

    cout<< num_hash(676) << endl;

    cout<< num_hash(702) << endl;

    cout<< num_hash(705) << endl;

    return 0;

}

Java

import java.io.*;

class GFG

{

  static String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

  static String num_hash(int num){

    if(num < 26)

      return Character.toString(alpha.charAt(num-1));

    else{

      int q = Math.floorDiv(num, 26);

      int r = num % 26;

      if(r == 0){

        if(q == 1){

          return Character.toString(alpha.charAt((26 + r-1)%26));

        }

        else

          return num_hash(q-1) + alpha.charAt((26 + r-1)%26);

      }

      else

        return num_hash(q) + alpha.charAt((26 + r-1)%26);

    }

  }

  public static void main (String[] args) {

    System.out.println(num_hash(26));

    System.out.println(num_hash(51));

    System.out.println(num_hash(52));

    System.out.println(num_hash(80));

    System.out.println(num_hash(676));

    System.out.println(num_hash(702));

    System.out.println(num_hash(705));

  }

}

Python3

alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

def num_hash(num):

    if num < 26:

        return alpha[num-1]

    else:

        q, r = num//26, num % 26

        if r == 0:

            if q == 1:

                return alpha[r-1]

            else:

                return num_hash(q-1) + alpha[r-1]

        else:

            return num_hash(q) + alpha[r-1]

print(num_hash(26))

print(num_hash(51))

print(num_hash(52))

print(num_hash(80))

print(num_hash(676))

print(num_hash(702))

print(num_hash(705))

C#

using System;

class GFG

{

static string alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

static string num_hash(int num){

    if(num < 26)

    return Char.ToString(alpha[num-1]);

    else{

    int q = num/26;

    int r = num % 26;

    if(r == 0){

        if(q == 1){

        return Char.ToString(alpha[(26 + r-1)%26]);

        }

        else

        return num_hash(q-1) + alpha[(26 + r-1)%26];

    }

    else

        return num_hash(q) + alpha[(26 + r-1)%26];

    }

}

public static void Main(String[] args) {

    Console.WriteLine(num_hash(26));

    Console.WriteLine(num_hash(51));

    Console.WriteLine(num_hash(52));

    Console.WriteLine(num_hash(80));

    Console.WriteLine(num_hash(676));

    Console.WriteLine(num_hash(702));

    Console.WriteLine(num_hash(705));

}

}

Javascript

<script>

let alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

function num_hash(num)

{

    if(num < 26)

        return alpha[num-1]

    else{

        let q = Math.floor(num/26),r = num % 26

        if(r == 0){

            if(q == 1)

                return alpha[(26 + r-1)]

            else

                return num_hash(q-1) + alpha[(26 + r-1)]

        }

        else

            return num_hash(q) + alpha[r-1]

    }

}

document.write(num_hash(26),"</br>")

document.write(num_hash(51),"</br>")

document.write(num_hash(52),"</br>")

document.write(num_hash(80),"</br>")

document.write(num_hash(676),"</br>")

document.write(num_hash(702),"</br>")

document.write(num_hash(705),"</br>")

</script>

Output

Z
AY
AZ
CB
YZ
ZZ
AAC

Time Complexity: O(log26n), as we are using recursion and in each recursive call, we decrement by floor division of 26.

Auxiliary Space: O(1), as we are not using any extra space.
Related Article : 
Find the Excel column number from the column title
This article is contributed by Kartik. Please write comments if you find anything incorrect, or if you want to share more information about the topic discussed above.

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Ну, собственно, вопрос — в заголовке…

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Не придумал ничего лучше, чем это:  

  Sub test()  
   Debug.Print БукваСтолбца(6)  
End Sub  

  Function БукваСтолбца(ByVal col As Long) As String  
   On Error Resume Next  
   БукваСтолбца = Application.ConvertFormula(«rc» & col, xlR1C1, xlA1)  
   БукваСтолбца = Replace(Mid(БукваСтолбца, 2), 1, «»)  
End Function  

  Вопрос — а нафига это нужно?

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

А таблицу соответствий в ВБА можно сделать?  
Ну там {1:А;2:В;…}

 

Nicks

Пользователь

Сообщений: 71
Регистрация: 09.07.2010

{quote}{login=Alex_ST}{date=10.09.2010 10:57}{thema=Как по номеру столбца узнать его букву (VBA)?}{post}Ну, собственно, вопрос — в заголовке…{/post}{/quote}  
Есть только алгоритм функции на другом языке но переделать можно  
int целая часть  
clip(left аналог trim и тд  
If (Num > 0) and (Num < 16385)  
 Num -= 1 ! Номера колонок должны начинаться с нуля  
 Clear(Name) ! Очистили строку с результатом  
 Loop While Num >= 26  
 Name = Chr((Num % 26) + 65) & Clip(Name)  
 Num = Int(Num / 26) — 1  
 end  
 Return(Clip(Left(Chr(Num+ 65) & Clip(Name))))  
  else  
 Return(‘???’)  
 end

 

Немного ошибся — правильно будет так:  

  Sub test()  
   Debug.Print БукваСтолбца(6)  
End Sub  

  Function БукваСтолбца(ByVal col As Long) As String  
   On Error Resume Next  
   БукваСтолбца = Application.ConvertFormula(«r1c» & col, xlR1C1, xlA1)  
   БукваСтолбца = Replace(Replace(Mid(БукваСтолбца, 2), «$», «»), «1», «»)  
End Function

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Спасибо.  
Сейчас попробую.  
А нужно мне это чтобы при обработкой макросом введённых юзером в таблицу данных можно было сказать ему, что, например, «Данные, введённые Вами в ячейку А2, не совместимы с данными, введёнными в ячейку Р5»

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Спасибо большое, Учитель джедаев!  
Как всегда элегантно и просто!  
Всё отлично работает.

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Алексей, так может легче и быстрее методом «Find» воспользоваться?

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

{quote}{login=Дъмитръ}{date=10.09.2010 11:40}{thema=}{post}… методом «Find» воспользоваться?{/post}{/quote}  
Не понял, для чего?  
Что и где искать?

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

{quote}{login=Alex_ST}{date=10.09.2010 11:20}{thema=}{post}А нужно мне это чтобы… {/post}{/quote}  
Алекс, а Address разве не устроит?

 

«Данные, введённые Вами в ячейку А2, не совместимы с данными, введёнными в ячейку Р5» + Юрия предложение. :)  

  Кусочик примера.  
——————  
‘…  
Set FindText = Range(Cells(1, 5), Cells(Cells(Rows.Count, 5).End(xlUp).Row, _  
5)).Find(What:=ActiveCell.Text, LookIn:=xlValues, LookAt:=xlWhole, _  
‘…  
——————

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Блин…  
Старею. Склероз+переклин…  
И в самом деле, всё же элементарно: Replace(Address,»$»,»»)  
Мало того, что сам затупил, так ещё и Йодо запутал…  
Спасибо за F1

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 
 

Алексей… :)  

  Не надо:  
Replace(Address,»$»,»»)  

  Надо так:  
Address = ActiveCell.Address(False, False)  

  Пятница наверное, отдыхать пора. ;)

 

{quote}{login=Alex_ST}{date=10.09.2010 12:09}{thema=}{post} Склероз+переклин…  
И в самом деле, всё же элементарно: Replace(Address,»$»,»»)  
Мало того, что сам затупил, так ещё и Йодо запутал…  
Спасибо за F1{/post}{/quote}  
1. Дело не в склерозе.  
Вы решили сэкономить слова на формулировке задачи.  
Подробно бы описали, что вам надо, — получили бы простой и внятный ответ.  

    2. Я вас не запутывал.  
Я дал точный ответ на сформулированную вами задачу. (как из числа получить букву)  
То, что вы забыли объяснить, для чего это нужно, — это уже не мои проблемы.  
Я, конечно, догадывался, что мудрить с вычислением буквы тут совсем не надо,  
и есть более простые решения, — но задавать кучу наводящих вопросов как-то не хотелось  
(вы всё же не первый день на форуме — могли бы и точнее формулировать вопросы)

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Да, точно!  
Отдыхать пора.    
К стати, я с понедельника в отпуске!!!  
Уеду на 2 недели в Турцию в бунгало на Ultra All Inclusive  
Да при таком как там количестве халявных (ну, в смысле: «за всё уже уплочено») напитков русский язык бы за 2 недели не забыть, а про бэйсик я уже молчу…

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

{quote}{login=Alex_ST}{date=10.09.2010 12:09}{thema=}{post}Мало того, что сам затупил, так ещё и Йодо запутал…{/post}{/quote}  
Ну вот, поскупился на слова и получилось «казнить нельзя помиловать»…  

  Моя реплика должна была, естественно, звучать так:  
«Мало того, что сам затупил, так ещё и глубокоуважаемого учителя EducatedFool запутал своими необдуманными вопросами…»  
так понятно, кто кого запутал?  

  Посыпаю голову пеплом и бьюсь лбом об стол (между «клавой» и мышкой, конечно).

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Ну вот, уезжаете и еще уважаемого EducatedFool обидели, хотя и ему пора отдыхать, переработался. :)

 

Привет всем.  
Будучи в командировке, оторванным от инета, вспомнил название этой темы и решил поэкспериментировать. В принципе, это классическая задача о переводе числа в другую систему счисления, что видно из примера Nicks.  
У меня получилась такая функция:  

  Function Num2ABC(ByVal x As Long) As String  
Do  
   Num2ABC = Chr$(64 + x Mod 26) & Num2ABC  
   x = x 26  
Loop Until x = 0  
End Function  

  Она работает в 25 раз быстрее, чем функция, основанная на Application.ConvertFormula.

 

Somebody

Пользователь

Сообщений: 169
Регистрация: 01.01.1970

Узнаём имя 6-го столбца  

  MsgBox Split(Cells(1, 6).Address, «$»)(1)  

    P.S. Скорость не замерял

 
 

В связи с проявленным интересом к этой теме (

http://programmersforum.ru/showthread.php?t=166788

), выкладываю функцию для обратного преобразования, «заголовка столбца» в число. В кавычках, потому что диапазон возвращаемого числа не ограничен числом столбцов:  

  ?ABC2Num(«a»)  
1    
?ABC2Num(«iv»)  
256    
?ABC2Num(«xfd»)  
16384    
?ABC2Num(«abcdefghijk»)  
152686330658691    

  Два варианта функции, один с разбором строки по символам, другой — через массив байт. Мой результат (Pentium M 1.6, WinXP, Office 2000):  

  символы:  4,1875    
байты:  1,828125    

  Function ABC2Num(ByVal x As String) As Double  
Dim i&  
x = UCase(x)  
For i = 1 To Len(x)  
   ABC2Num = 26# * ABC2Num + Asc(Mid$(x, i, 1)) — 64#  
Next  
End Function  

  Function ABC2Num2(x As String) As Double  
Dim i&, b() As Byte  
b = x  
For i = 0 To UBound(b) Step 2  
   ABC2Num2 = 26 * ABC2Num2 + (b(i) And 31)  
Next  
End Function  

  Sub test()  
Dim a#, t!, i&  
t = Timer  
For i = 1 To 1000000  
   ABC2Num «abcdefghijk»  
Next  
Debug.Print «символы: «; Timer — t  
t = Timer  
For i = 1 To 1000000  
   ABC2Num2 «abcdefghijk»  
Next  
Debug.Print «байты: «; Timer — t  
End Sub

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

Прошу прощения, а зачем оно может понадобиться?)  

  Sub io()  
MsgBox Columns(1).Address  
End Sub  

  Sub io2()  
MsgBox Columns(«A»).Column  
End Sub  

  >>В кавычках, потому что диапазон возвращаемого числа не ограничен числом столбцов:  
хотя…

 

egonomist

Пользователь

Сообщений: 409
Регистрация: 21.12.2012

для разнообразия немного изварщеный вариант  

  Public Function xlsColName(j As Integer) As String  
On Error GoTo xlsColNameError  
Dim nCycle As Long  
Dim kkkk As Long  
Dim llll As Long  
Dim tmpRes As String  
Dim i As Integer  
Dim osnova As Long  

     osnova = 26  
   ‘Кол-во разрядов    nCycle = -1  
   i = 1  
   While i > 0  
       nCycle = nCycle + 1  
       i = (j — osnova ^ (nCycle — 1)) osnova ^ nCycle  
   Wend  
   kkkk = j — 1  
   For i = nCycle To 1 Step -1  
       llll = kkkk osnova ^ (i — 1)  
       If i > 1 Then  
           tmpRes = tmpRes + Chr(65 + llll — 1)  
       Else  
           tmpRes = tmpRes + Chr(65 + llll)  
       End If  
       kkkk = kkkk — llll * osnova ^ (i — 1)  
   Next i  
   xlsColName = tmpRes  

         GoTo xlsColNameEnd  

  xlsColNameError:  
   MsgBox err.Description  
   Resume xlsColNameEnd  
xlsColNameEnd:  

  End Function  
Public Function xlsColIndex(Name As String) As Integer  
On Error GoTo xlsColIndexError  
Dim nCycle As Long  
Dim kkkk As String  
Dim i As Integer  
Dim tmpRes As Integer  

     ‘Кол-во кругов  
   nCycle = Len(Name)  
   For i = nCycle To 1 Step -1  
       kkkk = Mid(Name, i, 1)  
       tmpRes = tmpRes + 26 ^ (nCycle — i) * (Asc(kkkk) — 65 + 1)  
   Next i  
   xlsColIndex = tmpRes  

         GoTo xlsColIndexEnd  

  xlsColIndexError:  
   MsgBox err.Description  
   Resume xlsColIndexEnd  
xlsColIndexEnd:  

  End Function

 

VovaK

Пользователь

Сообщений: 1716
Регистрация: 01.01.1970

Нормальные герои всегда идут в обход :)

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

А что означает (1) ? Посмотрел в справке функцию Split и не нашёл объяснения. Вот как можно было прийти к тому, что в конце нужно добавить (1), чтобы получить такое элегантное решение? )))

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

В скобках порядковый номер элемента массива (отсчёт с нуля).

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

Cells(1, 6).Address будет $F$1  
Split(Cells(1, 6).Address, «$»)(1) будет F  
Split(Cells(1, 6).Address, «$»)(2) будет 1

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

Ещё пример:  
Sub TestArr()  
Dim Stroka  
Stroka = «Первый второй третий»  
MsgBox Split(Stroka)(1)  
End Sub

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

#30

30.03.2012 19:25:52

Спасибо за примеры. То есть, если разделитель не указан, то в качестве разделителя выступает пробел, если он есть. Если же нет ни одного пробела, то в массиве один элемент. В качестве разделителей выступают любые указанные знаки. Правильно?

Hello! My blog: TRADING WAY

Содержание

  • Поисковая функция в Excel
    • Способ 1: простой поиск
    • Способ 2: поиск по указанному интервалу ячеек
    • Способ 3: Расширенный поиск
  • Вопросы и ответы

Поиск в Microsoft Excel

В документах Microsoft Excel, которые состоят из большого количества полей, часто требуется найти определенные данные, наименование строки, и т.д. Очень неудобно, когда приходится просматривать огромное количество строк, чтобы найти нужное слово или выражение. Сэкономить время и нервы поможет встроенный поиск Microsoft Excel. Давайте разберемся, как он работает, и как им пользоваться.

Поисковая функция в Excel

Поисковая функция в программе Microsoft Excel предлагает возможность найти нужные текстовые или числовые значения через окно «Найти и заменить». Кроме того, в приложении имеется возможность расширенного поиска данных.

Способ 1: простой поиск

Простой поиск данных в программе Excel позволяет найти все ячейки, в которых содержится введенный в поисковое окно набор символов (буквы, цифры, слова, и т.д.) без учета регистра.

  1. Находясь во вкладке «Главная», кликаем по кнопке «Найти и выделить», которая расположена на ленте в блоке инструментов «Редактирование». В появившемся меню выбираем пункт «Найти…». Вместо этих действий можно просто набрать на клавиатуре сочетание клавиш Ctrl+F.
  2. Переход к поиску в Microsoft Excel

  3. После того, как вы перешли по соответствующим пунктам на ленте, или нажали комбинацию «горячих клавиш», откроется окно «Найти и заменить» во вкладке «Найти». Она нам и нужна. В поле «Найти» вводим слово, символы, или выражения, по которым собираемся производить поиск. Жмем на кнопку «Найти далее», или на кнопку «Найти всё».
  4. Обычный поиск в Microsoft Excel

  5. При нажатии на кнопку «Найти далее» мы перемещаемся к первой же ячейке, где содержатся введенные группы символов. Сама ячейка становится активной.

    Поиск и выдача результатов производится построчно. Сначала обрабатываются все ячейки первой строки. Если данные отвечающие условию найдены не были, программа начинает искать во второй строке, и так далее, пока не отыщет удовлетворительный результат.

    Поисковые символы не обязательно должны быть самостоятельными элементами. Так, если в качестве запроса будет задано выражение «прав», то в выдаче будут представлены все ячейки, которые содержат данный последовательный набор символов даже внутри слова. Например, релевантным запросу в этом случае будет считаться слово «Направо». Если вы зададите в поисковике цифру «1», то в ответ попадут ячейки, которые содержат, например, число «516».

    Для того, чтобы перейти к следующему результату, опять нажмите кнопку «Найти далее».

    Результат обычного поиска в Microsoft Excel

    Так можно продолжать до тех, пор, пока отображение результатов не начнется по новому кругу.

  6. В случае, если при запуске поисковой процедуры вы нажмете на кнопку «Найти все», все результаты выдачи будут представлены в виде списка в нижней части поискового окна. В этом списке находятся информация о содержимом ячеек с данными, удовлетворяющими запросу поиска, указан их адрес расположения, а также лист и книга, к которым они относятся. Для того, чтобы перейти к любому из результатов выдачи, достаточно просто кликнуть по нему левой кнопкой мыши. После этого курсор перейдет на ту ячейку Excel, по записи которой пользователь сделал щелчок.

Найти всё в Microsoft Excel

Способ 2: поиск по указанному интервалу ячеек

Если у вас довольно масштабная таблица, то в таком случае не всегда удобно производить поиск по всему листу, ведь в поисковой выдаче может оказаться огромное количество результатов, которые в конкретном случае не нужны. Существует способ ограничить поисковое пространство только определенным диапазоном ячеек.

  1. Выделяем область ячеек, в которой хотим произвести поиск.
  2. Выделение интервала в Microsoft Excel

  3. Набираем на клавиатуре комбинацию клавиш Ctrl+F, после чего запуститься знакомое нам уже окно «Найти и заменить». Дальнейшие действия точно такие же, что и при предыдущем способе. Единственное отличие будет состоять в том, что поиск выполняется только в указанном интервале ячеек.

Поиск по интервалу в Microsoft Excel

Способ 3: Расширенный поиск

Как уже говорилось выше, при обычном поиске в результаты выдачи попадают абсолютно все ячейки, содержащие последовательный набор поисковых символов в любом виде не зависимо от регистра.

Lumpics.ru

К тому же, в выдачу может попасть не только содержимое конкретной ячейки, но и адрес элемента, на который она ссылается. Например, в ячейке E2 содержится формула, которая представляет собой сумму ячеек A4 и C3. Эта сумма равна 10, и именно это число отображается в ячейке E2. Но, если мы зададим в поиске цифру «4», то среди результатов выдачи будет все та же ячейка E2. Как такое могло получиться? Просто в ячейке E2 в качестве формулы содержится адрес на ячейку A4, который как раз включает в себя искомую цифру 4.

Результат поиска в Microsoft Excel

Но, как отсечь такие, и другие заведомо неприемлемые результаты выдачи поиска? Именно для этих целей существует расширенный поиск Excel.

  1. После открытия окна «Найти и заменить» любым вышеописанным способом, жмем на кнопку «Параметры».
  2. Переход в параметры поиска в Microsoft Excel

  3. В окне появляется целый ряд дополнительных инструментов для управления поиском. По умолчанию все эти инструменты находятся в состоянии, как при обычном поиске, но при необходимости можно выполнить корректировку.
    Параметры поиска по умолчанию в Microsoft Excel

    По умолчанию, функции «Учитывать регистр» и «Ячейки целиком» отключены, но, если мы поставим галочки около соответствующих пунктов, то в таком случае, при формировании результата будет учитываться введенный регистр, и точное совпадение. Если вы введете слово с маленькой буквы, то в поисковую выдачу, ячейки содержащие написание этого слова с большой буквы, как это было бы по умолчанию, уже не попадут. Кроме того, если включена функция «Ячейки целиком», то в выдачу будут добавляться только элементы, содержащие точное наименование. Например, если вы зададите поисковый запрос «Николаев», то ячейки, содержащие текст «Николаев А. Д.», в выдачу уже добавлены не будут.

    Настройки поиска в Microsoft Excel

    По умолчанию, поиск производится только на активном листе Excel. Но, если параметр «Искать» вы переведете в позицию «В книге», то поиск будет производиться по всем листам открытого файла.

    Область поиска в Microsoft Excel

    В параметре «Просматривать» можно изменить направление поиска. По умолчанию, как уже говорилось выше, поиск ведется по порядку построчно. Переставив переключатель в позицию «По столбцам», можно задать порядок формирования результатов выдачи, начиная с первого столбца.

    Содержимое поиска в Microsoft Excel

    В графе «Область поиска» определяется, среди каких конкретно элементов производится поиск. По умолчанию, это формулы, то есть те данные, которые при клике по ячейке отображаются в строке формул. Это может быть слово, число или ссылка на ячейку. При этом, программа, выполняя поиск, видит только ссылку, а не результат. Об этом эффекте велась речь выше. Для того, чтобы производить поиск именно по результатам, по тем данным, которые отображаются в ячейке, а не в строке формул, нужно переставить переключатель из позиции «Формулы» в позицию «Значения». Кроме того, существует возможность поиска по примечаниям. В этом случае, переключатель переставляем в позицию «Примечания».

    Область поиска в программе Microsoft Excel

    Ещё более точно поиск можно задать, нажав на кнопку «Формат».

    Переход к формату поиска в Microsoft Excel

    При этом открывается окно формата ячеек. Тут можно установить формат ячеек, которые будут участвовать в поиске. Можно устанавливать ограничения по числовому формату, по выравниванию, шрифту, границе, заливке и защите, по одному из этих параметров, или комбинируя их вместе.

    Формат поиска в Microsoft Excel

    Если вы хотите использовать формат какой-то конкретной ячейки, то в нижней части окна нажмите на кнопку «Использовать формат этой ячейки…».

    Переход к выбору ячейки для установки формата в Microsoft Excel

    После этого, появляется инструмент в виде пипетки. С помощью него можно выделить ту ячейку, формат которой вы собираетесь использовать.

    Выбор ячейки для установки формата в Microsoft Excel

    После того, как формат поиска настроен, жмем на кнопку «OK».

    Установка формата поиска в Microsoft Excel

    Бывают случаи, когда нужно произвести поиск не по конкретному словосочетанию, а найти ячейки, в которых находятся поисковые слова в любом порядке, даже, если их разделяют другие слова и символы. Тогда данные слова нужно выделить с обеих сторон знаком «*». Теперь в поисковой выдаче будут отображены все ячейки, в которых находятся данные слова в любом порядке.

  4. Поиск по отдельным словам в Microsoft Excel

  5. Как только настройки поиска установлены, следует нажать на кнопку «Найти всё» или «Найти далее», чтобы перейти к поисковой выдаче.

Запуск расширенного поиска в Microsoft Excel

Как видим, программа Excel представляет собой довольно простой, но вместе с тем очень функциональный набор инструментов поиска. Для того, чтобы произвести простейший писк, достаточно вызвать поисковое окно, ввести в него запрос, и нажать на кнопку. Но, в то же время, существует возможность настройки индивидуального поиска с большим количеством различных параметров и дополнительных настроек.

Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).

Описание

В этой статье приведены пошаговые инструкции по поиску данных в таблице (или диапазоне ячеек) с помощью различных встроенных функций Microsoft Excel. Для получения одного и того же результата можно использовать разные формулы.

Создание образца листа

В этой статье используется образец листа для иллюстрации встроенных функций Excel. Рассматривайте пример ссылки на имя из столбца A и возвращает возраст этого человека из столбца C. Чтобы создать этот лист, введите указанные ниже данные в пустой лист Excel.

Введите значение, которое вы хотите найти, в ячейку E2. Вы можете ввести формулу в любую пустую ячейку на том же листе.

A

B

C

D

E

1

Имя

Правитель

Возраст

Поиск значения

2

Анри

501

Плот

Иванов

3

Стэн

201

19

4

Иванов

101

максималь

5

Ларри

301

составляет

Определения терминов

В этой статье для описания встроенных функций Excel используются указанные ниже условия.

Термин

Определение

Пример

Массив таблиц

Вся таблица подстановки

A2: C5

Превышающ

Значение, которое будет найдено в первом столбце аргумента «инфо_таблица».

E2

Просматриваемый_массив
-или-
Лукуп_вектор

Диапазон ячеек, которые содержат возможные значения подстановки.

A2: A5

Номер_столбца

Номер столбца в аргументе инфо_таблица, для которого должно быть возвращено совпадающее значение.

3 (третий столбец в инфо_таблица)

Ресулт_аррай
-или-
Ресулт_вектор

Диапазон, содержащий только одну строку или один столбец. Он должен быть такого же размера, что и просматриваемый_массив или Лукуп_вектор.

C2: C5

Интервальный_просмотр

Логическое значение (истина или ложь). Если указано значение истина или опущено, возвращается приближенное соответствие. Если задано значение FALSE, оно будет искать точное совпадение.

ЛОЖЬ

Топ_целл

Это ссылка, на основе которой вы хотите основать смещение. Топ_целл должен ссылаться на ячейку или диапазон смежных ячеек. В противном случае функция СМЕЩ возвращает #VALUE! значение ошибки #ИМЯ?.

Оффсет_кол

Число столбцов, находящегося слева или справа от которых должна указываться верхняя левая ячейка результата. Например, значение «5» в качестве аргумента Оффсет_кол указывает на то, что верхняя левая ячейка ссылки состоит из пяти столбцов справа от ссылки. Оффсет_кол может быть положительным (то есть справа от начальной ссылки) или отрицательным (то есть слева от начальной ссылки).

Функции

LOOKUP ()

Функция Просмотр находит значение в одной строке или столбце и сопоставляет его со значением в той же позицией в другой строке или столбце.

Ниже приведен пример синтаксиса формулы подСТАНОВКи.

   = Просмотр (искомое_значение; Лукуп_вектор; Ресулт_вектор)


Следующая формула находит возраст Марии на листе «образец».

   = ПРОСМОТР (E2; A2: A5; C2: C5)

Формула использует значение «Мария» в ячейке E2 и находит слово «Мария» в векторе подстановки (столбец A). Формула затем соответствует значению в той же строке в векторе результатов (столбец C). Так как «Мария» находится в строке 4, функция Просмотр возвращает значение из строки 4 в столбце C (22).

Примечание. Для функции Просмотр необходимо, чтобы таблица была отсортирована.

Чтобы получить дополнительные сведения о функции Просмотр , щелкните следующий номер статьи базы знаний Майкрософт:
 

Использование функции Просмотр в Excel

ВПР ()

Функция ВПР или вертикальный просмотр используется, если данные указаны в столбцах. Эта функция выполняет поиск значения в левом столбце и сопоставляет его с данными в указанном столбце в той же строке. Функцию ВПР можно использовать для поиска данных в отсортированных или несортированных таблицах. В следующем примере используется таблица с несортированными данными.

Ниже приведен пример синтаксиса формулы ВПР :

    = ВПР (искомое_значение; инфо_таблица; номер_столбца; интервальный_просмотр)

Следующая формула находит возраст Марии на листе «образец».

   = ВПР (E2; A2: C5; 3; ЛОЖЬ)

Формула использует значение «Мария» в ячейке E2 и находит слово «Мария» в левом столбце (столбец A). Формула затем совпадет со значением в той же строке в Колумн_индекс. В этом примере используется «3» в качестве Колумн_индекс (столбец C). Так как «Мария» находится в строке 4, функция ВПР возвращает значение из строки 4 В столбце C (22).

Чтобы получить дополнительные сведения о функции ВПР , щелкните следующий номер статьи базы знаний Майкрософт:
 

Как найти точное совпадение с помощью функций ВПР или ГПР

INDEX () и MATCH ()

Вы можете использовать функции индекс и ПОИСКПОЗ вместе, чтобы получить те же результаты, что и при использовании поиска или функции ВПР.

Ниже приведен пример синтаксиса, объединяющего индекс и Match для получения одинаковых результатов поиска и ВПР в предыдущих примерах:

    = Индекс (инфо_таблица; MATCH (искомое_значение; просматриваемый_массив; 0); номер_столбца)

Следующая формула находит возраст Марии на листе «образец».


= ИНДЕКС (A2: C5; MATCH (E2; A2: A5; 0); 3)

Формула использует значение «Мария» в ячейке E2 и находит слово «Мария» в столбце A. Затем он будет соответствовать значению в той же строке в столбце C. Так как «Мария» находится в строке 4, формула возвращает значение из строки 4 в столбце C (22).

Обратите внимание Если ни одна из ячеек в аргументе «число» не соответствует искомому значению («Мария»), эта формула будет возвращать #N/А.
Чтобы получить дополнительные сведения о функции индекс , щелкните следующий номер статьи базы знаний Майкрософт:

Поиск данных в таблице с помощью функции индекс

СМЕЩ () и MATCH ()

Функции СМЕЩ и ПОИСКПОЗ можно использовать вместе, чтобы получить те же результаты, что и функции в предыдущем примере.

Ниже приведен пример синтаксиса, объединяющего смещение и сопоставление для достижения того же результата, что и функция Просмотр и ВПР.

   = СМЕЩЕНИЕ (топ_целл, MATCH (искомое_значение; просматриваемый_массив; 0); Оффсет_кол)

Эта формула находит возраст Марии на листе «образец».

   = СМЕЩЕНИЕ (A1; MATCH (E2; A2: A5; 0); 2)

Формула использует значение «Мария» в ячейке E2 и находит слово «Мария» в столбце A. Формула затем соответствует значению в той же строке, но двум столбцам справа (столбец C). Так как «Мария» находится в столбце A, формула возвращает значение в строке 4 в столбце C (22).

Чтобы получить дополнительные сведения о функции СМЕЩ , щелкните следующий номер статьи базы знаний Майкрософт:
 

Использование функции СМЕЩ

Нужна дополнительная помощь?

Понравилась статья? Поделить с друзьями:
  • Как по имени столбца vba excel
  • Как по имени листа excel получить лист в 1с
  • Как по другому называется если то в excel
  • Как по дате определить день недели в excel по дате
  • Как по дате выбирать данные excel