Функция для преобразования номера столбца в букву?
есть ли у кого-нибудь функция Excel VBA, которая может возвращать буквы столбцов из числа?
, введя 100 должен возвратитьCV
. 27 ответов
эта функция возвращает букву столбца для данного столбца.
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
Если вы не хотите использовать объект диапазона:
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
и решение с использованием рекурсии:
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
еще один способ сделать это. ответ Brettdj заставил меня задуматься об этом, но если вы используете этот метод, вам не нужно использовать массив вариантов, вы можете перейти непосредственно к строке.
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "", "")
или может сделать его немного более компактным с этим
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "", "")
обратите внимание, что это зависит от ссылки на строку 1 в объекте cells.
-
например:
MsgBox Columns( 9347 ).Address
возвращает .
вернуться только буква столбца(s):Split((Columns(
Column Index
).Address(,0)),":")(0)
-
например:
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
возвращает .
это доступно с помощью формулы:
=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
ОБНОВЛЕНИЕ: Пожалуйста, игнорируйте функцию ниже, @SurasinTancharoen удалось предупредить меня, что он сломан на n = 53
.
Для тех, кто заинтересован, вот другие сломанные значения чуть ниже n = 200
:
КОНЕЦ ОБНОВЛЕНИЯ
функция ниже предоставляется корпорацией Майкрософт:
Function ConvertToLetter(iCol As Integer) As String
Dim iAlpha As Integer
Dim iRemainder As Integer
iAlpha = Int(iCol / 27)
iRemainder = iCol - (iAlpha * 26)
If iAlpha > 0 Then
ConvertToLetter = Chr(iAlpha + 64)
End If
If iRemainder > 0 Then
ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
End If
End Function
источник: как преобразовать номера столбцов Excel в алфавитные символы
ОТНОСИТСЯ К
- Microsoft Office Excel 2007
- Microsoft Excel 2002 Standard Edition
- Microsoft Excel 2000 Стандартное Издание
- Microsoft Excel 97 Standard Edition
Это версия ответ robartsd (со вкусом Ян 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=> ""
robertsd код элегантен, но чтобы сделать его устойчивым к будущему, измените объявление n на тип long
Если вы хотите, чтобы формула избегала макросов, вот что работает до столбца 702 включительно
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
где A1-ячейка, содержащая номер столбца для преобразования в буквы.
существует очень простой способ использования Excel power: Use Range.Cells.Address
собственность, таким образом:
strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)
это вернет адрес нужного столбца в строке 1. Возьмите его из 1
:
strCol = Left(strCol, len(strCol) - 1)
обратите внимание, что он настолько быстрый и мощный, что вы можете возвращать адреса столбцов, которые даже существуют!
заменить lngRow
для нужного номера столбца с помощью Selection.Column
собственность!
здесь простой один вкладыш который можно использовать.
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)
он будет работать только для обозначения столбца с 1 буквой, но это хорошо для простых случаев. Если вам нужно, чтобы он работал исключительно для 2 буквенных обозначений, то вы можете использовать следующее:
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
это будет работать независимо от того, какой столбец внутри вашей одной строки кода для ячейки, расположенной в строке 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)
Это функция, основанная на @DamienFennelly это выше. Если ты поднимешь большой палец, подними и его тоже! : P
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
решение от brettdj работает фантастически, но если вы сталкиваетесь с этим как с потенциальным решением по той же причине, что и я, я думал, что предложу свое альтернативное решение.
проблема, с которой я столкнулся, заключалась в прокрутке до определенного столбца на основе вывода функции MATCH (). Вместо преобразования номера столбца в параллельную букву столбца я решил временно переключить ссылочный стиль с A1 на R1C1. Таким образом, я мог бы просто прокрутить до столбца номер без необходимости muck с функцией VBA. Чтобы легко переключаться между двумя ссылочными стилями, вы можете использовать этот код VBA:
Sub toggle_reference_style()
If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
End If
End Sub
далее по ответу 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 из-за
вот поздний ответ, просто для упрощенного подхода с использованием Int()
и If
в случае 1-3 столбцы символов:
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
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
здесь простая функция в 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;
эта формула даст столбец на основе диапазона (т. е. A1), где range-одна ячейка. Если задан диапазон нескольких ячеек, он вернет верхнюю левую ячейку. Обратите внимание, что обе ссылки на ячейки должны быть одинаковыми:
MID (ячейка ("адрес",A1),2,Поиск("$",ячейка("адрес",A1),2)-2)
Как работает:
ячейка ("свойство", "диапазон") возвращает определенное значение диапазона в зависимости от используемого свойства. В этом деле адрес ячейки. Свойство address возвращает значение $[col]$[row], т. е. A1 -> $A$1. Функция MID анализирует значение столбца между символами$.
простой способ получить имя столбца
Sub column()
cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column
End Sub
надеюсь, это поможет =)
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
буква столбца из номера столбца может быть извлечена с помощью формулы, выполнив следующие шаги
1. Вычислите адрес столбца, используя формулу адреса
2. Извлеките букву столбца с помощью MID и найдите функцию
Пример:
1. Адрес(1000,1000,1)
результаты $всего 1000$
2. =MID (F15,2,FIND ("$", F15,2)-2)
результаты все asuming F15 содержит результат шага 1
За один раз мы можем написать
MID (АДРЕС (1000,1000,1), 2, НАЙТИ ( " $ " , АДРЕС(1000,1000,1),2)-2)
это только для 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
Cap a равен 65 так:
MsgBox Chr(ActiveCell.Column + 64)
найдено в: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
Как насчет простого преобразования в ascii-номер и использования Chr() для преобразования обратно в букву?
col_letter = Chr (Selection.Колонки + 96)
вот еще один способ:
{
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
}