Qualcuno ha una funzione VBA di Excel che può restituire le lettere della colonna da un numero?
Ad esempio, inserendo 100 dovrebbe tornare CV
.
Qualcuno ha una funzione VBA di Excel che può restituire le lettere della colonna da un numero?
Ad esempio, inserendo 100 dovrebbe tornare CV
.
Risposte:
Questa funzione restituisce la lettera della colonna per un determinato numero di colonna.
Function Col_Letter(lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function
codice di test per la colonna 100
Sub Test()
MsgBox Col_Letter(100)
End Sub
(0)
alla fine del comando Split se si desidera salvare una dichiarazione variabile e una riga di codice aggiuntiva. ad es.Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
è una proprietà di Excel, il che significa che è necessario utilizzare <excel_object>.Cells()
. In caso contrario, verrà visualizzato un errore di mancata corrispondenza del tipo.
Se preferisci non utilizzare un oggetto intervallo:
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
sarebbe meglio evitare ipotesi sulle versioni.
Qualcosa che funziona per me è:
Cells(Row,Column).Address
Questo restituirà il riferimento in formato $ AE $ 1 per te.
MsgBox Columns( 9347 ).Address
ritorni .Per restituire SOLO le lettere della colonna :Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
ritorni .
Solo un altro modo per farlo. La risposta di Brettdj mi ha fatto pensare a questo, ma se usi questo metodo non devi usare un array di varianti, puoi andare direttamente a una stringa.
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
o può renderlo un po 'più compatto con questo
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
Si noti che ciò dipende dal fatto che si fa riferimento alla riga 1 nell'oggetto celle.
E una soluzione che utilizza la ricorsione:
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
Questo è disponibile tramite una formula:
=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")
e quindi può anche essere scritto come una funzione VBA come richiesto:
Function ColName(colNum As Integer) As String
ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
Questa è una versione della risposta di robartsd (con il sapore della soluzione a una riga di Jan Wijninckx ), usando la ricorsione invece di un ciclo.
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
Ho provato questo con i seguenti input:
1 => "A"
26 => "Z"
27 => "AA"
51 => "AY"
702 => "ZZ"
703 => "AAA"
-1 => ""
-234=> ""
Il codice di robertsd è elegante, ma per renderlo a prova di futuro, cambia la dichiarazione di n per digitare long
Nel caso in cui desideri una formula per evitare le macro, ecco qualcosa che funziona fino alla colonna 702 inclusa
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
dove A1 è la cella contenente il numero di colonna da convertire in lettere.
ULTIMO AGGIORNAMENTO : si prega di ignorare la funzione di seguito, @SurasinTancharoen è riuscito ad avvisarmi che si è rotto alle n = 53
.
Per coloro che sono interessati, ecco altri valori non corretti appena sotto n = 200
:
FINE AGGIORNAMENTO
La funzione seguente è fornita da Microsoft:
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
Fonte: come convertire i numeri di colonna di Excel in caratteri alfabetici
SI APPLICA A
Col_Letter(16384) = "XFD"
Questa è una funzione basata sulla risposta di @DamienFennelly sopra. Se mi dai un pollice in su, anche un pollice in su! : P
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
Esiste un modo molto semplice usando Excel power: usa la Range.Cells.Address
proprietà, in questo modo:
strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)
Questo restituirà l'indirizzo della colonna desiderata sulla riga 1. Prendilo come segue 1
:
strCol = Left(strCol, len(strCol) - 1)
Si noti che è così veloce e potente che è possibile restituire gli indirizzi di colonna che esiste persino!
Sostituisci lngRow
il numero di colonna desiderato usando la Selection.Column
proprietà!
Ecco una semplice fodera che può essere utilizzata.
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)
Funzionerà solo per una designazione di colonna di 1 lettera, ma è utile per casi semplici. Se ne hai bisogno per funzionare esclusivamente con designazioni di 2 lettere, puoi utilizzare quanto segue:
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
Funzionerà indipendentemente dalla colonna all'interno della tua riga di codice per la cella che si trova nella riga X, nella colonna Y:
Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)
Se hai una cella con un nome definito univoco "Nome cella":
Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
La soluzione di Brettdj funziona in modo fantastico, ma se la trovi come una potenziale soluzione per lo stesso motivo, pensavo che avrei offerto la mia soluzione alternativa.
Il problema che stavo riscontrando era scorrere fino a una colonna specifica in base all'output di una funzione MATCH (). Invece di convertire il numero di colonna nella sua lettera in parallelo, ho scelto di alternare temporaneamente lo stile di riferimento da A1 a R1C1. In questo modo potrei semplicemente scorrere fino al numero della colonna senza dover passare da una funzione VBA. Per alternare facilmente tra i due stili di riferimento, puoi utilizzare questo codice VBA:
Sub toggle_reference_style()
If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
End If
End Sub
Proseguendo sulla risposta di Brettdj, ecco come rendere facoltativo l'inserimento del numero di colonna. Se l'immissione del numero di colonna viene omessa, la funzione restituisce la lettera della colonna della cella che chiama la funzione. So che questo può essere ottenuto anche semplicemente ColumnLetter(COLUMN())
, ma ho pensato che sarebbe bello se riuscisse a capirlo in modo intelligente.
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
Il compromesso di questa funzione è che sarebbe molto più lento della risposta di Brettdj a causa del IF
test. Ma questo potrebbe essere avvertito se la funzione viene utilizzata ripetutamente per un numero molto elevato di volte.
Ecco una risposta tardiva, solo per un approccio semplicistico usando Int()
e If
nel caso di colonne di 1-3 caratteri:
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
Questa formula fornirà la colonna in base a un intervallo (ovvero A1 ), in cui l'intervallo è una singola cella. Se viene fornito un intervallo di più celle, verrà restituita la cella in alto a sinistra. Nota, entrambi i riferimenti di cella devono essere uguali:
MID (CELL ("address", A1 ), 2, SEARCH ("$", CELL ("address", A1 ), 2) -2)
Come funziona:
CELL ("proprietà", "intervallo") restituisce un valore specifico dell'intervallo in base alla proprietà utilizzata. In questo caso l'indirizzo della cella. La proprietà address restituisce un valore $ [col] $ [riga], ovvero A1 -> $ A $ 1. La funzione MID analizza il valore della colonna tra i simboli $.
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
Quindi sono in ritardo alla festa qui, ma voglio contribuire con un'altra risposta che nessun altro ha ancora indirizzato che non coinvolge array. Puoi farlo con una semplice manipolazione delle stringhe.
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
Dopo aver inserito l'input nel formato $A$1
, utilizzare la Mid
funzione, iniziare dalla posizione 2 per tenere conto del primo$
, quindi trovare dove $
appare il secondo nella stringa InStr
e quindi sottrarre 2 per tenere conto di quella posizione iniziale.
Questo ti dà il vantaggio di essere adattabile per l'intera gamma di possibili colonne. Pertanto, ColLetter(1)
restituisce "A" e ColLetter(16384)
restituisce "XFD", che è l'ultima colonna possibile per la mia versione di Excel.
La lettera della colonna dal numero della colonna può essere estratta usando la formula seguendo i passaggi
1. Calcola l'indirizzo della colonna usando la formula ADDRESS
2. Estrai la lettera della colonna usando la funzione MID e FIND
Esempio:
1.
Risultati ADDRESS (1000,1000,1) $ ALL $ 1000
2 . = Risultati MID (F15,2, TROVA ("$", F15,2) -2)
TUTTI i F15 assunti contengono il risultato del passaggio 1
In una volta possiamo scrivere
MID (INDIRIZZO (1000,1000,1), 2, TROVA ( "$", INDIRIZZO (1000,1000,1), 2) -2)
questo è solo per REFEDIT ... generalmente usa il codice qui sopra versione a breve ... facile da leggere e capire / usa poz di $
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
Il limite A è 65 quindi:
MsgBox Chr(ActiveCell.Column + 64)
Trovato in: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
che ne dite di convertire il numero ASCII e di usare Chr () per riconvertire in una lettera?
col_letter = Chr (Selection.Column + 96)
Ecco un altro modo:
{
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
}