Funktion zum Konvertieren der Spaltennummer in Buchstaben?

143

Hat jemand eine Excel VBA-Funktion, die die Spaltenbuchstaben einer Zahl zurückgeben kann?

Beispielsweise sollte die Eingabe von 100 zurückkehren CV.

mezamorph
quelle
4
Überprüfen Sie diese Frage heraus: stackoverflow.com/questions/10106465/…
Francis Dean
@FrancisDean das ist die Umkehrung dieser Frage, die nach der Adresse von der Nummer sucht
brettdj
2
@brettdj Die verknüpfte Antwort zeigt sowohl Nummer zu Buchstabe als auch Buchstabe zu Nummer.
Francis Dean
2
@FrancisDean fair point, ich habe mir den Fragentitel im Link zu und nicht die akzeptierte Antwort angesehen
brettdj

Antworten:

211

Diese Funktion gibt den Spaltenbuchstaben für eine bestimmte Spaltennummer zurück.

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

Testcode für Spalte 100

Sub Test()
    MsgBox Col_Letter(100)
End Sub
brettdj
quelle
9
Sie können das (0)am Ende des Split-Befehls hinzufügen , wenn Sie sich eine Variablendeklaration und eine zusätzliche Codezeile sparen möchten. zBCol_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
Caltor
3
Das ist ganz richtig, aber ich fand es besser lesbar, mehrere Zeilen zu verwenden.
Brettdj
6
Warum sich in dieser Situation mit den Booleschen Parametern beschäftigen? Du kannst das:............................................. ......v = Split(Cells(1, lngCol).Address, "$")(1)
Excel Hero
1
Obwohl dies sehr alt ist, habe ich einen kleinen Zusatz - zuerst prüfen, ob die Zahl positiv ist, da sonst Fehler auftreten. wenn lngcol <= 0 dann
Selkie
1
Denken Sie bei der Verwendung von VBS daran, dass dies .Cellseine Eigenschaft von Excel ist, dh, Sie müssen sie verwenden <excel_object>.Cells(). Andernfalls wird ein Typ-Mismatch-Fehler angezeigt.
Stevoisiak
88

Wenn Sie lieber kein Bereichsobjekt verwenden möchten:

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
robartsd
quelle
1
Nicht klar, warum Sie eine längere Methode mit einer Schleife auf der Grundlage von Wenn Sie lieber kein Bereichsobjekt verwenden
möchten
29
@brettdj Ich kann mir mehrere Gründe vorstellen: 1) Diese Methode ist durch meine Tests etwa 6x schneller. 2) Sie erfordert keinen Zugriff auf die Excel-API. 3) Sie hat vermutlich einen geringeren Speicherbedarf. EDIT: Außerdem bin ich mir nicht sicher, warum ich eine Antwort kommentiert habe, die älter als ein Jahr ist: S
Blackhawk
6
Die erhöhte Geschwindigkeit hat jedoch einen Nachteil. Die Verwendung des Bereichsobjekts löst einen Fehler aus, wenn Sie eine ungültige Spaltennummer übergeben. Es funktioniert auch, wenn noch jemand Excel 2003 verwendet. Wenn Sie diese Art von Ausnahme benötigen, wählen Sie die Bereichsmethode. Ansonsten ein großes Lob an robartsd.
Ingenieur Toast
6
IF ColumnNumber <= Columns.CountEs wäre besser, Annahmen über Versionen zu vermeiden.
Brettdj
1
Ein weiterer Grund für die Verwendung dieses Codes ist, wenn Sie nicht in VBA, sondern in VB, .net usw. sind
Maury Markowitz
46

Etwas, das für mich funktioniert, ist:

Cells(Row,Column).Address 

Dadurch wird die Formatreferenz $ AE $ 1 für Sie zurückgegeben.

Damian Fennelly
quelle
1
Dies beantwortet die Frage nicht.
Pochmurnik
33

Ich bin überrascht, dass niemand vorgeschlagen hat: ** <code> </ code> <code> Spalten (</ code> *** <code> Spaltenindex </ code> *** <code>) .Adresse </ code> <code> </ code> **

  • Zum Beispiel: gibt MsgBox Columns( 9347 ).Address zurück ** <code> $ MUM: $ MUM </ code> ** .

Um NUR die Spaltenbuchstaben zurückzugeben :Split((Columns(Column Index).Address(,0)),":")(0)

  • Zum Beispiel: gibt MsgBox Split((Columns( 2734 ).Address(,0)),":")(0) zurück ** <code> DAD </ code> ** .

  Mehr Beispiele


ashleedawg
quelle
Dieser funktioniert für mich in Office 365: string col = Worksheet.Columns [column] .Address; return col.Substring (col.IndexOf (":") + 2); Aus irgendeinem Grund haben andere Ausdrücke, wie z. B. Range = Worksheet.Cells [1, Spalte], Fehler ausgelöst (entweder beim Aufruf von Cells oder beim Versuch, die Adresse zu übernehmen, kann ich mich nicht erinnern - sorry -, welche Zeilen in welche geworfen wurden spezielle Fälle.)
Sam Azer
19

Nur noch ein Weg, dies zu tun. Brettdjs Antwort ließ mich darüber nachdenken, aber wenn Sie diese Methode verwenden, müssen Sie kein Variantenarray verwenden, sondern können direkt zu einem String wechseln.

ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")

oder kann es damit etwas kompakter machen

ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")

Beachten Sie, dass dies davon abhängt, dass Sie auf Zeile 1 im Zellenobjekt verweisen.

OSUZorba
quelle
18

Und eine Lösung mit Rekursion:

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
Nikolay Ivanov
quelle
Ausschneiden und Einfügen ist perfekt, um Zahlen größer als 676 zu konvertieren. Danke!
David Krider
1
Der Rest kann niemals mehr als 26 sein. Warum also nicht eher eine ganze Zahl als eine lange?
Caltor
10
@Caltor Sofern Sie keinen besonderen Zweck für die Verwendung einer Ganzzahl haben, z. B. das Aufrufen einer API, für die beispielsweise eine erforderlich ist, sollten Sie niemals eine Ganzzahl anstelle einer Long-Zahl auswählen. VBA ist für Longs optimiert. VBA verarbeitet Longs schneller als Ganzzahlen.
Excel Hero
1
@ExcelHero Das wusste ich nicht. Benötigt ein Long nicht mehr Speicher als eine Integer?
Caltor
6
@Caltor In der Tat ist ein Long 32 Bit, während eine Integer 16 ist. Aber das spielt im modernen Computing keine Rolle. Vor 25 Jahren ... war es sehr wichtig. Aber heute (noch vor 15 Jahren) spielt der Unterschied keine Rolle.
Excel Hero
9

Dies ist mithilfe einer Formel möglich:

=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")

und kann so wie gewünscht auch als VBA-Funktion geschrieben werden:

Function ColName(colNum As Integer) As String
    ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
Alistair Collins
quelle
8

Dies ist eine Version von Robartsds Antwort (mit dem Geschmack der einzeiligen Lösung von Jan Wijninckx ), bei der Rekursion anstelle einer Schleife verwendet wird.

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

Ich habe dies mit den folgenden Eingaben getestet:

1   => "A"
26  => "Z"
27  => "AA"
51  => "AY"
702 => "ZZ"
703 => "AAA" 
-1  => ""
-234=> ""
Alexanderbird
quelle
2
Ich habe gerade bemerkt, dass dies im Wesentlichen die gleiche ist wie die von Nikolay Ivanov, was meine etwas weniger neu macht. Ich werde es weglassen, weil es einen etwas anderen Ansatz für einige der Minutien zeigt
Alexanderbird
Gute Lösung aus zwei Gründen: kein Objekt verwenden (z. B. Reichweite, Zelle usw.); sehr kompakte Definition.
Geliebt.von.Jesus
8

robertsds code ist elegant, aber um ihn zukunftssicher zu machen, ändern Sie die Deklaration von n in type long

Wenn Sie möchten, dass eine Formel Makros vermeidet, funktioniert dies bis einschließlich Spalte 702

=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)

Dabei ist A1 die Zelle mit der Spaltennummer, die in Buchstaben umgewandelt werden soll.

Jan Wijninckx
quelle
7

NEUESTES UPDATE : Bitte ignorieren Sie die folgende Funktion. @SurasinTancharoen hat es geschafft, mich darauf aufmerksam zu machen, dass es bei defekt ist n = 53.
Für diejenigen, die interessiert sind, sind hier andere gebrochene Werte direkt unten n = 200:

Bestimmte Werte von

Bitte benutzen Sie die @ Brettdj-Funktion für alle Ihre Bedürfnisse. Es funktioniert sogar für Microsoft Excel neueste maximale Anzahl von Spalten Limit: 16384sollte gebenXFD

Geben Sie hier die Bildbeschreibung ein

ENDE DES UPDATE


Die folgende Funktion wird von Microsoft bereitgestellt:

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

Quelle: So konvertieren Sie Excel-Spaltennummern in alphabetische Zeichen

GILT FÜR

  • Microsoft Office Excel 2007
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
mtbink.com
quelle
2
Als Referenz kotzt dies mit größeren Spaltensätzen, da Chr () große Zahlen nicht gut handhabt.
Azuvector
2
Dies hat einen Fehler. Versuchen Sie es mit ConvertToLetter (53), das eigentlich 'BA' sein sollte, aber es wird fehlschlagen.
Surasin Tancharoen
@ SurasinTancharoen Vielen Dank, dass Sie diesen Fehler festgestellt haben. Ich hätte nie gedacht, dass Microsoft eine kaputte Funktion bereitstellen würde, da sie selbst Microsoft Excel erstellt haben. Ich werde diese Funktion von nun an aufgeben und die @ Brettdj-Funktion verwenden, die sogar bis zur neuesten maximalen Anzahl von Spalten in Microsoft Excel korrigiertCol_Letter(16384) = "XFD"
mtbink.com
4
Und woher kommt diese "Division durch 27"? Zuletzt habe ich überprüft, ob es 26 Buchstaben gibt. Deshalb bricht dieser Code.
ib11
5

Dies ist eine Funktion, die auf der obigen Antwort von @ DamienFennelly basiert . Wenn du mir einen Daumen hoch gibst, gib ihm auch einen Daumen hoch! : P.

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function
BrettFromLA
quelle
2
Gut, aber wie unterscheidet es sich von der akzeptierten Antwort?
Ioannis
@loannis Ich habe meine auf DamianFennellys Antwort gestützt, nicht auf die akzeptierte. Aber ja, meine Antwort sieht der akzeptierten Antwort sehr ähnlich, außer dass eine Zeile zweigeteilt ist, um sie besser lesbar zu machen.
BrettFromLA
3

Es gibt eine sehr einfache Möglichkeit, Excel Power zu verwenden: Verwenden Sie die Range.Cells.AddressEigenschaft folgendermaßen:

strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)

Dies gibt die Adresse der gewünschten Spalte in Zeile 1 zurück. Nehmen Sie sie von 1:

strCol = Left(strCol, len(strCol) - 1)

Beachten Sie, dass es so schnell und leistungsstark ist, dass Sie sogar vorhandene Spaltenadressen zurückgeben können!

Ersetzen Sie lngRowdie gewünschte Spaltennummer durch Selection.ColumnEigenschaft!

Flaviomorgado
quelle
2

Hier ist ein einfacher Einzeiler, der verwendet werden kann.

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)

Es funktioniert nur für eine Spaltenbezeichnung mit 1 Buchstaben, ist aber für einfache Fälle hilfreich. Wenn Sie es benötigen, um ausschließlich für 2 Buchstabenbezeichnungen zu arbeiten, können Sie Folgendes verwenden:

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
Syd B.
quelle
2

Dies funktioniert unabhängig davon, welche Spalte in Ihrer einen Codezeile für Zellen in Zeile X in Spalte Y enthalten ist:

Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)

Wenn Sie eine Zelle mit dem eindeutigen definierten Namen "Cellname" haben:

Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
Codeplayer
quelle
1

Die Lösung von brettdj funktioniert fantastisch, aber wenn Sie aus dem gleichen Grund wie ich auf eine mögliche Lösung stoßen, dachte ich, ich würde meine alternative Lösung anbieten.

Das Problem, das ich hatte, war das Scrollen zu einer bestimmten Spalte basierend auf der Ausgabe einer MATCH () - Funktion. Anstatt die Spaltennummer parallel in den Spaltenbuchstaben umzuwandeln, habe ich den Referenzstil vorübergehend von A1 auf R1C1 umgeschaltet. Auf diese Weise konnte ich einfach zur Spaltennummer scrollen, ohne mit einer VBA-Funktion herumspielen zu müssen. Mit diesem VBA-Code können Sie problemlos zwischen den beiden Referenzstilen wechseln:

Sub toggle_reference_style()

If Application.ReferenceStyle = xlR1C1 Then
  Application.ReferenceStyle = xlA1
Else
  Application.ReferenceStyle = xlR1C1
End If

End Sub
Will Ediger
quelle
1

Nach der Antwort von brettdj ist hier die Eingabe der Spaltennummer optional. Wenn die Eingabe der Spaltennummer weggelassen wird, gibt die Funktion den Spaltenbuchstaben der Zelle zurück, die die Funktion aufruft. Ich weiß, dass dies auch nur mit erreicht werden kann ColumnLetter(COLUMN()), aber ich dachte, es wäre schön, wenn es das klug verstehen könnte.

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

Der Nachteil dieser Funktion ist, dass sie aufgrund des IFTests sehr, sehr etwas langsamer als die Antwort von brettdj wäre . Dies ist jedoch zu spüren, wenn die Funktion sehr oft wiederholt verwendet wird.

Rosetta
quelle
1

Hier ist eine späte Antwort, nur für vereinfachenden Ansatz mit Int()und Ifbei 1-3 Zeichenspalten:

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
ib11
quelle
1
Function fColLetter(iCol As Integer) As String
  On Error GoTo errLabel
  fColLetter = Split(Columns(lngCol).Address(, False), ":")(1)
  Exit Function
errLabel:
  fColLetter = "%ERR%"
End Function
Krzysztof
quelle
1

Hier eine einfache Funktion in Pascal (Delphi).

function GetColLetterFromNum(Sheet : Variant; Col : Integer) : String;
begin
  Result := Sheet.Columns[Col].Address;  // from Col=100 --> '$CV:$CV'
  Result := Copy(Result, 2, Pos(':', Result) - 2);
end;
Jordi
quelle
1

Diese Formel gibt die Spalte basierend auf einem Bereich (dh A1 ) an, wobei der Bereich eine einzelne Zelle ist. Wenn ein Bereich mit mehreren Zellen angegeben wird, wird die Zelle oben links zurückgegeben. Beachten Sie, dass beide Zellreferenzen identisch sein müssen:

MID (CELL ("Adresse", A1 ), 2, SEARCH ("$", CELL ("Adresse", A1 ), 2) -2)

Wie es funktioniert:

CELL ("Eigenschaft", "Bereich") gibt abhängig von der verwendeten Eigenschaft einen bestimmten Wert des Bereichs zurück. In diesem Fall die Zellenadresse. Die Adresseigenschaft gibt einen Wert $ [col] $ [row] zurück, dh A1 -> $ A $ 1. Die MID-Funktion analysiert den Spaltenwert zwischen den $ -Symbolen.

Thom
quelle
0

Einfacher Weg, um den Spaltennamen zu erhalten

Sub column()

cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column

End Sub

Ich hoffe es hilft =)

cristobal
quelle
0
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
Chetan V.
quelle
0

Ich bin also zu spät zur Party hier, aber ich möchte eine weitere Antwort beisteuern, die noch niemand angesprochen hat und die keine Arrays beinhaltet. Sie können dies mit einer einfachen String-Manipulation tun.

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

Nachdem Sie die Eingabe im Format vorgenommen haben $A$1, verwenden Sie die MidFunktion, beginnen Sie an Position 2, um die erste zu berücksichtigen $, und ermitteln Sie dann, wo die zweite $in der Zeichenfolge mit angezeigt wird InStr, und subtrahieren Sie dann 2, um diese Startposition zu berücksichtigen.

Dies gibt Ihnen den Vorteil, dass Sie für die gesamte Palette möglicher Spalten anpassbar sind. Gibt daher ColLetter(1)"A" und ColLetter(16384)"XFD" zurück, die letzte mögliche Spalte für meine Excel-Version.

Strandläufer
quelle
-1

Der Spaltenbuchstabe aus der Spaltennummer kann mithilfe der Formel wie folgt extrahiert werden:
1. Berechnen Sie die Spaltenadresse mithilfe der ADRESS-Formel.
2. Extrahieren Sie den Spaltenbuchstaben mit der Funktion MID und FIND.

Beispiel:
1. ADRESSE (
1000, 1000,
1 ) Ergebnisse $ ALL $ 1000 2 . = MID (F15,2, FIND ("$", F15,2) -2)
Ergebnisse ALL asuming F15 enthält das Ergebnis von Schritt 1.

Auf einmal können wir
MID (ADDRESS (1000,1000,1), 2, FIND schreiben ("$", ADRESSE (1000, 1000, 1), 2) -2)

Bhanu Sinha
quelle
-1

Dies ist nur für REFEDIT. Verwenden Sie im Allgemeinen den Code in Kürze. Einfach zu lesen und zu verstehen. Verwenden Sie poz von $

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
Gabriel V.
quelle
-2

Wie wäre es, wenn Sie einfach in die ASCII-Zahl konvertieren und Chr () verwenden, um wieder in einen Buchstaben zu konvertieren?

col_letter = Chr (Selection.Column + 96)

Rindfleisch_supreme
quelle
-6

Hier ist ein anderer Weg:

{

      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

}
Mike Powell
quelle
1
Sie müssen keine Zeichenfolge erstellen, in der die Buchstaben des Alphabets aufgelistet sind. ASCII hat das im Wesentlichen für uns getan.
Caltor