Jak zamienić numer kolumny na nazwę?

przez | 2024-01-28

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

Jeden komentarz do „Jak zamienić numer kolumny na nazwę?

  1. Piotr

    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

    Odpowiedz

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.