Alxb82 Пользователь Сообщений: 6 |
Здравствуйте. Подскажите пожалуйста, как, не используя VBS определить буквенное имя столбца ячейки. Решено: Изменено: Alxb82 — 13.10.2014 19:56:07 |
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для 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 Пользователь Сообщений: 14181 Профессиональная разработка приложений для 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 Видимо, самое элегантное решение это:
где из строки адреса «строкастолбец» просто удаляется «строка» и остается «столбец».
тоже абсолютно рабочий вариант решения. |
||||
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.
Вы можете использовать функции ROW
и COLUMN
для этого. Если вы опустите аргумент для этих формул, используется текущая ячейка. Их можно напрямую использовать с функцией OFFSET
или любой другой функцией, в которой вы можете указать как строку, так и столбец в виде числовых значений.
Например, если вы введете =ROW()
в ячейку D8, будет возвращено значение 8. Если вы введете =COLUMN()
в той же ячейке, возвращается значение 4.
Если вам нужна буква столбца, вы можете использовать функцию CHAR
. Я не рекомендую использовать буквы для представления столбца, поскольку при переходе к двухбуквенным именам столбцов все становится сложнее (где использование цифр в любом случае более логично).
В любом случае, если вы все еще хотите получить букву столбца, вы можете просто добавить 64 к номеру столбца (64 — на один символ меньше, чем A
), поэтому в предыдущем примере, если вы установите значение ячейки =CHAR(COLUMN()+64)
, возвращаемое значение будет D
Если вы хотите, чтобы значением ячейки была сама ячейка, полная формула была бы =CHAR(COLUMN()+64) & ROW()
.
Просто к вашему сведению, я получил 64 из таблицы ASCII. Вы также можете использовать формулу CODE
, поэтому обновленная формула с использованием этого будет =CHAR(COLUMN() + CODE("A") - 1)
. Вы должны вычесть 1, так как минимальное значение COLUMN
всегда равно 1, а затем минимальное возвращаемое значение всей формулы будет B
Однако это не будет работать с двухбуквенными столбцами. В этом случае вам потребуется следующая формула для правильного анализа двухбуквенных столбцов:
=IF(COLUMN()>26,IF(RIGHT(CHAR(IF(MOD(COLUMN()-1,26)=0,1,MOD(COLUMN()-1,26))+64),1)="Y",CHAR(INT((COLUMN()-1)/26)+64) & "Z",CHAR(INT((COLUMN()-1)/26)+64) & CHAR(IF(MOD(COLUMN(),26)=0,1,MOD(COLUMN(),26))+64)),CHAR(COLUMN()+64))&ROW()
Я не уверен, есть ли более простой способ сделать это или нет, но я знаю, что работает от ячейки A1
до ZZ99
без проблем. Однако это иллюстрирует, почему лучше избегать использования буквенных идентификаторов столбцов и придерживаться формул, основанных исключительно на числах (например, используя номер столбца вместо буквы с OFFSET
).
Доброго времени суток всем,
Долго лопатил ваш сайт, но к сожалению ничего похожего на нужный мне ответ пока не нашел.. Поэтому, прошу меня простить если такой вопрос уже встречался:
Как по минимальному значению одной ячейки, вывести название столбца (в другой ячейке), откуда было взято это значение?
Пример из файла:
В колонке «Best Rate» из прикрепленного файла указано наименьшее значение строки относительно определенного парамета (20s, 40s, 40hc).
Т.е. если в ячейке D3 значение = 2200 (20s, название NYK), то как в ячейке A3 вывести название к которому это значение принадлежит (в данном случае NYK)?
Заранее всем низкий поклон за помощь..
Доброго времени суток всем,
Долго лопатил ваш сайт, но к сожалению ничего похожего на нужный мне ответ пока не нашел.. Поэтому, прошу меня простить если такой вопрос уже встречался:
Как по минимальному значению одной ячейки, вывести название столбца (в другой ячейке), откуда было взято это значение?
Пример из файла:
В колонке «Best Rate» из прикрепленного файла указано наименьшее значение строки относительно определенного парамета (20s, 40s, 40hc).
Т.е. если в ячейке D3 значение = 2200 (20s, название NYK), то как в ячейке A3 вывести название к которому это значение принадлежит (в данном случае NYK)?
Заранее всем низкий поклон за помощь.. dansant
Сообщение Доброго времени суток всем,
Долго лопатил ваш сайт, но к сожалению ничего похожего на нужный мне ответ пока не нашел.. Поэтому, прошу меня простить если такой вопрос уже встречался:
Как по минимальному значению одной ячейки, вывести название столбца (в другой ячейке), откуда было взято это значение?
Пример из файла:
В колонке «Best Rate» из прикрепленного файла указано наименьшее значение строки относительно определенного парамета (20s, 40s, 40hc).
Т.е. если в ячейке D3 значение = 2200 (20s, название NYK), то как в ячейке A3 вывести название к которому это значение принадлежит (в данном случае NYK)?
Заранее всем низкий поклон за помощь.. Автор — dansant
Дата добавления — 28.05.2012 в 01:00
Источник
Excel название столбца по значению
В этом руководстве мы будем искать определенное значение в строках диапазона данных, а затем возвращать соответствующий заголовок столбца соответствующей ячейки строки.
Получить заголовок столбца на основе определенного значения строки с формулой
Чтобы получить заголовок столбца на основе определенного значения строки в Excel, вам может помочь приведенная ниже формула.
1. Выберите пустую ячейку для вывода заголовка, скопируйте в нее формулу ниже и нажмите Enter ключ, чтобы получить соответствующий заголовок.
=INDEX($C$2:$G$2,SUMPRODUCT(MAX(($C$3:$G$6=I3)*(COLUMN($C$3:$G$6))))-COLUMN($C$2)+1)
Примечание: В формуле $ C $ 2: $ G $ 2 это диапазон заголовка, $ C $ 3: $ G $ 6 содержит ли диапазон конкретное значение, в котором вы будете искать, I3 — это ячейка, содержащая значение критерия, которое вы найдете в диапазоне $ C $ 3: $ G $ 6, а $ C $ 2 — это первый столбец диапазона $ C $ 3: $ G $ 6. Пожалуйста, измените их под свои нужды.
Статьи по теме
Значение Vlookup и возврат true или false / да или нет в Excel
Чтобы vlookup значения в списке и отображать True / False или Yes / No для результата, метод, описанный в этой статье, окажет вам услугу.
вернуть значение в другой ячейке, если ячейка содержит определенный текст в Excel
Предположим, что ячейка E6 содержит значение «Да», ячейка F6 будет автоматически заполнена значением «одобрить». Если вы изменили «Да» на «Нет» или «Нейтральность» в E6, значение в F6 будет немедленно изменено на «Отклонить» или «Пересмотреть». Как вы можете этого добиться? В этой статье собраны некоторые полезные методы, которые помогут вам легко решить эту проблему.
Источник
Функция СТОЛБЕЦ в Excel и полезные примеры ее использования
Функция СТОЛБЕЦ в Excel возвращает номер столбца на листе по заданным условиям. Синтаксис элементарный: всего один аргумент. Но с ее помощью можно эффективно решать разнообразные задачи.
Описание и синтаксис функции
Функция с параметром: = СТОЛБЕЦ (С3) возвращает значение 3, т.к. (C) является третьим по счету.
Аргумент «ссылка» необязательный. Это может быть ячейка или диапазон, для которого нужно получить номер столбца.
Аргумент – ссылка на ячейку:
Функция выдала номер колонки для этой ячейки.
Функция вернула номер столбца, в котором находится.
Аргумент – вертикальный диапазон ячеек:
Функция вернула номер столбца, в котором расположен диапазон.
Аргумент – горизонтальный диапазон ячеек:
Функция СТОЛБЕЦ вернула номер крайнего левого столбца (А) в указанном диапазоне. Если выделить формулу в строке формул и нажать кнопку F9, то программа выдаст все номера столбцов заданного диапазона.
Но при нажатии кнопки Enter в ячейке с формулой отобразится только номер крайнего левого столбца.
Чтобы на листе появились номера всех столбцов диапазона, который является аргументом функции СТОЛБЕЦ, нужно использовать формулу массива. Выделяем такое количество ячеек, сколько элементов входит в горизонтальный диапазон. Вводим формулу и нажимаем сочетание кнопок Ctrl + Shift + Enter.
Аргумент – ссылка на горизонтальный массив:
Формула вернула номера столбцов в виде горизонтального массива.
В качестве аргумента нельзя применять ссылки на несколько областей.
Полезные примеры функции СТОЛБЕЦ в Excel
Формула с использованием функции выдает массив последовательных чисел. Эту особенность можно применить для решения других задач.
Например, рассчитаем значение выражения 1 + ½ + 1/3. Используем формулу: =СУММПРОИЗВ(1/СТОЛБЕЦ(A2:C2)).
Выполним более сложные манипуляции с числовым рядом: найдем сумму значений от 1 до 1/n^3, где n = 6. Формула расчета: =СУММПРОИЗВ(1/СТОЛБЕЦ(A9:F9)^3).
Чаще всего данную функцию используют совместно с функцией ВПР. Задача первой функции – указать номер столбца возвращаемых значений. Такое совмещение удобно при работе с огромными таблицами. Например, пользователь помещает возвращаемые данные в табличку с такой же, как в исходной таблице, последовательностью столбцов. Причем обе таблицы достаточно широкие.
Напомним, что ВПР ищет заданное значение в крайнем левом столбце диапазона и возвращает значение из другого столбца в той же строке. Говоря техническим языком, ВПР находит в базе данных уникальный идентификатор и извлекает связанную с ним информацию.
Аргументы функции ВПР: искомое значение, массив данных для анализа, номер столбца, интервальный просмотр (точный или приблизительный поиск). Сам номер можно задать с помощью такой формулы: =ВПР(8;A1:C10;СТОЛБЕЦ(C1);ИСТИНА).
При работе с широкими таблицами можно просто копировать функцию ВПР по горизонтали. В этом случае номера столбцов автоматически пересчитываются – табличка заполняется.
Нужна корректировка номера– прибавляем или отнимаем определенную цифру или рассчитанное с помощью какой-либо функции значение. Например,
Функция СТОЛБЕЦ должна вычесть 1 из номера колонки C. Поэтому функция ВПР возвращает значение не из третьего, а из второго столбца девятой строки.
Теперь проиллюстрируем, как работает многоразовое копирование без необходимости в ручной правке. Сначала в формуле закрепим ссылки на таблицу (кнопка F4). Скопируем формулу ВПР поперек столбцов – номер меняется автоматически (функция СТОЛБЕЦ сдвигается вместе с другими ссылками).
Достаточно элегантное решение, позволяющее править формулы в автоматическом режиме.
Источник
Excel название столбца по значению
Вернуть название столбца из таблицы |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить | ||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Еще одна статья по мотивам комментариев к статье «Конвертация числа в различные системы исчисления в 1С» (спасибо пользователю kuzyara).
Функции для получения имени и номера столбцов Excel в 1С.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
&НаКлиенте Функция ExcelColumnNameToNumber(тИмяКолонки) тЛатАлфавит = «ABCDEFGHIJKLMNOPQRSTUVWXYZ»; тДлинаНомера = СтрДлина(тИмяКолонки); тНомерКолонки = 0; Для тСчет = 1 По тДлинаНомера Цикл тПоз = Найти(тЛатАлфавит, Сред(тИмяКолонки, (тДлинаНомера + 1 — тСчет), 1)); тНомерКолонки = тНомерКолонки + тПоз * Pow(26, тСчет — 1); КонецЦикла; Возврат тНомерКолонки; КонецФункции &НаКлиенте Функция NumberToExcelColumnName(Знач тНомерКолонки) тЛатАлфавит = «ABCDEFGHIJKLMNOPQRSTUVWXYZ»; тИмяКолонки = «»; Пока тНомерКолонки > 0 Цикл тОстаток = (тНомерКолонки — 1)%26; тБуква = Сред(тЛатАлфавит, тОстаток + 1, 1); тИмяКолонки = тБуква + тИмяКолонки; тНомерКолонки = Цел((тНомерКолонки — тОстаток)/26); КонецЦикла; Возврат тИмяКолонки; КонецФункции |
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Загрузка…
Эта функция возвращает букву столбца для заданного номера столбца.
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
Поделиться
Ещё вопросы
- 0Как сгруппировать данные по внешнему виду в заранее заданные сегменты в MYSQL
- 0jQuery — возобновить анимацию
- 0Перетащите папки с помощью перетаскиваемых и сбрасываемых функций jquery
- 0Как удалить / улучшить / изменить форму отправки данных, используя стандартное событие отправки и jquery, до фактической отправки?
- 1Дифференцирующие линии на графике
- 0Как показать процедуру создания другим пользователем?
- 1Pandas DataFrame Advanced Indexing
- 0получить ошибку в применении фильтрации в opencv
- 0Как ng-повторить массив внутри td, чтобы td содержал все значения массива
- 0Jquery, устанавливающий transform-origin в центр
- 1Запрет наследования web.config для конкретного приложения в IIS
- 0Изменение SourceRect для отсчета вперед и назад через спрайт
- 1Используйте JavaScript для фонового изображения
- 0Синхронизация двух таймеров (setInterval)
- 0Неразрешенный внешний символ при создании объекта
- 0Вызов функции IBM MQ Callback ожидает выполнения какой-либо работы
- 0добавить границу для элемента меню li
- 0Rapidxml и начальные теги
- 1Flash-сообщения Node.js не отображаются на странице
- 0Как соединить две базы данных MySQL в PHP с помощью класса
- 1Facebook MultiLogin в Android Webview
- 0Как AngularJS справляется с памятью
- 0отменять привязку обработчиков событий во время выполнения ajax
- 1Текстовое представление показывает арабское предложение отключенным способом
- 1В Java (7), как получить значение аннотированного поля
- 1Ошибка 500 при создании проблемы в jira с использованием python
- 1Android BroadCastReceiver и событие android.intent.action.PHONE_STATE
- 1Проверьте, находится ли значение в списке в соответствующей строке в массиве numpy
- 1отправка почты без отображения почтового ящика композитора
- 0Проектирование складной адаптивной панели навигации
- 1Методы получения наиболее точного местоположения
- 0Как отфильтровать массив с другим массивом
- 0РОЛЬ Symfony FOS
- 0Angular $ http и Google Feed API
- 1Как получить запись в диапазоне дат в mongodb?
- 0DREAMFACTORY: Создать пользователя с приостановленным состоянием и активировать его с помощью пользовательского URL
- 1Модуль Es 6 загружен в Chrome, но не запущен
- 0Как мне изменить, куда указывает указатель, передавая его по ссылке?
- 0Проверьте Итеративную строку в таблице, если она пуста
- 1Может ли значение статической переменной быть обнулено системой в приложении для Android?
- 1Как решить «ValueError: попытка относительного импорта за пределы пакета верхнего уровня»
- 0C ++ сокеты WEB получают информацию с сайтов
- 1Доступ к текстовому полю html и данным меток в коде позади c #
- 1Отметить задачу как выполненную
- 0angular ng-route $ route.next для скольжения между просмотрами страниц
- 0Суммируйте 1 к значению, щелкая изображение — PHP
- 0переменная не будет обновляться с помощью jquery
- 1Python AccesControl AttributeError: у объекта ‘module’ нет атрибута ‘CAPI2’
- 0jQuery Geniuses — плагины инициализации и делегирование событий
- 0Создайте абсолютный путь, используя $ _SERVER [‘DOCUMENT_ROOT’] и увеличивая уровни папок, например ../include/?