In VBA wird im Allgemeinen nicht der Spaltenbuchstabe, sondern die Spaltennummer verwendet. Spalte A entspricht der Spaltennummer 1, Spalte B der Spaltennummer 2, Spalte C der Spaltennummer 3 usw.
Möchten Sie nun aus einer Spaltennummer wieder den Spaltenbuchstabe ermitteln gibt es hierfür verschiedene Ansätze, die je nach Verwendungszweck mehr oder weniger geeignet sind.
Fehlerhafter VBA Code auf der Microsoft Support Seite
Im Internet gibt es allerdings auch Lösungsansätze, die nicht ungeprüft verwendet werden sollten. So stellt z.B. selbst Microsoft auf einer Support Seite einen fehlerhaften Algorithmus für die Ermittlung des Spaltenbuchstaben vor.
Zunächst einmal ist dieser generell nur auf zwei Stellen ausgelegt. Seit der Excel 2007 sind inzwischen jedoch 16.384 Spalten bis zum Spaltenbuchstabe XFD vorhanden. Um alle Spaltenbuchstaben ermitteln zu können muss also in jedem Fall ein Algorithmus genutzt werden, der dreistellig die Spaltennummer in den jeweiligen Spaltenbuchstabe(n) umwandeln kann. Davor gab es einen Spaltenbereich der nur 256 Spalten bis Spalte IV unterstützte.
Aber auch in diesem Fall hätte der Algorithmus auf der Microsoft Seite Fehler produziert. Der erste Fehler tritt nämlich bereits bei Spalte 53 (BA) auf. Hier wirft der Microsoft Alogrithmus A[ aus. Mit jedem Durchlauf von A bis Z verschiebt sich fortan der Fehler um eine weitere Spalte (CA, CB / DA, DB, DC / EA, EB, EC, ED / …). Ab Spalte 4508 (FQJ) erzeugt das Makro dann sogar die erste Fehlermeldung.
Excel VBA Spaltenbuchstabe aus Zahl ermitteln
Nachfolgend nun zwei Lösungsvorschläge, die für alle 16.384 Spalten aus der Spaltennummer den Excel Spaltenbuchstaben ermitteln.
Variante 1
Die erste Lösung verwendet eine selbst erstellte Funktion, die anschließend im gesamten VBA Projekt über einen einfachen Aufruf der Funktion genutzt werden kann.
Function Buchstabe(iCol As Integer) As String Dim Buchstabe1 As Long, Buchstabe2 As Long, Buchstabe3 As Long If iCol < 27 Then Buchstabe1 = 0 Else Buchstabe1 = Int(((iCol - 26) / 676) - 0.0001) End If If Buchstabe1 = 0 Then Buchstabe2 = Int((iCol / 26) - 0.0001) Else Buchstabe2 = Int(((iCol / 26) - (Buchstabe1 * 26)) - 0.0001) End If Buchstabe3 = iCol - (Int((iCol / 26) - 0.0001) * 26) If Buchstabe1 > 0 Then Buchstabe = Chr(Buchstabe1 + 64) End If If Buchstabe2 > 0 Then Buchstabe = Buchstabe & Chr(Buchstabe2 + 64) End If If Buchstabe3 > 0 Then Buchstabe = Buchstabe & Chr(Buchstabe3 + 64) End If End Function
Aufgerufen werden kann die Funktion aus jeder VBA-Routine unter Anwendung von:
Buchstabe(intSpaltennummer)
intSpaltennummer ist dabei eine Integer-Variable, in der Sie die Spaltennummer übergeben wird, die dann in den jeweiligen Spaltenbuchstaben umgewandelt werden soll.
Beispiel: Welcher Spaltenbuchstabe der Spaltennummer 27 entspricht, soll in einer Messagebox angezeigt werden.
Sub SpaltenbuchstabeAusgeben()
MsgBox "Der Spaltenbuchstabe lautet: " & Buchstabe(27)
End Sub
Der Vorteil bei dieser Variante ist, dass in jeder VBA Routine eine einfache Nutzung der Funktion mit dem Aufruf Buchstabe() möglich ist und die Funktion theoretisch für alle Buchstabenkombinationen von A bis ZZZ genutzt werden kann. Zudem bleibt die VBA Routine, in die diese Funktion integriert wird, weiterhin gut lesbar.
Variante 2
Die zweite Lösung kann vollständig in das jeweilige Makro mit einem Einzeiler eingebettet werden. Der Spaltenbuchstabe wird bei dieser Lösungsvariante nicht aus der Spaltennummer errechnet, sondern über die Zelladresse ausgelesen. Die Zeilennummer spielt dabei keine Rolle. Im Beispiel wurde daher einfach immer die Zeile 1 der jeweiligen Spalte genutzt.
Mid(Cells(1, intSpaltennummer).Address(), 2, InStr(2, Cells(1, intSpaltennummer).Address(), "$") - 2)
Auch in diesem Beispiel wird in der Integer Variable intSpaltennummer wieder die Spaltennummer übergeben. Aus der Zelladresse (Spaltennummer + Zeile 1) wird dann der Teil für den Buchstabenteil ermittelt und ausgegeben.
Sub SpaltenbuchstabeAusgeben() MsgBox "Der Spaltenbuchstabe lautet: " & Mid(Cells(1, 27).Address(), 2, InStr(2, Cells(1, 27).Address(), "$") - 2) End Sub
Vorteil dieser Lösung, ist dass keine zusätzliche Funktion benötigt wird. Dafür ist der VBA-Code nicht mehr so einfach lesbar.
Von der Geschwindigkeit betrachtet, sind beide vorgestellten Varianten nahezu gleich schnell. Welche Variante den Vorzug erhält, ist daher Geschmacksache. Beide Varianten funktionieren für den gesamten Spaltenbereich A bis XFD problemlos.
Excel Mustermappe:
spaltenbuchstabe_ermitteln.xlsm
Die 2. Lösung finde ich besser.
Eine andere wäre diese hier:
Function Get_Col(r As Range) As String
Get_Col = Split(r.Address, “$”)(1)
End Function
Eine Adresse, z.B. A1 wird standardmäßig als $A$1 ermittelt.
Jetzt könnte man das 1. $ entfernen und das 2. suchen.
Die Funktion Split zerlegt einen Text in ein Array (also eine Art Feld, ähnlich wie Excel) Ich zerlege also die Adresse $A$1 in ein Array. Da 2 x ein $ enthalten ist bekomme ich ein Array mit 2 Feldern. Im 1. steht das A im 2. die 1.
Statt eine Variable zu bemühen lass ich mir nur das 1. Element zurück geben.
Testen kann man es z.B. mit
?Get_Col(Cells(5,16384))
im Direktbereich.
Die Besonderheit ist das die Zelle als Range also als Bereich also ein Zellenobjekt (etwas vereinfacht) übergeben wird.
Tolle Lösung von Werner Ebner! Sehr elegant!