Puede agregarlo (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)
Caltor
3
Eso es bastante correcto, pero pensé que era más legible usar varias líneas.
brettdj
66
¿Por qué molestarse con los params booleanos en esta situación? Puedes hacerlo:............................................. ......v = Split(Cells(1, lngCol).Address, "$")(1)
Excel Hero
1
Si bien esto es muy antiguo, tengo una adición menor: verificar primero si el número es positivo, ya que de lo contrario te encontrarás con errores. si lngcol <= 0 entonces
Selkie
1
Cuando use VBS, recuerde que .Cellses una propiedad de Excel, lo que significa que debe usarla <excel_object>.Cells(). De lo contrario, obtendrá un error de tipo no coincidente.
Stevoisiak
88
Si prefiere no usar un objeto de rango:
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
No está claro por qué publicó un método más largo con un bucle en función de Si prefiere no usar un objeto de rango:
brettdj
29
@brettdj Puedo imaginar varias razones: 1) este método es aproximadamente 6 veces más rápido según mis pruebas 2) no requiere acceso a la API de Excel 3) presumiblemente tiene una huella de memoria más pequeña. EDITAR: Además, no estoy seguro de por qué comenté una respuesta de más de un año: S
Blackhawk
66
Sin embargo, hay un inconveniente en el aumento de la velocidad. El uso del objeto de rango arroja un error si pasa un número de columna no válido. Funciona incluso si alguien sigue usando Excel 2003. Si necesita ese tipo de excepción, vaya con el método de rango. De lo contrario, felicitaciones a robartsd.
Ingeniero Toast
66
IF ColumnNumber <= Columns.CountSería mejor evitar suposiciones en torno a las versiones.
brettdj
1
Otra razón para usar este código es si no estás en VBA sino en VB, .net, etc.
Maury Markowitz,
46
Algo que funciona para mí es:
Cells(Row,Column).Address
Esto le devolverá la referencia de formato $ AE $ 1.
Este me funciona en Office 365: string col = Worksheet.Columns [column] .Address; return col.Substring (col.IndexOf (":") + 2); Por alguna razón, otras expresiones, como Range = Worksheet.Cells [1, columna], arrojaban errores (ya sea en la llamada de Celdas o cuando intenté tomar la dirección, no recuerdo, lo siento, qué líneas se tiraron en qué casos específicos.)
Sam Azer
19
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.
Corta y pega perfecto para convertir números mayores que 676. ¡Gracias!
David Krider
1
El resto nunca puede ser más de 26, ¿por qué no un número entero en lugar de largo?
Caltor
10
@Caltor A menos que tenga un propósito especial para usar un Integer, como llamar a una API que exige uno, por ejemplo, nunca debe elegir un Integer en lugar de un Long. VBA está optimizado para Longs. VBA procesa Longs más rápido que Integers.
Excel Hero
1
@ExcelHero No lo sabía. Sin embargo, ¿un Long no requiere más memoria que un Integer?
Caltor
66
@Caltor De hecho, un Long es de 32 bits, mientras que un Integer es de 16. Pero eso no importa en la informática moderna. Hace 25 años ... importaba mucho. Pero hoy (incluso hace 15 años) la diferencia es totalmente intrascendente.
Excel Hero
9
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 AsInteger)AsString
ColName = Split(Worksheets(1).Cells(1, colNum).Address,"$")(1)EndFunction
Acabo de notar que esto es esencialmente lo mismo que la solución de Nikolay Ivanov, lo que hace que la mía sea un poco menos novedosa. Lo dejaré arriba porque muestra un enfoque ligeramente diferente para algunas de las minucias
alexanderbird
Buena solución por dos razones: no usar ningún objeto (como rango, celda, etc.); Definición muy compacta.
loved.by.Jesus
8
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
Ú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:
Como referencia, esto vomita con conjuntos de columnas más grandes ya que Chr () no maneja bien los números grandes.
Azuvector
2
Esto tiene un error. Pruebe ConvertToLetter (53) que debería haber sido 'BA' pero será un error.
Surasin Tancharoen
@SurasinTancharoen Muchas gracias por notar esta falla. Nunca pensé que Microsoft proporcionaría una función rota, ya que ellos mismos crearon Microsoft Excel. A partir de ahora abandonaré esta función y usaré la función @brettdj que incluso corrige hasta el último número máximo de límite de columna de Microsoft ExcelCol_Letter(16384) = "XFD"
mtbink.com
44
¿Y de dónde demonios viene este "dividir entre 27"? Lo último que verifiqué son 26 letras. Es por eso que este código se rompe.
ib11
5
Esta es una función basada en la respuesta de @ DamienFennelly anterior. Si me das un visto bueno, dale un pulgar también. :PAGS
Buena, pero ¿en qué se diferencia de la respuesta aceptada?
Ioannis
@loannis, basé la mía en la respuesta de DamianFennelly, no en la respuesta aceptada. Pero sí, la mía se parece mucho a la respuesta aceptada, excepto que una línea se divide en dos para que sea más legible.
BrettFromLA
3
Hay una manera muy simple de usar Excel Power: use la Range.Cells.Addresspropiedad de esta manera:
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:
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
EndIfEndSub
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.
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 IFprueba. 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 Ifen el caso de columnas de 1-3 caracteres:
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;
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:
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 $.
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 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
Después de tener la entrada en el formato $A$1, use la Midfunció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 $
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
Respuestas:
Esta función devuelve la letra de la columna para un número de columna dado.
código de prueba para la columna 100
fuente
(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:
fuente
IF ColumnNumber <= Columns.Count
Sería mejor evitar suposiciones en torno a las versiones.Algo que funciona para mí es:
Esto le devolverá la referencia de formato $ AE $ 1.
fuente
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 .fuente
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.
o puede hacerlo un poco más compacto con esto
Tenga en cuenta que esto depende de que haga referencia a la fila 1 en el objeto de celdas.
fuente
Y una solución usando recursividad:
fuente
Esto está disponible mediante el uso de una fórmula:
y también se puede escribir como una función VBA según lo solicitado:
fuente
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.
He probado esto con las siguientes entradas:
fuente
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
donde A1 es la celda que contiene el número de columna que se convertirá en letras.
fuente
Ú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
: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 darXFD
FIN DE ACTUALIZACIÓN
Microsoft proporciona la siguiente función:
Fuente: Cómo convertir números de columnas de Excel en caracteres alfabéticos
SE APLICA A
fuente
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
fuente
Hay una manera muy simple de usar Excel Power: use la
Range.Cells.Address
propiedad de esta manera:Esto devolverá la dirección de la columna deseada en la fila 1. Tómela de
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 laSelection.Column
propiedad!fuente
Aquí hay un revestimiento simple que se puede usar.
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:
fuente
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:
Si tiene una celda con un nombre único definido "Nombre de celda":
fuente
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:
fuente
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.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.fuente
Aquí hay una respuesta tardía, solo para un enfoque simplista usando
Int()
yIf
en el caso de columnas de 1-3 caracteres:fuente
fuente
Aquí, una función simple en Pascal (Delphi).
fuente
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 $.
fuente
Manera fácil de obtener el nombre de la columna
Espero que ayude =)
fuente
fuente
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.
Después de tener la entrada en el formato
$A$1
, use laMid
función, comience en la posición 2 para dar cuenta de la primera$
, luego encuentre dónde$
aparece la segunda en la cadena usandoInStr
, 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" yColLetter(16384)
devuelve "XFD", que es la última columna posible para mi versión de Excel.fuente
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)
fuente
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 $
fuente
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
fuente
¿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)
fuente
Aquí hay otra forma:
fuente