it-roy-ru.com

Функция для преобразования номера столбца в букву?

У кого-нибудь есть функция Excel VBA, которая может возвращать буквы столбца из числа?

Например, ввод 100 должен возвращать CV.

118
mezamorphic

Эта функция возвращает букву столбца для данного номера столбца.

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
176
brettdj

Если вы не хотите использовать объект диапазона:

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
78
robartsd

Что-то, что работает для меня:

Cells(Row,Column).Address 

Это вернет вам ссылку на формат $ AE $ 1.

40
Damian Fennelly

 I'm surprised nobody suggested: **<code></code> <code>Columns(</code>***<code>Column Index</code>***<code>).Address</code> <code></code>**

  • Например:MsgBox Columns( 9347 ).Addressвозвращает **<code>$MUM:$MUM</code>**,.

Чтобы вернуть ТОЛЬКО букву столбца (s): Split((Columns(Column Index).Address(,0)),":")(0)

  • Например:MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)возвращает **<code>DAD</code>**,.

More Examples


15
ashleedawg

Еще один способ сделать это. ответ Бреттджа заставил меня задуматься об этом, но если вы используете этот метод, вам не нужно использовать вариантный массив, вы можете перейти непосредственно к строке.

ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")

или может сделать это немного более компактным с этим

ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")

Обратите внимание, что это зависит от того, ссылаетесь ли вы на строку 1 в объекте клеток.

15
OSUZorba

И решение с использованием рекурсии:

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
14
Nikolay Ivanov

Это доступно через формулу:

=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
8
Alistair Collins

ПОСЛЕДНИЕ ОБНОВЛЕНИЯ: Пожалуйста, игнорируйте функцию ниже, @SurasinTancharoen удалось предупредить меня, что она сломана в n = 53.
Для тех, кто интересуется, вот другие сломанные значения чуть ниже n = 200:

 Certain values of

Пожалуйста, используйте функцию @brettdj для всех ваших потребностей. Это работает даже для последнего максимального числа столбцов в Microsoft Excel: 16384 должен давать XFD

 enter image description here

КОНЕЦ ОБНОВЛЕНИЯ


Функция ниже предоставлена ​​Microsoft:

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 Standard Edition
  • Microsoft Excel 97 Standard Edition
7
mtbink.com

код Робертса элегантен, но чтобы сделать его перспективным, измените объявление n на type long

Если вы хотите, чтобы формула избегала макрокоманд, вот что работает до столбца 702 включительно

=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)

где A1 - это ячейка, содержащая номер столбца, который нужно преобразовать в буквы.

6
Jan Wijninckx

Это версия robartsd's answer (с видом однострочного решения Яна Вийнинкса ), использующего рекурсию вместо цикла. 

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=> ""
6
alexanderbird

Существует очень простой способ использования Excel: используйте свойство Range.Cells.Address, например:

strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)

Это вернет адрес нужного столбца в строке 1. Возьмите его из 1:

strCol = Left(strCol, len(strCol) - 1)

Обратите внимание, что он настолько быстрый и мощный, что вы можете возвращать адреса столбцов, которые даже существуют!

Замените lngRow на нужный номер столбца, используя свойство Selection.Column!

3
flaviomorgado

Эта функция основана на ответе @ DamienFennelly выше. Если ты дашь мне большой палец, тоже подними его! :П

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function
3
BrettFromLA

Это будет работать независимо от того, какой столбец внутри одной строки кода для ячейки, расположенной в строке 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)
2
Codeplayer

Вот простой вкладыш, который можно использовать.

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)

Он будет работать только для обозначения в 1 букву, но это хорошо для простых случаев. Если вам нужно, чтобы он работал исключительно для двухбуквенных обозначений, вы можете использовать следующее:

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
2
Syd B

Эта формула даст столбец на основе диапазона (то есть, A1 ), где диапазон - это одна ячейка. Если указан диапазон из нескольких ячеек, он вернет верхнюю левую ячейку. Обратите внимание, что обе ссылки на ячейки должны быть одинаковыми:

MID (CELL («адрес», A1 ), 2, ПОИСК («$», CELL («адрес», A1 ), 2) -2)

Как это устроено:

CELL ("свойство", "диапазон") возвращает конкретное значение диапазона в зависимости от используемого свойства. В этом случае адрес ячейки . Свойство address возвращает значение $ [col] $ [row], т.е. A1 -> $ A $ 1 . Функция MID анализирует значение столбца между символами $.

1
Thom

Вот поздний ответ, только для упрощенного подхода с использованием 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
1
ib11

Решение от 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
1
Will Ediger

Здесь простая функция на Паскале (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;
1
Jordi

В продолжение ответа 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. Но это можно почувствовать, если эту функцию многократно использовать очень много раз.

1
Rosetta
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
1
Krzysztof
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
0
Chetan V.

Так что я опаздываю на вечеринку здесь, но я хочу дать еще один ответ, который еще никто не адресовал, который не связан с массивами. Вы можете сделать это с помощью простых манипуляций со строками.

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

После ввода данных в формате $A$1, используйте функцию Mid, начните с позиции 2, чтобы учесть первый $, затем найдите, где второй $ появляется в строке, используя InStr, а затем вычтите 2, чтобы учесть этот старт позиция.

Это дает вам возможность адаптироваться ко всему диапазону возможных столбцов. Следовательно, ColLetter(1) возвращает «A», а ColLetter(16384) возвращает «XFD», который является последним возможным столбцом для моей версии Excel.

0
SandPiper

Простой способ получить имя столбца

Sub column()

cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column

End Sub

Надеюсь это поможет =)

0
cristobal