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
.
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
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
Quelque chose qui fonctionne pour moi est:
Cells(Row,Column).Address
Cela renverra la référence de format $ AE $ 1 pour vous.
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.
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
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
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
:
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 À
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.
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=> ""
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
!
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
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)
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)
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 $.
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
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
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;
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.
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
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.
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 =)