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 AsLong)AsStringDim n AsLongDim c AsByteDim s AsString
n = ColumnNumber
Do
c =((n -1)Mod26)
s = Chr(c +65)& s
n =(n - c)\26LoopWhile n >0
ColumnLetter = s
EndFunction
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.
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.
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 AsInteger)AsString
ColName = Split(Worksheets(1).Cells(1, colNum).Address,"$")(1)EndFunction
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
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:
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.
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:
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:
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
EndIfEndSub
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.
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.
Hier ist eine späte Antwort, nur für vereinfachenden Ansatz mit Int()und Ifbei 1-3 Zeichenspalten:
Function outColLetterFromNumber(i AsInteger)AsStringIf i <27Then'one-letter
col = Chr(64+ i)ElseIf i <677Then'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))EndIf
outColLetterFromNumber = col
EndFunction
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;
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:
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.
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 AsLong)AsStringDim ColumnLetter AsString'Prevent errors; if you get back a number when expecting a letter, ' you know you did something wrong.If Col_Index <=0Or Col_Index >=16384Then
ColLetter =0ExitFunctionEndIf
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
EndSub
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.
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 $
PrivateSub RefEdit1_Change()Me.Label1.Caption = NOtoLETTER(RefEdit1.Value)' you may assign to a variable var=....'EndSubFunction NOtoLETTER(REFedit)Dim First AsLong, Second AsLong
First = InStr(REFedit,"$")'first poz of $
Second = InStr(First +1, REFedit,"$")'second poz of $
NOtoLETTER = Mid(REFedit, First +1, Second - First -1)'extract COLUMN LETTEREndFunction
Antworten:
Diese Funktion gibt den Spaltenbuchstaben für eine bestimmte Spaltennummer zurück.
Testcode für Spalte 100
quelle
(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:
quelle
IF ColumnNumber <= Columns.Count
Es wäre besser, Annahmen über Versionen zu vermeiden.Etwas, das für mich funktioniert, ist:
Dadurch wird die Formatreferenz $ AE $ 1 für Sie zurückgegeben.
quelle
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 .quelle
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.
oder kann es damit etwas kompakter machen
Beachten Sie, dass dies davon abhängt, dass Sie auf Zeile 1 im Zellenobjekt verweisen.
quelle
Und eine Lösung mit Rekursion:
quelle
Dies ist mithilfe einer Formel möglich:
und kann so wie gewünscht auch als VBA-Funktion geschrieben werden:
quelle
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.
Ich habe dies mit den folgenden Eingaben getestet:
quelle
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
Dabei ist A1 die Zelle mit der Spaltennummer, die in Buchstaben umgewandelt werden soll.
quelle
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
: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:
16384
sollte gebenXFD
ENDE DES UPDATE
Die folgende Funktion wird von Microsoft bereitgestellt:
Quelle: So konvertieren Sie Excel-Spaltennummern in alphabetische Zeichen
GILT FÜR
quelle
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.
quelle
Es gibt eine sehr einfache Möglichkeit, Excel Power zu verwenden: Verwenden Sie die
Range.Cells.Address
Eigenschaft folgendermaßen:Dies gibt die Adresse der gewünschten Spalte in Zeile 1 zurück. Nehmen Sie sie von
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 durchSelection.Column
Eigenschaft!quelle
Hier ist ein einfacher Einzeiler, der verwendet werden kann.
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:
quelle
Dies funktioniert unabhängig davon, welche Spalte in Ihrer einen Codezeile für Zellen in Zeile X in Spalte Y enthalten ist:
Wenn Sie eine Zelle mit dem eindeutigen definierten Namen "Cellname" haben:
quelle
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:
quelle
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.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.quelle
Hier ist eine späte Antwort, nur für vereinfachenden Ansatz mit
Int()
undIf
bei 1-3 Zeichenspalten:quelle
quelle
Hier eine einfache Funktion in Pascal (Delphi).
quelle
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.
quelle
Einfacher Weg, um den Spaltennamen zu erhalten
Ich hoffe es hilft =)
quelle
quelle
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.
Nachdem Sie die Eingabe im Format vorgenommen haben
$A$1
, verwenden Sie dieMid
Funktion, beginnen Sie an Position 2, um die erste zu berücksichtigen$
, und ermitteln Sie dann, wo die zweite$
in der Zeichenfolge mit angezeigt wirdInStr
, 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" undColLetter(16384)
"XFD" zurück, die letzte mögliche Spalte für meine Excel-Version.quelle
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)
quelle
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 $
quelle
Kappe A ist 65 also:
MsgBox Chr(ActiveCell.Column + 64)
Gefunden in: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
quelle
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)
quelle
Hier ist ein anderer Weg:
quelle