para números numeros nombre lugar los letras las hay encabezados cómo convertir columnas cambiar aparecen excel excel-vba excel-udf

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.



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


  • Por ejemplo: MsgBox Columns( 9347 ).Address devuelve .

Para devolver ÚNICAMENTE la (s) letra (s) de columna : Split((Columns( Column Index ).Address(,0)),":")(0)

  • Por ejemplo: MsgBox Split((Columns( 2734 ).Address(,0)),":")(0) returns .

Ú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