excel - números - Función para convertir el número de columna a letra?
no me aparecen las letras de las columnas en excel (27)
¿Alguien tiene una función de Excel VBA que puede devolver la (s) letra (s) de columna de un número?
Por ejemplo, ingresar 100 debe devolver CV
.
¿Qué tal simplemente convertir al número ASCII y usar CHR () para convertir de nuevo a una letra?
col_letter = Chr (Selection.Column + 96)
Algo que funciona para mí es:
Cells(Row,Column).Address
Esto le devolverá la referencia de formato de $ AE $ 1.
Aquí hay otra forma:
{
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
}
Aquí hay un simple trazador de líneas que se puede utilizar.
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)
Solo funcionará para una designación de columna de 1 letra, pero es bueno para casos simples. Si necesita que funcione para designaciones exclusivas de 2 letras, puede usar lo siguiente:
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
Aquí hay una respuesta tardía, solo para un enfoque simplista usando Int()
y If
en el caso de columnas de 1-3 caracteres:
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
Aquí, una función simple en 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;
Continuando con la respuesta brettdj, aquí hay que hacer que la entrada del número de columna sea opcional. Si se omite la entrada del número de columna, la función devuelve la letra de la columna de la celda que llama a la función. Sé que esto también se puede lograr usando simplemente ColumnLetter(COLUMN())
, pero pensé que estaría bien si pudiera entenderlo inteligentemente.
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
La compensación de esta función es que sería muy muy levemente más lenta que la respuesta de brettdj debido a la prueba IF
. Pero esto podría sentirse si la función se usa repetidamente para una gran cantidad de veces.
El límite A es 65 así que:
MsgBox Chr(ActiveCell.Column + 64)
Encontrado en: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
Esta es una función basada en la respuesta de @ DamienFennelly anterior. Si me das un pulgar arriba, ¡dale un pulgar hacia arriba también! :PAG
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
Esta es una versión de la respuesta de robartsd (con el sabor de la solución de una línea de Jan Wijninckx ), utilizando la recursión en lugar de un bucle.
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
He probado esto con las siguientes entradas:
1 => "A"
26 => "Z"
27 => "AA"
51 => "AY"
702 => "ZZ"
703 => "AAA"
-1 => ""
-234=> ""
Esta fórmula dará la columna basada en un rango (es decir, A1 ), donde el rango es una sola celda. Si se proporciona un rango de múltiples celdas, devolverá la celda superior izquierda. Tenga en cuenta que ambas referencias de celda deben ser las mismas:
MID (CELL ("dirección", A1 ), 2, SEARCH ("$", CELL ("dirección", A1 ), 2) -2)
Cómo funciona:
CELL ("propiedad", "rango") devuelve un valor específico del rango en función de la propiedad utilizada. En este caso, la dirección de la celda. La propiedad de dirección devuelve un valor $ [col] $ [fila], es decir, A1 -> $ A $ 1. La función MID analiza el valor de la columna entre los $ símbolos.
Esta función devuelve la letra de la columna para un número de columna dado.
Function Col_Letter(lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function
código de prueba para la columna 100
Sub Test()
MsgBox Col_Letter(100)
End Sub
Esto está disponible mediante el uso de una fórmula:
=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")
y también se puede escribir como una función de VBA según lo solicitado:
Function ColName(colNum As Integer) As String
ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
Esto funcionará independientemente de la columna dentro de su línea de código para la celda que se encuentra en la fila X, en la columna Y:
Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)
Si tiene una celda con el nombre único definido "Nombre de célula":
Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
Forma fácil de obtener el nombre de la columna
Sub column()
cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column
End Sub
Espero que ayude =)
Hay una forma muy sencilla de utilizar Excel: use la propiedad Range.Cells.Address
, de esta manera:
strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)
Esto devolverá la dirección de la columna deseada en la fila 1. Tómela del 1
:
strCol = Left(strCol, len(strCol) - 1)
Tenga en cuenta que es tan rápido y poderoso que puede devolver direcciones de columna que incluso existen.
Sustituya lngRow
por el número de columna deseado mediante la propiedad Selection.Column
.
La letra de columna del número de columna se puede extraer usando la fórmula siguiendo los pasos
1. Calcule la dirección de la columna usando la fórmula ADDRESS
2. Extraiga la letra de la columna usando la función MID y FIND
Ejemplo:
1. DIRECCIÓN (1000,1000,1)
resultados $ TODOS $ 1000
2. = MID (F15,2, FIND ("$", F15,2) -2)
resultados ALL asuming F15 contiene el resultado del paso 1
De una vez, podemos escribir
MID (DIRECCIÓN (1000,1000,1), 2, ENCONTRAR ("$", DIRECCIÓN (1000,1000,1), 2) -2)
La solución de brettdj funciona fantásticamente, pero si te encuentras con esto como una posible solución por la misma razón que yo, pensé que ofrecería mi solución alternativa.
El problema que tenía era desplazarse a una columna específica basada en el resultado de una función MATCH (). En lugar de convertir el número de columna a su letra de columna paralela, elegí alternar temporalmente el estilo de referencia de A1 a R1C1. De esta forma, podría desplazarme hasta el número de columna sin tener que ensuciar con una función VBA. Para alternar fácilmente entre los dos estilos de referencia, puede usar este código VBA:
Sub toggle_reference_style()
If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
End If
End Sub
Si prefieres no usar un objeto de rango:
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
Solo una forma más de hacer esto. La respuesta de Brettdj me hizo pensar en esto, pero si usas este método no tienes que usar una matriz variante, puedes ir directamente a una cadena.
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
o puede hacerlo un poco más compacto con esto
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
Tenga en cuenta que esto depende de que haga referencia a la fila 1 en el objeto de celdas.
Y una solución que usa recursividad:
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
esto es solo para REFEDIT ... generalmente se usa el código de uphere en breve versión ... fácil de leer y entender / use poz de $
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
ÚLTIMA ACTUALIZACIÓN : ignore la función siguiente, @SurasinTancharoen logró alertarme de que se rompió en n = 53
.
Para aquellos que están interesados, aquí hay otros valores rotos justo debajo de n = 200
:
Utilice la función @brettdj para todas sus necesidades. Incluso funciona para el último límite máximo de columnas de Microsoft Excel: 16384
debería dar XFD
FIN DE ACTUALIZACIÓN
La función a continuación es proporcionada por 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
Fuente: Cómo convertir números de columnas de Excel en caracteres alfabéticos
SE APLICA A
- Microsoft Office Excel 2007
- Microsoft Excel 2002 Standard Edition
- Microsoft Excel 2000 Standard Edition
- Microsoft Excel 97 Standard Edition
El código de robertsd es elegante, pero para que sea a prueba de futuro, cambie la declaración de n para escribir long
En caso de que quiera una fórmula para evitar las macro, aquí hay algo que funciona hasta la columna 702 inclusive
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
donde A1 es la celda que contiene el número de columna que se convertirá en letras.
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
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