Hat jemand eine Excel VBA-Funktion, die die Spaltenbuchstaben einer Zahl zurückgeben kann?
Beispielsweise sollte die Eingabe von 100 zurückkehren CV
.
Hat jemand eine Excel VBA-Funktion, die die Spaltenbuchstaben einer Zahl zurückgeben kann?
Beispielsweise sollte die Eingabe von 100 zurückkehren CV
.
Antworten:
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
(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)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
eine Eigenschaft von Excel ist, dh, Sie müssen sie verwenden <excel_object>.Cells()
. Andernfalls wird ein Typ-Mismatch-Fehler angezeigt.
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
IF ColumnNumber <= Columns.Count
Es wäre besser, Annahmen über Versionen zu vermeiden.
Etwas, das für mich funktioniert, ist:
Cells(Row,Column).Address
Dadurch wird die Formatreferenz $ AE $ 1 für Sie zurückgegeben.
MsgBox Columns( 9347 ).Address
zurück .Um NUR die Spaltenbuchstaben zurückzugeben :Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
zurück .
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.
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
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
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=> ""
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.
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
:
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
Col_Letter(16384) = "XFD"
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
Es gibt eine sehr einfache Möglichkeit, Excel Power zu verwenden: Verwenden Sie die Range.Cells.Address
Eigenschaft 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 lngRow
die gewünschte Spaltennummer durch Selection.Column
Eigenschaft!
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)
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)
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
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 IF
Tests 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.
Hier ist eine späte Antwort, nur für vereinfachenden Ansatz mit Int()
und If
bei 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
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.
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
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 Mid
Funktion, 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.
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)
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
Kappe A ist 65 also:
MsgBox Chr(ActiveCell.Column + 64)
Gefunden in: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
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)
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
}