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 в объекте ячеек.
это доступно с помощью формулы:
=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. Таким образом, я мог бы просто прокрутить до столбца номер без необходимости гадить с функцией 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), где диапазон-это одна ячейка. Если задан диапазон нескольких ячеек, он вернет верхнюю левую ячейку. Обратите внимание, что обе ссылки на ячейки должны быть одинаковыми:
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(ADDRESS (1000,1000,1), 2, FIND ( " $", ADDRESS(1000,1000,1),2)-2)
это только для REFEDIT ... вообще используйте код uphere коротко версия... легко читается и понимается / его использование поз в размере
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
колпачок а равен 65 так:
MsgBox Chr(ActiveCell.Column + 64)найдено в: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
Как насчет простого преобразования в число ascii и использования Chr() для преобразования обратно в букву?
col_letter = Chr(выделение.Колонки + 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 }

.
.


Comments