Функція перетворення номера стовпця в букву?


143

Хтось має функцію Excel VBA, яка може повернути літеру стовпця з числа?

Наприклад, введення 100 має повернутися CV.


4
Перевірте це запитання: stackoverflow.com/questions/10106465/…
Френсіс Дін

@FrancisDean - це зворотній бік цього питання, який шукає адресу з номера
brettdj

2
@brettdj Зв'язана відповідь показує як число до букви, так і лист до числа.
Франциск Дін

2
@FrancisDean Справедлива точка, я переглянув заголовок питання за посиланням, а не на прийняту відповідь
brettdj

Відповіді:


211

Ця функція повертає літеру стовпця для заданого номера стовпця.

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

9
Ви можете додати (0)до кінця команди Спліт, якщо ви хочете зберегти собі змінну декларацію та додатковий рядок коду. напр.Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
Caltor

3
Це цілком правильно, але я вважав, що зручніше використовувати декілька рядків.
brettdj

6
Навіщо турбуватися з булевими парамами в цій ситуації. Ви можете це зробити: ............................................. ......v = Split(Cells(1, lngCol).Address, "$")(1)
Герой Excel

1
Хоча це дуже старе, у мене є незначне доповнення - спочатку перевіряю, чи число позитивне, оскільки в іншому випадку ви стикаєтесь з помилками. якщо lngcol <= 0, то
Selkie

1
Під час використання VBS пам’ятайте, що .Cellsце властивість Excel, тобто вам потрібно використовувати <excel_object>.Cells(). В іншому випадку ви отримаєте помилку невідповідності типу.
Stevoisiak

88

Якщо ви бажаєте не використовувати об'єкт діапазону:

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

1
Не зрозуміло, чому ви розмістили довший метод із циклом на основі " Якщо ви краще не використовуєте об'єкт діапазону:
brettdj

29
@brettdj Я можу уявити собі кілька причин: 1) цей метод на 6 разів швидше, проте моє тестування 2) він не вимагає доступу до Excel API 3) він, ймовірно, має менший слід пам'яті. EDIT: Також я не впевнений, чому я прокоментував відповідь старше року: S
Blackhawk

6
Однак є недолік у збільшенні швидкості. Використання об'єкта діапазону видає помилку, якщо ви переходите до недійсного номера стовпця. Він працює навіть у тому випадку, якщо хтось все ще використовує Excel 2003. Якщо вам потрібен такий виняток, перейдіть за методом діапазону. В іншому випадку, kudos to robartsd.
Інженер Тост

6
IF ColumnNumber <= Columns.Countбуло б краще уникати припущень щодо версій.
brettdj

1
Ще одна причина використовувати цей код - якщо ви не в VBA, а в VB, .net тощо.
Maury Markowitz


33

Я здивований, що ніхто не запропонував: ** <code> </code> <code> Стовпці (</code> *** <code> Індекс стовпців </code> *** <code>). Адреса </code> <код> </code> **

  • Наприклад: MsgBox Columns( 9347 ).Address повертає ** <code> $ MUM: $ MUM </code> ** .

Щоб повернути ТІЛЬКІ літери ( стовпці) стовпців :Split((Columns(Column Index).Address(,0)),":")(0)

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

  Більше прикладів



Цей варіант працює для мене в Office 365: string col = Worksheet.Columns [колонка]. Адреса; повернути col.Substring (col.IndexOf (":") + 2); Чомусь інші вирази, такі як Range = Worksheet.Cells [1, стовпець], викидали помилки (або під час виклику Cells, або коли я намагався взяти адресу, не можу пригадати - вибачте - які рядки, куди кидати, у який конкретні випадки.)
Сем Азер

19

Ще один спосіб зробити це. Відповідь Brettdj змусила мене подумати про це, але якщо ви використовуєте цей метод, вам не доведеться використовувати масив варіантів, ви можете перейти безпосередньо до рядка.

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

або може зробити це трохи більш компактним

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

Зверніть увагу, це залежить від того, що ви посилаєтесь на рядок 1 в об'єкті комірок.


18

І рішення з використанням рекурсії:

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

Вирізати та вставити ідеально для перетворення чисел, що перевищують 676. Дякую!
Девід Крідер,

1
Залишок ніколи не може бути більше 26, чому б не ціле число, а не довге?
Caltor

10
@Caltor Якщо ви не маєте спеціальних цілей для використання Integer, наприклад, виклику API, який вимагає, наприклад, ніколи не слід вибирати Integer протягом Long. VBA оптимізовано для Longs. VBA обробляє Довгі швидше, ніж цілі.
Герой Excel

1
@ExcelHero Я цього не знав. Невже довго не займає більше пам’яті, ніж цілісний?
Caltor

6
@Caltor Дійсно Довгий - 32 біта, а Цілий - 16. Але це не має значення в сучасних обчисленнях. 25 років тому ... це мало значення. Але сьогодні (навіть 15 років тому) різниця абсолютно несуттєва.
Герой Excel

9

Це доступно за допомогою формули:

=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

Це версія відповіді 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=> ""

2
Я щойно помітив, що це по суті те саме, що рішення Миколи Іванова, що робить моє трохи менш новим. Я залишу це, тому що він демонструє дещо інший підхід для деяких деталей
alexanderbird

Гарне рішення з двох причин: не використовувати жоден об'єкт (наприклад, діапазон, комірка тощо); дуже компактне визначення.
loved.by.Ісус

8

Код Робертса є елегантним, але для того, щоб зробити його надійним , змініть декларацію n на тип long

Якщо ви хочете, щоб формула уникала макросів, ось щось працює до стовпця 702 включно

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

де А1 - комірка, що містить номер стовпця, який потрібно перетворити на літери.


7

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

Певні значення

Будь ласка, використовуйте функцію @brettdj для всіх своїх потреб. Він навіть працює для Microsoft Excel останньою максимальною кількістю обмежень стовпців: 16384повинен датиXFD

введіть тут опис зображення

Кінець оновлення


Функція нижче надана корпорацією Майкрософт:

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

2
Для довідки, це тягне з більшими наборами стовпців, оскільки Chr () не справляється з великими числами.
Azuvector

2
У цьому є помилка. Спробуйте ConvertToLetter (53), який повинен був бути "BA", але він буде невдалим.
Сурасін Танчарун

@SurasinTancharoen Дуже дякую за те, що помітили цей недолік. Я ніколи не думав, що Microsoft надасть функцію зламаної роботи, оскільки саме вони створили Microsoft Excel. Я відмовлюся від цієї функції відтепер і буду використовувати функцію @brettdj, яка навіть виправляє останню максимальну кількість лімітів стовпців Microsoft ExcelCol_Letter(16384) = "XFD"
mtbink.com

4
І звідки на Землі походить цей «поділ на 27»? Останній я перевірив, що це 26 листів. Ось чому цей код порушується.
ib11

5

Це функція, заснована на відповіді @ DamienFennelly вище. Якщо ви даєте мені великі пальці вгору, дайте йому і великі пальці! : P

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

2
Хороший, але чим він відрізняється від прийнятої відповіді?
Іоанніс

@loannis Я ґрунтувався на своїй відповіді ДаміанФеннеллі, а не на прийнятій. Але так, моя схожа на прийняту відповідь, за винятком того, що один рядок розбивається на два, щоб зробити його більш зрозумілим.
BrettFromLA

3

Існує дуже простий спосіб використання енергії Excel: Використовуйте Range.Cells.Addressвластивість таким чином:

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

Це поверне адресу потрібного стовпця в рядку 1. Візьміть його з 1:

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

Зауважте, що він настільки швидкий і потужний, що ви можете повернути адреси стовпців, які навіть існують!

Замініть lngRowпотрібний номер стовпця за допомогою Selection.Columnвластивості!


2

Ось простий один вкладиш, який можна використовувати.

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

Він буде працювати лише для позначення стовпця з 1 літер, але це приємно для простих випадків. Якщо вам потрібно працювати виключно для двох літерних позначень, ви можете використовувати наступне:

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

2

Це буде працювати незалежно від того, який стовпець у вашому одному рядку коду для комірки, розташованої у рядку X, у стовпці Y:

Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)

Якщо у вас є клітинка з унікальною визначеною назвою "Назва клітини":

Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)

1

Рішення від 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

Далі на відповідь 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

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

Тут проста функція в Паскалі (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

Ця формула дасть стовпчик на основі діапазону (тобто, A1 ), де діапазон - це одна комірка. Якщо задано діапазон з декількома клітинками, він поверне комірку зліва вліво. Зауважте, обидві посилання комірок повинні бути однаковими:

MID (CELL ("адреса", A1 ), 2, ПОШУК ("$", CELL ("адреса", A1 ), 2) -2)

Як це працює:

CELL ("властивість", "діапазон") повертає конкретне значення діапазону залежно від використовуваної властивості. У цьому випадку адреса комірки. Властивість адреси повертає значення $ [col] $ [рядок], тобто A1 -> $ A $ 1. Функція MID розбирає значення стовпця між символами $.


0

Простий спосіб отримати назву стовпця

Sub column()

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

End Sub

Я сподіваюся, що це допомагає =)


0
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

Тож я запізнююсь на вечірку тут, але хочу надати ще одну відповідь, до якої ще ніхто не звертався, що не включає масиви. Зробити це можна за допомогою простої струнної маніпуляції.

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.


-1

Лист стовпця з номера стовпця можна витягти за допомогою формули, виконавши наступні кроки
1. Обчисліть адресу стовпця за допомогою формули АДРЕСА
2. Витягніть літеру стовпця за допомогою функції MID та FIND

Приклад:
1. АДРЕСА (1000,1000,1)
результати $ ALL $ 1000
2 . = MID (F15,2, FIND ("$", F15,2) -2)
результати ВСЕ припущення F15 містить результат кроку 1.

За один раз ми можемо записати
MID (ADDRESS (1000,1000,1), 2, FIND ("$", АДРЕСА (1000,1000,1), 2) -2)


-1

це лише для REFEDIT ... в основному використовуйте код коротких версій коротко версії ... легко читати і розуміти / він використовує 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


-2

як щодо просто перетворення числа ascii та використання Chr () для перетворення назад в букву?

col_letter = Chr (Вибір. Колона + 96)


-6

Ось ще один спосіб:

{

      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

}

1
Не потрібно створювати рядок із переліком букв алфавіту. ASCII по суті зробив це для нас.
Caltor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.