Хтось має функцію Excel VBA, яка може повернути літеру стовпця з числа?
Наприклад, введення 100 має повернутися CV
.
Хтось має функцію Excel VBA, яка може повернути літеру стовпця з числа?
Наприклад, введення 100 має повернутися CV
.
Відповіді:
Ця функція повертає літеру стовпця для заданого номера стовпця.
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
(0)
до кінця команди Спліт, якщо ви хочете зберегти собі змінну декларацію та додатковий рядок коду. напр.Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
це властивість Excel, тобто вам потрібно використовувати <excel_object>.Cells()
. В іншому випадку ви отримаєте помилку невідповідності типу.
Якщо ви бажаєте не використовувати об'єкт діапазону:
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
IF ColumnNumber <= Columns.Count
було б краще уникати припущень щодо версій.
Щось для мене працює:
Cells(Row,Column).Address
Це поверне вам посилання на формат $ AE $ 1.
MsgBox Columns( 9347 ).Address
повертає Щоб повернути ТІЛЬКІ літери ( стовпці) стовпців :Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
повертає
Ще один спосіб зробити це. Відповідь Brettdj змусила мене подумати про це, але якщо ви використовуєте цей метод, вам не доведеться використовувати масив варіантів, ви можете перейти безпосередньо до рядка.
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
або може зробити це трохи більш компактним
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
Зверніть увагу, це залежить від того, що ви посилаєтесь на рядок 1 в об'єкті комірок.
І рішення з використанням рекурсії:
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
Це доступно за допомогою формули:
=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
Це версія відповіді 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=> ""
Код Робертса є елегантним, але для того, щоб зробити його надійним , змініть декларацію n на тип long
Якщо ви хочете, щоб формула уникала макросів, ось щось працює до стовпця 702 включно
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
де А1 - комірка, що містить номер стовпця, який потрібно перетворити на літери.
ОСТАННЕ ОНОВЛЕННЯ : Будь ласка, ігноруйте функцію, подану нижче, @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 в алфавітні символи
СТОСУЄТЬСЯ
Col_Letter(16384) = "XFD"
Це функція, заснована на відповіді @ DamienFennelly вище. Якщо ви даєте мені великі пальці вгору, дайте йому і великі пальці! : P
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
Існує дуже простий спосіб використання енергії Excel: Використовуйте 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 літер, але це приємно для простих випадків. Якщо вам потрібно працювати виключно для двох літерних позначень, ви можете використовувати наступне:
ColumnLetter = Mid(Cells(Row, LastColA).Address, 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)
Рішення від 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 через це IF
тест. Але це можна відчути, якщо функцію повторно використовувати дуже велику кількість разів.
Ось пізня відповідь, просто для спрощеного підходу з використанням 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
Ця формула дасть стовпчик на основі діапазону (тобто, A1 ), де діапазон - це одна комірка. Якщо задано діапазон з декількома клітинками, він поверне комірку зліва вліво. Зауважте, обидві посилання комірок повинні бути однаковими:
MID (CELL ("адреса", A1 ), 2, ПОШУК ("$", CELL ("адреса", A1 ), 2) -2)
Як це працює:
CELL ("властивість", "діапазон") повертає конкретне значення діапазону залежно від використовуваної властивості. У цьому випадку адреса комірки. Властивість адреси повертає значення $ [col] $ [рядок], тобто A1 -> $ A $ 1. Функція MID розбирає значення стовпця між символами $.
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
Тож я запізнююсь на вечірку тут, але хочу надати ще одну відповідь, до якої ще ніхто не звертався, що не включає масиви. Зробити це можна за допомогою простої струнної маніпуляції.
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. Обчисліть адресу стовпця за допомогою формули АДРЕСА
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)
це лише для 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
Ковпачок A становить 65, так:
MsgBox Chr(ActiveCell.Column + 64)
Знайдено в: http://www.vbaexpress.com/forum/showthread.php?6103-Sol-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
}