Хтось має функцію 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
}