web-dev-qa-db-fra.com

Fonction pour convertir le numéro de colonne en lettre?

Quelqu'un at-il une fonction VBA Excel qui peut renvoyer la ou les lettres de colonne d’un nombre?

Par exemple, entrer 100 devrait renvoyer CV.

118
mezamorphic

Cette fonction renvoie la lettre de colonne pour un numéro de colonne donné.

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

Code de test pour la colonne 100

Sub Test()
    MsgBox Col_Letter(100)
End Sub
176
brettdj

Si vous préférez ne pas utiliser d'objet de plage:

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
78
robartsd

Quelque chose qui fonctionne pour moi est:

Cells(Row,Column).Address 

Cela renverra la référence de format $ AE $ 1 pour vous.

40
Damian Fennelly

 I'm surprised nobody suggested: **<code></code> <code>Columns(</code>***<code>Column Index</code>***<code>).Address</code> <code></code>**

  • Par exemple:MsgBox Columns( 9347 ).Addressretourne**<code>$MUM:$MUM</code>**.

Pour renvoyer SEULEMENT la lettre de colonne (s): Split((Columns(Column Index).Address(,0)),":")(0)

  • Par exemple:MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)retourne**<code>DAD</code>**.

More Examples


15
ashleedawg

Juste un autre moyen de le faire. La réponse de Brettdj m'a fait penser à cela, mais si vous utilisez cette méthode, vous n'êtes pas obligé d'utiliser un tableau variant, vous pouvez passer directement à une chaîne.

ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")

ou peut le rendre un peu plus compact avec cette

ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")

Notez que cela dépend de la référence de la ligne 1 dans l'objet Cellules.

15
OSUZorba

Et une solution utilisant la récursivité:

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
14
Nikolay Ivanov

Ceci est disponible en utilisant une formule:

=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")

et ainsi aussi peut être écrit comme une fonction VBA à la demande:

Function ColName(colNum As Integer) As String
    ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
8
Alistair Collins

DERNIÈRE MISE À JOUR: Veuillez ignorer la fonction ci-dessous, @SurasinTancharoen a réussi à m'alerter qu'elle est cassée à n = 53.
Pour ceux qui sont intéressés, voici d'autres valeurs brisées juste en dessous de n = 200:

 Certain values of

S'il vous plaît utiliser la fonction @brettdj pour tous vos besoins. Cela fonctionne même pour Microsoft Excel avec le dernier nombre maximum de colonnes: 16384 devrait donner XFD

 enter image description here

FIN DE MISE À JOUR


La fonction ci-dessous est fournie par 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

Source: Comment convertir des numéros de colonne Excel en caractères alphabétiques

S'APPLIQUE À

  • Microsoft Office Excel 2007
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
7
mtbink.com

Le code de robertsd est élégant, mais pour le rendre pérenne, changez la déclaration de n en long

Si vous voulez une formule pour éviter les macros, voici quelque chose qui fonctionne jusqu'à la colonne 702 incluse.

=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)

où A1 est la cellule contenant le numéro de colonne à convertir en lettres.

6
Jan Wijninckx

Ceci est une version de réponse de robartsd (avec la saveur de la solution à une ligne de Jan Wijninckx ), en utilisant la récursivité au lieu d'une boucle. 

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

J'ai testé cela avec les entrées suivantes: 

1   => "A"
26  => "Z"
27  => "AA"
51  => "AY"
702 => "ZZ"
703 => "AAA" 
-1  => ""
-234=> ""
6
alexanderbird

Il existe un moyen très simple d'utiliser Excel power: Utilisez la propriété Range.Cells.Address, de cette façon:

strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)

Cela renverra l'adresse de la colonne souhaitée sur la ligne 1. Prenez-la du 1:

strCol = Left(strCol, len(strCol) - 1)

Notez qu'il est si rapide et puissant que vous pouvez renvoyer des adresses de colonne qui existent même!

Substituez lngRow au numéro de colonne souhaité en utilisant la propriété Selection.Column!

3
flaviomorgado

Ceci est une fonction basée sur @ @ la réponse de DamienFennelly ci-dessus. Si vous me donnez un coup de pouce, lui donner un coup de pouce aussi! : P

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function
3
BrettFromLA

Cela fonctionnera quelle que soit la colonne de votre ligne de code pour la cellule située à la ligne X, dans la colonne Y:

Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)

Si vous avez une cellule avec un nom défini unique "Nom de la cellule":

Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
2
Codeplayer

Voici un simple revêtement qui peut être utilisé.

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)

Cela ne fonctionnera que pour une désignation de colonne de 1 lettre, mais c'est bien pour les cas simples. Si vous en avez besoin pour des désignations exclusivement à deux lettres, vous pouvez utiliser les éléments suivants:

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
2
Syd B

Cette formule donnera la colonne basée sur une plage (c'est-à-dire, A1 ), où plage est une cellule unique. Si une plage multi-cellules est donnée, elle retournera la cellule en haut à gauche. Notez que les deux références de cellule doivent être identiques:

MID (CELLULE ("adresse", A1 ), 2, RECHERCHE ("$", CELLULE ("adresse", A1 ), 2) -2)

Comment ça marche:

CELLULE ("propriété", "plage") renvoie une valeur spécifique de la plage en fonction de la propriété utilisée. Dans ce cas, l'adresse de cellule . La propriété address renvoie la valeur $ [col] $ [ligne], c'est-à-dire A1 -> $ A $ 1 . La fonction MID analyse la valeur de la colonne entre les symboles $.

1
Thom

Voici une réponse tardive, juste pour une approche simpliste utilisant Int() et If dans le cas de colonnes de 1 à 3 caractères:

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
1
ib11

La solution de brettdj fonctionne à merveille, mais si vous croyez que cela pourrait être une solution potentielle pour les mêmes raisons que moi, je pensais pouvoir offrir ma solution de remplacement.

Le problème que je rencontrais était de faire défiler une colonne spécifique en fonction de la sortie d'une fonction MATCH (). Au lieu de convertir le numéro de colonne en parallèle lettre de colonne, j'ai choisi de basculer temporairement le style de référence de A1 à R1C1. De cette façon, je pourrais simplement faire défiler le numéro de colonne sans avoir à maquiller avec une fonction VBA. Pour basculer facilement entre les deux styles de référence, vous pouvez utiliser ce code VBA:

Sub toggle_reference_style()

If Application.ReferenceStyle = xlR1C1 Then
  Application.ReferenceStyle = xlA1
Else
  Application.ReferenceStyle = xlR1C1
End If

End Sub
1
Will Ediger

Ici, une fonction 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;
1
Jordi

Pour revenir à la réponse de brettdj, voici comment rendre l’entrée du numéro de colonne facultative. Si le numéro de colonne saisi est omis, la fonction renvoie la lettre de colonne de la cellule qui appelle la fonction. Je sais que cela peut également être réalisé en utilisant simplement ColumnLetter(COLUMN()), mais je pensais que ce serait bien si cela pouvait intelligemment comprendre.

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

Le compromis de cette fonction est qu’elle serait très légèrement plus lente que la réponse de Brettdj en raison du test IF. Mais cela pourrait être ressenti si la fonction est utilisée de manière répétée très souvent.

1
Rosetta
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
1
Krzysztof
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
0
Chetan V.

Donc, je suis en retard pour la fête ici, mais je veux apporter une autre réponse à laquelle personne n'a encore répondu, qui n'implique pas de tableaux. Vous pouvez le faire avec une simple manipulation de chaîne.

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

Une fois que vous avez saisi le format $A$1, utilisez la fonction Mid, commencez à la position 2 pour comptabiliser le premier $, puis vous trouverez où le deuxième $ apparaît dans la chaîne à l'aide de InStr, puis soustrayez 2 de manière à prendre en compte le début. position.

Cela vous donne l'avantage d'être adaptable à toute la gamme de colonnes possibles. Par conséquent, ColLetter(1) renvoie "A" et ColLetter(16384) rend "XFD", qui est la dernière colonne possible pour ma version Excel.

0
SandPiper

Un moyen facile d'obtenir le nom de la colonne

Sub column()

cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column

End Sub

J'espère que ça aide =)

0
cristobal