¿Alguien tiene una función Excel VBA que pueda devolver las letras de la columna de un número?
Por ejemplo, ingresar 100 debería regresar CV
.
¿Alguien tiene una función Excel VBA que pueda devolver las letras de la columna de un número?
Por ejemplo, ingresar 100 debería regresar CV
.
Respuestas:
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
(0)
al final del comando Dividir si desea guardar una declaración de variable y una línea de código adicional. Por ejemploCol_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
es una propiedad de Excel, lo que significa que debe usarla <excel_object>.Cells()
. De lo contrario, obtendrá un error de tipo no coincidente.
Si prefiere 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
IF ColumnNumber <= Columns.Count
Sería mejor evitar suposiciones en torno a las versiones.
Algo que funciona para mí es:
Cells(Row,Column).Address
Esto le devolverá la referencia de formato $ AE $ 1.
MsgBox Columns( 9347 ).Address
devoluciones .Para devolver SOLO las letras de la columna :Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
devoluciones .
Solo una forma más de hacer esto. La respuesta de Brettdj me hizo pensar en esto, pero si usa este método no tiene que usar una matriz variante, puede 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 usando 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 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 VBA según lo solicitado:
Function ColName(colNum As Integer) As String
ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(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 recursividad 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=> ""
código de robertsd es elegante, pero para que sea a prueba de futuro, cambie la declaración de n para escribir largo
En caso de que desee una fórmula para evitar macros, 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.
ÚLTIMA ACTUALIZACIÓN : ignore la función a continuación, @SurasinTancharoen logró alertarme de que no funciona n = 53
.
Para aquellos que estén interesados, aquí hay otros valores rotos a continuación n = 200
:
FIN DE ACTUALIZACIÓN
Microsoft proporciona la siguiente función:
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
Col_Letter(16384) = "XFD"
Esta es una función basada en la respuesta de @ DamienFennelly anterior. Si me das un visto bueno, dale un pulgar también. :PAGS
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
Hay una manera muy simple de usar Excel Power: use la Range.Cells.Address
propiedad 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 de 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
el número de columna deseado usando la Selection.Column
propiedad!
Aquí hay un revestimiento simple que se puede usar.
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 exclusivamente para designaciones de 2 letras, puede usar lo siguiente:
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
Esto funcionará independientemente de qué 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 un nombre único definido "Nombre de celda":
Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
La solución de brettdj funciona fantásticamente, pero si se encuentra con esto como una solución potencial por la misma razón que yo, pensé que ofrecería mi solución alternativa.
El problema que tenía era desplazarme a una columna específica basada en la salida 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 manera, podría desplazarme al número de columna sin tener que manipular 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
Continuando con la respuesta brettdj, aquí es 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 sería bueno 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 ligeramente más lenta que la respuesta de brettdj debido a la IF
prueba. Pero esto se podría sentir si la función se usa repetidamente durante una gran cantidad de veces.
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
Esta fórmula le dará a la columna en función de un rango (es decir, A1 ), donde el rango es una sola celda. Si se proporciona un rango de celdas múltiples, devolverá la celda superior izquierda. Tenga en cuenta que ambas referencias de celda deben ser iguales:
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 dependiendo 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 $.
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
Así que llego tarde a la fiesta aquí, pero quiero aportar otra respuesta que nadie más haya abordado aún y que no implique matrices. Puedes hacerlo con una simple manipulación de cadenas.
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
Después de tener la entrada en el formato $A$1
, use la Mid
función, comience en la posición 2 para dar cuenta de la primera $
, luego encuentre dónde $
aparece la segunda en la cadena usando InStr
, y luego reste 2 para dar cuenta de esa posición inicial.
Esto le brinda la ventaja de ser adaptable para toda la gama de columnas posibles. Por lo tanto, ColLetter(1)
devuelve "A" y ColLetter(16384)
devuelve "XFD", que es la última columna posible para mi versión de Excel.
La letra de la 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 DIRECCIÓN
2. Extraiga la letra de la columna usando la función MID y FIND
Ejemplo:
1.
Resultados de DIRECCIÓN (1000,1000,1) $ TODOS $ 1000
2 . = MID (F15,2, FIND ("$", F15,2) -2)
resultados TODOS asumiendo que F15 contiene el resultado del paso 1.
De una vez, podemos escribir
MID (ADDRESS (1000,1000,1), 2, FIND ("$", DIRECCIÓN (1000,1000,1), 2) -2)
esto es solo para REFEDIT ... generalmente usa la versión breve del código hasta aquí ... fácil de leer y entender / usa 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
El Cap A es 65, entonces:
MsgBox Chr(ActiveCell.Column + 64)
Encontrado en: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
¿Qué hay de simplemente convertir al número ASCII y usar Chr () para convertir de nuevo a una letra?
col_letter = Chr (Selection.Column + 96)
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
}