Czasami w VBA potrzebowałem zamienić numer kolumny na jej nazwę. Przykładowo pierwsza kolumna ma etykietę A, druga kolumna to B a dziesiąta to J.
Tak wiem, czasami można się odwoływać podając numer kolumny np. jeśli chcę coś wpisać do kolumny J10 to mogę napisać:
Cells(10, 10) = "Hej, tu J10!"
albo
Range("J10") = "Hej! Tu J10!!"
Ale czasem jest tak, że np. w zmiennej typu Long mam numer kolumny a muszę znać jej etykietę (bo np. mój kod w VBA tworzy jakieś formuły odwołujące się do sąsiednich komórek).
Znając kody ASCII (w skrócie każdy znak ma swój numerek zaczynając od 65 (A) kończąc na 90 (Z)) można napisać taką oto funkcję:
Function oldColumnLetter(ColumnNumber As Integer) As String
oldColumnLetter = Chr$(64 + ColumnNumber)
End Function
I w wielu sytuacjach taka funkcja się przydaje (pod warunkiem, że nigdy nie będziemy odwoływali się do dalszej niż 26 kolumna). 26 kolumna to litera Z a nasza funkcja nie obsługuje wariantu, gdzie po Z mamy AA, AB, AC itp.
Na szczęście postanowiłem poprosić ChatGPT o pomoc i wypluł mi całkiem zgrabną funkcję:
Function ColumnLetter(ByVal ColumnNumber As Integer) As String
Dim Temp As String
Temp = ""
ColumnLetter = ""
Do
Temp = Chr((ColumnNumber - 1) Mod 26 + 65) & Temp
ColumnNumber = (ColumnNumber - 1) \ 26
Loop While ColumnNumber > 0
ColumnLetter = Temp
End Function
Sub TestColumnLetter()
Dim numerKolumny As Integer
numerKolumny = 27
MsgBox "Etykieta kolumny o numerze " + CStr(numerKolumny) + ": " & ColumnLetter(numerKolumny), vbInformation
End Sub
W swoich zbiorach mam takiego hacka:
Public Function ColumnLetter(ColumnNumber As Long) As String
ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False), „$”)(0)
End Function