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:
- Convert the number to base 26 representation, considering we have 0 also in the system.
- 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.
Alxb82 Пользователь Сообщений: 6 |
Здравствуйте. Подскажите пожалуйста, как, не используя VBS определить буквенное имя столбца ячейки. Решено: Изменено: Alxb82 — 13.10.2014 19:56:07 |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Не уверен, что нужно Вам именно имя столбца — ни одна функция не просит его. Номер — да. А номер можно узнать функцией СТОЛБЕЦ() Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Pelena Пользователь Сообщений: 1416 |
#3 13.10.2014 15:20:42 Если всё же нужна буква, то
|
||
Сергей Пользователь Сообщений: 11251 |
#4 13.10.2014 15:23:07
Лень двигатель прогресса, доказано!!! |
||
Alxb82 Пользователь Сообщений: 6 |
Задача несколько сложнее обстоит. Решаю ее разбив на множество мелких. Это одна из них. Изменено: Alxb82 — 13.10.2014 15:25:30 |
Alxb82 Пользователь Сообщений: 6 |
Сергей, — точно, работает, то что нужно — сейчас буду разбираться как работает. Спасибо. |
такую задачу решает другая формула =ДВССЫЛ(АДРЕС(2;2)) |
|
Alxb82 Пользователь Сообщений: 6 |
Все верно, но требуется ввести адрес не номером столбца а его именем. В любом случае придется переводить что-то во что-то. Например если нужно ввести текстом (не указать мышкой) столбец с именем «DU». Не считать же какой он там по счету. |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#9 13.10.2014 15:43:14
Что мешает указать ссылку на эту ячейку в СТОЛБЕЦ() ? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Alxb82 Пользователь Сообщений: 6 |
Мешает то, что я, на этапе «программирования» не знаю что это будет именно «DU». Это имя мне будет известно в процессе анализа заполненной таблицы. Я согласен что можно выкрутиться и этим способом (получить не имя а ссылку на ячейку) и в каком-то случае он будет оправдан, но в данный момент меня интересовало получить именно буквенное и только имя столбца. Спасибо. Изменено: Alxb82 — 13.10.2014 19:57:18 |
V Пользователь Сообщений: 5018 |
#11 13.10.2014 16:20:38 если озвучите всю задачу то возможно и ДВССЫЛ не понадобится. Хотя это уже другая тема.
|
||
Alxb82 Пользователь Сообщений: 6 |
#12 13.10.2014 19:18:07 Видимо, самое элегантное решение это:
где из строки адреса «строкастолбец» просто удаляется «строка» и остается «столбец».
тоже абсолютно рабочий вариант решения. |
||||
Буквенное обозначение столбца по номеру |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
0 / 0 / 0 Регистрация: 13.02.2012 Сообщений: 18 |
|
1 |
|
14.02.2012, 21:04. Показов 23519. Ответов 12
Есть ли в VBA функция переводящая номер столбца в его буквенный эквивалент в Excel’е?
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||||||||||||||
14.02.2012, 22:08 |
2 |
|||||||||||||||
РешениеНапример столбец 56
Или так
Добавлено через 24 минуты
Еще У меня получилась такая функция:
Она работает в 25 раз быстрее, чем функция, основанная на Application.ConvertFormula
4 |
аналитика здесь больше нет… 3372 / 1670 / 184 Регистрация: 03.02.2010 Сообщений: 1,219 |
||||
15.02.2012, 10:45 |
3 |
|||
вариант
1 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
15.02.2012, 16:02 |
4 |
|||
Еще
Она работает в 25 раз быстрее, чем функция, основанная на Application.ConvertFormula Функция Num2ABC работает неправильно , при x = 26 Num2ABC=A@ и так далее.
1 |
m-ch 6169 / 934 / 309 Регистрация: 25.02.2011 Сообщений: 1,359 Записей в блоге: 1 |
||||
15.02.2012, 17:17 |
5 |
|||
Функция Num2ABC работает неправильно , при x = 26 Num2ABC=A@ и так далее
2 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
15.02.2012, 17:39 |
6 |
|||
Вот правильная функция:
1 |
m-ch 6169 / 934 / 309 Регистрация: 25.02.2011 Сообщений: 1,359 Записей в блоге: 1 |
||||
15.02.2012, 17:44 |
7 |
|||
или так:
2 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
15.02.2012, 17:46 |
8 |
|||
Это лучше
2 |
Piramidon 0 / 0 / 0 Регистрация: 13.02.2012 Сообщений: 18 |
||||
16.02.2012, 11:48 [ТС] |
9 |
|||
или так:
Вы бы не могли написать комменты к проге… Не понятно это Num2ABC = Chr$(65 + (x — 1) Mod 26) & Num2ABC… Вообще не могу понять, что происходит в этом выражении…
0 |
0 / 0 / 0 Регистрация: 01.11.2012 Сообщений: 20 |
|
09.02.2016, 15:30 |
10 |
Узнаём имя 6-го столбца Коротко и ясно!!! Спасибо большое очень пригодилось.
0 |
Модератор 11342 / 4661 / 748 Регистрация: 07.08.2010 Сообщений: 13,508 Записей в блоге: 4 |
|
09.02.2016, 16:49 |
11 |
а есть ли обратная функция
0 |
m-ch 6169 / 934 / 309 Регистрация: 25.02.2011 Сообщений: 1,359 Записей в блоге: 1 |
||||
09.02.2016, 16:56 |
12 |
|||
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
09.02.2016, 23:06 |
13 |
|||
shanemac51, можно по аналогии
тест в Immediate Код ?abc2num("FJD"),columns("FJD").column 4320 4320
2 |
Эта функция возвращает букву столбца для заданного номера столбца.
Function Col_Letter(lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function
код тестирования для столбца 100
Sub Test()
MsgBox Col_Letter(100)
End Sub
brettdj
09 окт. 2012, в 10:03
Поделиться
Если вы не хотите использовать объект диапазона:
Function ColumnLetter(ColumnNumber As Long) As String
Dim n As Long
Dim c As Byte
Dim s As String
n = ColumnNumber
Do
c = ((n - 1) Mod 26)
s = Chr(c + 65) & s
n = (n - c) 26
Loop While n > 0
ColumnLetter = s
End Function
robartsd
12 март 2013, в 17:44
Поделиться
Что-то, что работает для меня, это:
Cells(Row,Column).Address
Это вернет ссылку формата $AE $1 для вас.
Damian Fennelly
21 нояб. 2013, в 22:25
Поделиться
Еще один способ сделать это. Brettdj answer заставлял меня думать об этом, но если вы используете этот метод, вам не нужно использовать альтернативный массив, вы можете перейти непосредственно к строке.
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
или может сделать его немного более компактным с этим
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
Обратите внимание, что это зависит от того, как вы ссылаетесь на строку 1 в объекте ячейки.
OSUZorba
23 май 2014, в 16:01
Поделиться
И решение с использованием рекурсии:
Function ColumnNumberToLetter(iCol As Long) As String
Dim lAlpha As Long
Dim lRemainder As Long
If iCol <= 26 Then
ColumnNumberToLetter = Chr(iCol + 64)
Else
lRemainder = iCol Mod 26
lAlpha = Int(iCol / 26)
If lRemainder = 0 Then
lRemainder = 26
lAlpha = lAlpha - 1
End If
ColumnNumberToLetter = ColumnNumberToLetter(lAlpha) & Chr(lRemainder + 64)
End If
End Function
Nikolay Ivanov
27 нояб. 2013, в 11:26
Поделиться
- Например:
MsgBox Columns( 9347).Address
возвращает.
Чтобы возвращать ТОЛЬКО буквенные ( ).Address(,0)),":")(0)
: Split((Columns(
Column Index
).Address(,0)),":")(0)
- Например:
MsgBox Split((Columns( 2734).Address(,0)),":")(0)
возвращает.
ashleedawg
30 март 2018, в 15:55
Поделиться
Это доступно с помощью формулы:
=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")
и поэтому также может быть записана как функция VBA по запросу:
Function ColName(colNum As Integer) As String
ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
Alistair Collins
09 дек. 2014, в 13:32
Поделиться
Это версия ответа robartsd (с ароматом однострочное решение Jan Wijninckx), используя рекурсию вместо цикла.
Public Function ColumnLetter(Column As Integer) As String
If Column < 1 Then Exit Function
ColumnLetter = ColumnLetter(Int((Column - 1) / 26)) & Chr(((Column - 1) Mod 26) + Asc("A"))
End Function
Я тестировал это со следующими входами:
1 => "A"
26 => "Z"
27 => "AA"
51 => "AY"
702 => "ZZ"
703 => "AAA"
-1 => ""
-234=> ""
alexanderbird
04 фев. 2015, в 17:30
Поделиться
код robertsd является элегантным, но для того, чтобы сделать его перспективным, измените объявление n на тип long
Если вам нужна формула, чтобы избежать макросов, вот что работает до столбца 702 включительно
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
где A1 — ячейка, содержащая номер столбца, который должен быть преобразован в буквы.
Jan Wijninckx
17 фев. 2014, в 04:18
Поделиться
Существует очень простой способ использования Excel: используйте свойство Range.Cells.Address
, таким образом:
strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)
Это вернет адрес нужного столбца в строке 1. Возьмите его 1
:
strCol = Left(strCol, len(strCol) - 1)
Обратите внимание, что это так быстро и мощно, что вы можете вернуть адреса столбцов, которые даже существуют!
Замените lngRow
на нужный номер столбца, используя свойство Selection.Column
!
flaviomorgado
29 июль 2014, в 13:45
Поделиться
Это будет работать независимо от того, какой столбец внутри вашей одной строки кода для ячейки, расположенной в строке X, в столбце Y:
Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)
Если у вас есть ячейка с уникальным именем «Cellname»:
Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
Codeplayer
05 нояб. 2014, в 18:56
Поделиться
Вот простой лайнер, который можно использовать.
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)
Он будет работать только для обозначения столбца с 1 буквой, но он хорош для простых случаев. Если вам нужно работать только для двух буквенных обозначений, вы можете использовать следующее:
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
Syd B
26 авг. 2014, в 14:46
Поделиться
Это функция, основанная на @DamienFennely answer выше. Если вы дадите мне большие пальцы, дайте ему большие пальцы!: P
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
BrettFromLA
20 март 2014, в 20:23
Поделиться
Эта формула даст столбец на основе диапазона (т.е. A1), где диапазон — это одна ячейка. Если задан диапазон нескольких ячеек, он вернет верхнюю левую ячейку. Обратите внимание: обе ссылки на ячейки должны быть одинаковыми:
MID (CELL ( «адрес», A1), 2, SEARCH ( «$», CELL ( «адрес», A1), 2) -2)
Как это устроено:
CELL («свойство», «диапазон») возвращает определенное значение диапазона в зависимости от используемого свойства. В этом случае адрес ячейки. Свойство address возвращает значение $ [col] $ [row], то есть A1 → $ A $ 1. Функция MID анализирует значение столбца между символами $.
Thom
31 янв. 2018, в 19:40
Поделиться
Здесь простая функция в Pascal (Delphi).
function GetColLetterFromNum(Sheet : Variant; Col : Integer) : String;
begin
Result := Sheet.Columns[Col].Address; // from Col=100 --> '$CV:$CV'
Result := Copy(Result, 2, Pos(':', Result) - 2);
end;
Jordi
08 сен. 2017, в 12:47
Поделиться
Function fColLetter(iCol As Integer) As String
On Error GoTo errLabel
fColLetter = Split(Columns(lngCol).Address(, False), ":")(1)
Exit Function
errLabel:
fColLetter = "%ERR%"
End Function
Krzysztof
04 март 2017, в 23:43
Поделиться
Вот поздний ответ, просто для упрощенного подхода с использованием Int()
и If
в случае столбцов с 1 символом:
Function outColLetterFromNumber(i As Integer) As String
If i < 27 Then 'one-letter
col = Chr(64 + i)
ElseIf i < 677 Then 'two-letter
col = Chr(64 + Int(i / 26)) & Chr(64 + i - (Int(i / 26) * 26))
Else 'three-letter
col = Chr(64 + Int(i / 676)) & Chr(64 + Int(i - Int(i / 676) * 676) / 26)) & Chr(64 + i - (Int(i - Int(i / 676) * 676) / 26) * 26))
End If
outColLetterFromNumber = col
End Function
ib11
28 май 2016, в 22:56
Поделиться
Далее, на основе ответа brettdj, нужно сделать ввод номера столбца опционным. Если ввод номера столбца опущен, функция возвращает букву столбца ячейки, которая вызывает функцию. Я знаю, что это также может быть достигнуто с помощью всего лишь ColumnLetter(COLUMN())
, но я подумал, что было бы хорошо, если бы оно умело это понимало.
Public Function ColumnLetter(Optional ColumnNumber As Long = 0) As String
If ColumnNumber = 0 Then
ColumnLetter = Split(Application.Caller.Address(True, False, xlA1), "$")(0)
Else
ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False, xlA1), "$")(0)
End If
End Function
Компромисс этой функции заключается в том, что она будет очень немного медленнее, чем ответ brettdj из-за теста IF
. Но это можно почувствовать, если функция многократно используется в течение очень большого количества раз.
Rosetta
19 март 2016, в 06:41
Поделиться
Решение от brettdj работает фантастически, но если вы сталкиваетесь с этим как потенциальное решение по той же причине, что и было, я думал, что предлагаю свое альтернативное решение.
Проблема, с которой я столкнулась, — это прокрутка к определенному столбцу на основе вывода функции MATCH(). Вместо того, чтобы преобразовать номер столбца в параллельную букву столбца, я решил временно переключить стиль ссылки с A1 на R1C1. Таким образом, я мог просто прокрутить до номера столбца, не зациклившись на функции VBA. Чтобы легко переключаться между двумя стилями ссылок, вы можете использовать этот код VBA:
Sub toggle_reference_style()
If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
End If
End Sub
Will Ediger
12 фев. 2015, в 19:15
Поделиться
Это только для REFEDIT… вообще использовать код uphere
короткая версия… легко читается и понимается/
он использует poz из $
Private Sub RefEdit1_Change()
Me.Label1.Caption = NOtoLETTER(RefEdit1.Value) ' you may assign to a variable var=....'
End Sub
Function NOtoLETTER(REFedit)
Dim First As Long, Second As Long
First = InStr(REFedit, "$") 'first poz of $
Second = InStr(First + 1, REFedit, "$") 'second poz of $
NOtoLETTER = Mid(REFedit, First + 1, Second - First - 1) 'extract COLUMN LETTER
End Function
Gabriel V
19 март 2016, в 18:24
Поделиться
Sub GiveAddress()
Dim Chara As String
Chara = ""
Dim Num As Integer
Dim ColNum As Long
ColNum = InputBox("Input the column number")
Do
If ColNum < 27 Then
Chara = Chr(ColNum + 64) & Chara
Exit Do
Else
Num = ColNum / 26
If (Num * 26) > ColNum Then Num = Num - 1
If (Num * 26) = ColNum Then Num = ((ColNum - 1) / 26) - 1
Chara = Chr((ColNum - (26 * Num)) + 64) & Chara
ColNum = Num
End If
Loop
MsgBox "Address is '" & Chara & "'."
End Sub
Chetan V.
04 фев. 2016, в 11:50
Поделиться
Письмо столбца из номера столбца можно извлечь, используя формулу, выполнив следующие шаги:
1. Вычислите адрес столбца с помощью формулы ADDRESS
2. Извлечь букву столбца с помощью функции MID и FIND
Пример:
1. АДРЕС (1000,1000,1)
результаты $ALL $1000
2. = MID (F15,2, FIND ( «$», F15,2) -2)
результаты ALL asuming F15 содержит результат шага 1
За один раз мы можем написать
MID (АДРЕС (1000,1000,1), 2, FIND ( «$», адрес (1000,1000,1), 2) -2)
Bhanu Sinha
22 сен. 2015, в 22:19
Поделиться
Простой способ получить имя столбца
Sub column()
cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column
End Sub
Я надеюсь, что это поможет =)
cristobal
11 нояб. 2014, в 12:37
Поделиться
как просто преобразовать в число ascii и использовать Chr() для преобразования обратно в букву?
col_letter = Chr (Selection.Column + 96)
beef_supreme
15 июль 2016, в 17:28
Поделиться
PEDRO COUTO
30 март 2016, в 10:31
Поделиться
Здесь другой способ:
{
Sub find_test2()
alpha_col = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,W,Z"
MsgBox Split(alpha_col, ",")(ActiveCell.Column - 1)
End Sub
}
Mike Powell
28 июль 2014, в 14:17
Поделиться
Ещё вопросы
- 1Как быстро получить все результаты поиска с FHIR-сервера
- 1Java: создание пользовательских наборов элементов
- 0Angularjs и Linkedin делятся
- 1как показать скрыть фрагмент?
- 0Как отформатировать дату в angularJS?
- 1Кнопки перестают работать после заполнения табличного представления из базы данных в Javafx
- 0В чем секрет привязки данных?
- 1Как установить десятичные дроби до 2 цифр в двойных? [Дубликат]
- 1PhoneGap 2.9 Android — InAppBrowser — <input type = «file»> не работает
- 1Android Jni: сбой в глобальных и локальных ссылочных переменных
- 1Как получить смс отправленное подтверждение для каждого контакта / человека в android?
- 0Как сложить количество из таблицы CodeIgniter и MySql
- 1Как ввести МАНИФЕСТ.МФ в банку
- 1Как отображать всплывающее окно Onclick только один раз
- 0Ожидаемое имя класса перед {токеном
- 0jQuery и расширение [Отправить не работает]
- 0Почему эта веб-страница не работает только в Internet Explorer?
- 0Slim Framework добавляет <? Php к ответу json
- 1Android: запись в файл в AsyncTask
- 1Обновление Android цикла TextView
- 0C ++ возвращает значение из функции
- 0PHP — Как удалить переменную страницы пагинации из URL?
- 0Microsoft C ++ исключение: std :: bad_alloc. Что может быть причиной?
- 0Исправлено отображение содержимого позиции после добавления нового сообщения (элемента)
- 0Диалог Serial Hexa (код Python для C ++ / Qt 5.0)
- 1Как включить .net framework 4.5.1 в VS 2013
- 0Как применить более одного фильтра в angularJs
- 0как остановить навигацию внутри текстового поля с помощью клавиш вверх и вниз при навигации в предложении
- 0Данные шейдера как массив символов — ошибка 0xFEEEFEEE
- 1Не получается абсолютный путь к файлу из ресурсов
- 1Поиск разных значений в словаре с одинаковым ключом в Python
- 1Интеграция TFS 2013 nUnit и разные AppDomain для каждой тестовой сборки
- 0Хороший подход для использования C ++ DLL для тестирования
- 0Фильтр CSS3: перекрытие изображений
- 0Mysql 1041 лимит запросов в php
- 0Входное значение не определено, даже если определена ng-модель
- 0Изменение размера DIV приводит к случайной вертикальной прокрутке страницы, FIX для Angular
- 1Карма — тест не будет выполнен, если я не использую браузер PhantomJS
- 0Нижняя строка текста, игнорируя высоту строки?
- 0Перетаскивание HTML-элемента в 2 деления с помощью Jquery
- 1Определите, установлено ли приложение
- 1как использовать методы в модуле, когда он назначен переменной
- 1Запрос не выполняется при добавлении параметра
- 1Существует ли максимальный размер растрового изображения при использовании getDrawingCache?
- 0как использовать show () и hide () с задержкой ()?
- 1Каково идеальное место для кэширования изображений?
- 1Код Python 3.5 / 3.6 в зависимости от порядка вставки dict
- 0ошибка: ожидаемое первичное выражение до токена ‘{‘
- 1Как использовать модуль Python Mobilenium с селеном
- 0Как я могу добавить кнопку, которая могла бы скрыть или расширить мою боковую панель страницы сообщения?