Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
Ну, собственно, вопрос — в заголовке… С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Не придумал ничего лучше, чем это: Sub test() Function БукваСтолбца(ByVal col As Long) As String Вопрос — а нафига это нужно? |
|
Serge Пользователь Сообщений: 11308 |
А таблицу соответствий в ВБА можно сделать? |
Nicks Пользователь Сообщений: 71 |
{quote}{login=Alex_ST}{date=10.09.2010 10:57}{thema=Как по номеру столбца узнать его букву (VBA)?}{post}Ну, собственно, вопрос — в заголовке…{/post}{/quote} |
Немного ошибся — правильно будет так: Sub test() Function БукваСтолбца(ByVal col As Long) As String |
|
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
Спасибо. С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
Спасибо большое, Учитель джедаев! С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Алексей, так может легче и быстрее методом «Find» воспользоваться? |
|
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
{quote}{login=Дъмитръ}{date=10.09.2010 11:40}{thema=}{post}… методом «Find» воспользоваться?{/post}{/quote} С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
{quote}{login=Alex_ST}{date=10.09.2010 11:20}{thema=}{post}А нужно мне это чтобы… {/post}{/quote} |
«Данные, введённые Вами в ячейку А2, не совместимы с данными, введёнными в ячейку Р5» + Юрия предложение. Кусочик примера. |
|
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
Блин… С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Алексей… Не надо: Надо так: Пятница наверное, отдыхать пора. |
|
{quote}{login=Alex_ST}{date=10.09.2010 12:09}{thema=}{post} Склероз+переклин… 2. Я вас не запутывал. |
|
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
Да, точно! С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
{quote}{login=Alex_ST}{date=10.09.2010 12:09}{thema=}{post}Мало того, что сам затупил, так ещё и Йодо запутал…{/post}{/quote} Моя реплика должна была, естественно, звучать так: Посыпаю голову пеплом и бьюсь лбом об стол (между «клавой» и мышкой, конечно). С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Ну вот, уезжаете и еще уважаемого EducatedFool обидели, хотя и ему пора отдыхать, переработался. |
|
Привет всем. Function Num2ABC(ByVal x As Long) As String Она работает в 25 раз быстрее, чем функция, основанная на Application.ConvertFormula. |
|
Somebody Пользователь Сообщений: 169 |
Узнаём имя 6-го столбца MsgBox Split(Cells(1, 6).Address, «$»)(1) P.S. Скорость не замерял |
В связи с проявленным интересом к этой теме ( http://programmersforum.ru/showthread.php?t=166788 ), выкладываю функцию для обратного преобразования, «заголовка столбца» в число. В кавычках, потому что диапазон возвращаемого числа не ограничен числом столбцов: ?ABC2Num(«a») Два варианта функции, один с разбором строки по символам, другой — через массив байт. Мой результат (Pentium M 1.6, WinXP, Office 2000): символы: 4,1875 Function ABC2Num(ByVal x As String) As Double Function ABC2Num2(x As String) As Double Sub test() |
|
nerv Пользователь Сообщений: 3071 |
Прошу прощения, а зачем оно может понадобиться?) Sub io() Sub io2() >>В кавычках, потому что диапазон возвращаемого числа не ограничен числом столбцов: |
egonomist Пользователь Сообщений: 409 |
для разнообразия немного изварщеный вариант Public Function xlsColName(j As Integer) As String osnova = 26 GoTo xlsColNameEnd xlsColNameError: End Function ‘Кол-во кругов GoTo xlsColIndexEnd xlsColIndexError: End Function |
VovaK Пользователь Сообщений: 1716 |
Нормальные герои всегда идут в обход |
tol64 Пользователь Сообщений: 99 |
А что означает (1) ? Посмотрел в справке функцию Split и не нашёл объяснения. Вот как можно было прийти к тому, что в конце нужно добавить (1), чтобы получить такое элегантное решение? ))) |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
В скобках порядковый номер элемента массива (отсчёт с нуля). |
Kuzmich Пользователь Сообщений: 7998 |
Cells(1, 6).Address будет $F$1 |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Ещё пример: |
tol64 Пользователь Сообщений: 99 |
#30 30.03.2012 19:25:52 Спасибо за примеры. То есть, если разделитель не указан, то в качестве разделителя выступает пробел, если он есть. Если же нет ни одного пробела, то в массиве один элемент. В качестве разделителей выступают любые указанные знаки. Правильно? Hello! My blog: TRADING WAY |
0 / 0 / 0 Регистрация: 13.02.2012 Сообщений: 18 |
|
1 |
|
14.02.2012, 21:04. Показов 23513. Ответов 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 |
This function returns the column letter for a given column number.
Function Col_Letter(lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function
testing code for column 100
Sub Test()
MsgBox Col_Letter(100)
End Sub
Stevoisiak
22.8k27 gold badges122 silver badges219 bronze badges
answered Oct 9, 2012 at 9:44
5
If you’d rather not use a range object:
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
answered Mar 12, 2013 at 16:37
robartsdrobartsd
1,3901 gold badge9 silver badges15 bronze badges
7
Something that works for me is:
Cells(Row,Column).Address
This will return the $AE$1 format reference for you.
answered Nov 21, 2013 at 21:00
2
- For example:
MsgBox Columns( 9347 ).Address
returns .
To return ONLY the column letter(s): Split((Columns(
Column Index
).Address(,0)),":")(0)
- For example:
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
returns .
answered Mar 30, 2018 at 15:22
ashleedawgashleedawg
20k8 gold badges73 silver badges104 bronze badges
2
And a solution using recursion:
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
answered Nov 27, 2013 at 10:31
Nikolay IvanovNikolay Ivanov
5,1191 gold badge26 silver badges22 bronze badges
5
Just one more way to do this. Brettdj’s answer made me think of this, but if you use this method you don’t have to use a variant array, you can go directly to a string.
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
or can make it a little more compact with this
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
Notice this does depend on you referencing row 1 in the cells object.
Stevoisiak
22.8k27 gold badges122 silver badges219 bronze badges
answered May 23, 2014 at 15:22
OSUZorbaOSUZorba
1,07911 silver badges13 bronze badges
0
This is available through using a formula:
=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")
and so also can be written as a VBA function as requested:
Function ColName(colNum As Integer) As String
ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
answered Dec 9, 2014 at 12:08
Alistair CollinsAlistair Collins
2,2005 gold badges25 silver badges44 bronze badges
This is a version of robartsd’s answer (with the flavor of Jan Wijninckx’s one line solution), using recursion instead of a loop.
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
I’ve tested this with the following inputs:
1 => "A"
26 => "Z"
27 => "AA"
51 => "AY"
702 => "ZZ"
703 => "AAA"
-1 => ""
-234=> ""
Stevoisiak
22.8k27 gold badges122 silver badges219 bronze badges
answered Feb 4, 2015 at 16:18
alexanderbirdalexanderbird
3,7071 gold badge24 silver badges35 bronze badges
2
robertsd’s code is elegant, yet to make it future-proof, change the declaration of n to type long
In case you want a formula to avoid macro’s, here is something that works up to column 702 inclusive
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
where A1 is the cell containing the column number to be converted to letters.
Stevoisiak
22.8k27 gold badges122 silver badges219 bronze badges
answered Feb 17, 2014 at 3:29
1
This is a function based on @DamienFennelly’s answer above. If you give me a thumbs up, give him a thumbs up too!
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
Stevoisiak
22.8k27 gold badges122 silver badges219 bronze badges
answered Mar 20, 2014 at 18:43
BrettFromLABrettFromLA
9061 gold badge7 silver badges17 bronze badges
2
There is a very simple way using Excel power: Use Range.Cells.Address
property, this way:
strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)
This will return the address of the desired column on row 1. Take it of the 1
:
strCol = Left(strCol, len(strCol) - 1)
Note that it so fast and powerful that you can return column addresses that even exists!
Substitute lngRow
for the desired column number using Selection.Column
property!
Niall
29.8k10 gold badges100 silver badges140 bronze badges
answered Jul 29, 2014 at 12:39
Here is a simple one liner that can be used.
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)
It will only work for a 1 letter column designation, but it is nice for simple cases. If you need it to work for exclusively 2 letter designations, then you could use the following:
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
answered Aug 26, 2014 at 14:15
Syd BSyd B
211 bronze badge
This will work regardless of what column inside your one code line for cell thats located in row X, in column Y:
Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)
If you have a cell with unique defined name «Cellname»:
Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
answered Nov 5, 2014 at 17:30
So I’m late to the party here, but I want to contribute another answer that no one else has addressed yet that doesn’t involve arrays. You can do it with simple string manipulation.
Function ColLetter(Col_Index As Long) As String
Dim ColumnLetter As String
'Prevent errors; if you get back a number when expecting a letter,
' you know you did something wrong.
If Col_Index <= 0 Or Col_Index >= 16384 Then
ColLetter = 0
Exit Function
End If
ColumnLetter = ThisWorkbook.Sheets(1).Cells(1, Col_Index).Address 'Address in $A$1 format
ColumnLetter = Mid(ColumnLetter, 2, InStr(2, ColumnLetter, "$") - 2) 'Extracts just the letter
ColLetter = ColumnLetter
End Sub
After you have the input in the format $A$1
, use the Mid
function, start at position 2 to account for the first $
, then you find where the second $
appears in the string using InStr
, and then subtract 2 off to account for that starting position.
This gives you the benefit of being adaptable for the whole range of possible columns. Therefore, ColLetter(1)
gives back «A», and ColLetter(16384)
gives back «XFD», which is the last possible column for my Excel version.
answered Dec 27, 2018 at 23:51
SandPiperSandPiper
2,7765 gold badges32 silver badges49 bronze badges
Easy way to get the column name
Sub column()
cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column
End Sub
I hope it helps =)
answered Nov 11, 2014 at 12:09
The solution from brettdj works fantastically, but if you are coming across this as a potential solution for the same reason I was, I thought that I would offer my alternative solution.
The problem I was having was scrolling to a specific column based on the output of a MATCH() function. Instead of converting the column number to its column letter parallel, I chose to temporarily toggle the reference style from A1 to R1C1. This way I could just scroll to the column number without having to muck with a VBA function. To easily toggle between the two reference styles, you can use this VBA code:
Sub toggle_reference_style()
If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
End If
End Sub
answered Feb 12, 2015 at 18:07
Will EdigerWill Ediger
8939 silver badges17 bronze badges
Furthering on brettdj answer, here is to make the input of column number optional. If the column number input is omitted, the function returns the column letter of the cell that calls to the function. I know this can also be achieved using merely ColumnLetter(COLUMN())
, but i thought it’d be nice if it can cleverly understand so.
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
The trade off of this function is that it would be very very slightly slower than brettdj’s answer because of the IF
test. But this could be felt if the function is repeatedly used for very large amount of times.
answered Mar 19, 2016 at 4:52
RosettaRosetta
2,6251 gold badge12 silver badges28 bronze badges
Here is a late answer, just for simplistic approach using Int()
and If
in case of 1-3 character columns:
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
answered May 28, 2016 at 21:56
ib11ib11
2,5203 gold badges21 silver badges54 bronze badges
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
answered Mar 4, 2017 at 22:36
Here, a simple function in 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;
answered Sep 8, 2017 at 11:00
JordiJordi
215 bronze badges
This formula will give the column based on a range (i.e., A1), where range is a single cell. If a multi-cell range is given it will return the top-left cell. Note, both cell references must be the same:
MID(CELL(«address»,A1),2,SEARCH(«$»,CELL(«address»,A1),2)-2)
How it works:
CELL(«property»,»range») returns a specific value of the range depending on the property used. In this case the cell address.
The address property returns a value $[col]$[row], i.e. A1 -> $A$1.
The MID function parses out the column value between the $ symbols.
answered Jan 31, 2018 at 18:49
ThomThom
212 bronze badges
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
answered Feb 4, 2016 at 11:16
Column letter from column number can be extracted using formula by following steps
1. Calculate the column address using ADDRESS formula
2. Extract the column letter using MID and FIND function
Example:
1. ADDRESS(1000,1000,1)
results $ALL$1000
2. =MID(F15,2,FIND(«$»,F15,2)-2)
results ALL asuming F15 contains result of step 1
In one go we can write
MID(ADDRESS(1000,1000,1),2,FIND(«$»,ADDRESS(1000,1000,1),2)-2)
answered Sep 22, 2015 at 20:54
Bhanu SinhaBhanu Sinha
1,51612 silver badges10 bronze badges
this is only for REFEDIT … generaly use uphere code
shortly version… easy to be read and understood /
it use poz of $
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
Tunaki
131k46 gold badges330 silver badges415 bronze badges
answered Mar 19, 2016 at 17:02
answered Mar 30, 2016 at 9:31
0
what about just converting to the ascii number and using Chr() to convert back to a letter?
col_letter = Chr(Selection.Column + 96)
answered Jul 15, 2016 at 15:41
0
Эта функция возвращает букву столбца для заданного номера столбца.
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Как включить увеличение и уменьшение масштаба с помощью прокрутки мыши на встроенной карте в формате HTML?
- 0Поиск совпадающих значений столбцов на основе имени хоста
- 0Попытка Проекта Эйлера Три
- 0Как записать выражение boost :: lambda в качестве аргумента обратного вызова функции
- 1анализ журнала разговоров в WhatsApp
- 1Использование файлов облачного хранилища Google с ноутбуком Jupyter в облачных вычислениях
- 0c ++ сериализует std :: error_code для передачи по сети или сохранения на диск?
- 0Прокрутка страницы с помощью нажатия клавиш не работает с помощью jQuery?
- 0Меню класса jQuery не отображается должным образом
- 0Как соединить две базы данных MySQL в PHP с помощью класса
- 0Действие HTML-формы, которое остается на текущей странице
- 0как перенаправить пользователя в php
- 1Создание функции Python для создания категориальных бинов в пандах
- 0Вернуть несколько строк из подзапроса
- 1Как поделиться или сохранить данные между различными исполняемыми файлами?
- 1FB sdk, requestNewPublishPermissions () не вызывает никакого обратного вызова
- 1Установите Specifc Font для TextView, независимого от устройства
- 1Переопределение `из импорта my_module…`
- 1Выявление современной культуры для Сербии
- 1Определить пакет тишины в байтовом массиве
- 1Передача системного свойства через пробел через оболочку
- 0Как правильно сделать UL LI в абсолютно позиционированном контейнере?
- 1Как использовать XSLT для преобразования узлов в C #, как в JS?
- 0переопределить FOS Bundle
- 1В ASP с VB codebehind как представить пользователю диалог да / нет от VB
- 0Angularjs — детские стульчики в директиве
- 0Доктрина 2: отношение отображения ошибок из таблиц Sql Server с пробелами в именах полей
- 1Как закрыть соединение, если оно пытается подключиться слишком долго?
- 0Инициализировать лайтбокс для тега img
- 1Объединение / Слияние каждого Json Files, python
- 0Несколько баз данных Python приводит к одному обновлению
- 1назначение объектов другому объекту в Java
- 1Чистый способ создания столбца на основе нескольких условий
- 1Ponyorm с psycopg2: сервер неожиданно закрыл соединение (время ожидания сеанса?)
- 1Android: startActivityForResult всегда имеет значение null и принудительно закрывает мое приложение
- 1C # разделить три элемента в отдельном списке выбора, чтобы отобразить каждый элемент в таблице (и добавить ссылку)
- 1Отключить использование AsyncTask, используя пользовательский AsyncTask
- 1Поиск версий подкомпонентов GlassFish
- 0Tumblr представить фото
- 0повтор не рендеринг под нагрузкой
- 1Использование оператора не похоже, чтобы избавиться от моего объекта
- 0Обновление в JPA без собственного запроса
- 0ebay api, показывающий товары из тихоокеанского магазина
- 0Доступ запрещен для пользователя » @ ‘localhost’. Попытка вставить данные PHP Mysql
- 1Совместимость Hibernate 3.3 JDK 7
- 1Как передать объект новому действию, изменить этот объект и обновить изменения в первом действии? [Дубликат]
- 1Как использовать модуль Python Mobilenium с селеном
- 0Что быстрее? Комбинированные или множественные запросы?
- 0Отображается ли id элемента управления aspx всегда одинаковым в исходном HTML-коде?
- 1Android LinearLayout не выглядит одинаково на реальном устройстве
Свойства Column и Columns объекта Range в VBA Excel. Возвращение номера первого столбца и обращение к столбцам смежных и несмежных диапазонов.
Range.Column — свойство, которое возвращает номер первого столбца в указанном диапазоне.
Свойство Column объекта Range предназначено только для чтения, тип данных — Long.
Если диапазон состоит из нескольких областей (несмежный диапазон), свойство Range.Column возвращает номер первого столбца в первой области указанного диапазона:
Range(«B2:F10»).Select MsgBox Selection.Column ‘Результат: 2 Range(«E1:F8,D4:G13,B2:F10»).Select MsgBox Selection.Column ‘Результат: 5 |
Для возвращения номеров первых столбцов отдельных областей несмежного диапазона используется свойство Areas объекта Range:
Range(«E1:F8,D4:G13,B2:F10»).Select MsgBox Selection.Areas(1).Column ‘Результат: 5 MsgBox Selection.Areas(2).Column ‘Результат: 4 MsgBox Selection.Areas(3).Column ‘Результат: 2 |
Свойство Range.Columns
Range.Columns — свойство, которое возвращает объект Range, представляющий коллекцию столбцов в указанном диапазоне.
Чтобы возвратить один столбец заданного диапазона, необходимо указать его порядковый номер (индекс) в скобках:
Set myRange = Range(«B4:D6»).Columns(1) ‘Возвращается диапазон: $B$4:$B$6 Set myRange = Range(«B4:D6»).Columns(2) ‘Возвращается диапазон: $C$4:$C$6 Set myRange = Range(«B4:D6»).Columns(3) ‘Возвращается диапазон: $D$4:$D$6 |
Самое удивительное заключается в том, что выход индекса столбца за пределы указанного диапазона не приводит к ошибке, а возвращается диапазон, расположенный за пределами исходного диапазона (отсчет начинается с первого столбца заданного диапазона):
MsgBox Range(«B4:D6»).Columns(7).Address ‘Результат: $H$4:$H$6 |
Если указанный объект Range является несмежным, состоящим из нескольких смежных диапазонов (областей), свойство Columns возвращает коллекцию столбцов первой области заданного диапазона. Для обращения к столбцам других областей указанного диапазона используется свойство Areas объекта Range:
Range(«E1:F8,D4:G13,B2:F10»).Select MsgBox Selection.Areas(1).Columns(2).Address ‘Результат: $F$1:$F$8 MsgBox Selection.Areas(2).Columns(2).Address ‘Результат: $E$4:$E$13 MsgBox Selection.Areas(3).Columns(2).Address ‘Результат: $C$2:$C$10 |
Определение количества столбцов в диапазоне:
Dim c As Long c = Range(«D5:J11»).Columns.Count MsgBox c ‘Результат: 7 |
Буква вместо номера
Если в качестве индекса столбца используется буква, она соответствует порядковому номеру этой буквы на рабочем листе:
"A" = 1;
"B" = 2;
"C" = 3;
и так далее.
Пример использования буквенного индекса вместо номера столбца в качестве аргумента свойства Columns объекта Range:
Range(«G2:K10»).Select MsgBox Selection.Columns(2).Address ‘Результат: $H$2:$H$10 MsgBox Selection.Columns(«B»).Address ‘Результат: $H$2:$H$10 |
Обратите внимание, что свойство Range("G2:K10").Columns("B")
возвращает диапазон $H$2:$H$10
, а не $B$2:$B$10
.