VBA: le nom et le numéro de la colonne


Il n'est parfois pas évident de trouver le numéro d'une colonne (par ex. 45 pour la colonne "AS" ni d'extraire le nom de la colonne (par ex. "AS") à partir d'une adresse de cellule. Surtout que depuis la version 2007 d'Excel (c'est à dire dans Excel 2007 – 2016), le nombre de colonnes a atteint le nombre de 16.384 (détail de toutes les versions d'Excel). Pourtant, il s'agit d'une conversion très importante – pour l'utilisation des Range et pour les itérations (loops) dans VBA.

Voici donc une série des fonctions qui vous permettront de convertir facilement les noms de colonnes et leur numéros. Pour chacun des deux types de conversion (numéro -> nom; nom -> numéro), vous trouverez deux codes VBA: la fonction la plus simple pour faire la conversion en VBA et le code de l'algorithme (expression mathématique du calcul) qui vous permettra de transposer cette fonctionnalité dans d'autres langages de programmation.

Excel: Numéros et noms de colonnesLes colonnes et leur numéros.

VBA: Trouver le nom de la colonne

Voici le code qui vous permettra de trouver la lettre de la colonne à partir d'un numéro. Par exemple: le nom de la 74ème colonne => "BV".

Code source VBA pour trouver le nom de la colonne

Cette fonction est très simple et utilise la propriété Address de l'objet Range dans Excel. C'est ainsi qu'il est possible de faire la conversion en une ligne de code (mais pour une meilleure lisibilité, je l'écris sur deux lignes)…

Public Function NomDeColonne(NumeroDeColonne As Integer) As String
'par: Excel-Malin.com ( http://excel-malin.com )
On Error GoTo NomDeColonneErreur
    NomDeColonne = Cells(1, NumeroDeColonne).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    NomDeColonne = CStr(Left(NomDeColonne, Len(NomDeColonne) - 1))
Exit Function
NomDeColonneErreur:
    NomDeColonne = CVErr(xlErrNA)
End Function

L'algorithme pour trouver le nom de la colonne (sans l'utilisation des fonctionalités particulières d'Excel).

Cet algorithme va renvoyer exactement le même résultat que la fonction précédente mais sans faire appel aux fonctions spécifiques à VBA – vous pouvez donc le retranscrire librement dans d'autres langages de programmation.

Public Function NomDeColonneGeneral(NumeroDeColonne As Integer) As String
'par: Excel-Malin.com ( http://excel-malin.com )
On Error GoTo NomDeColonneGeneralErreur
    Dim i As Integer
    Dim m As Integer
    Dim NomTemporaire As String
    i = NumeroDeColonne
    NomTemporaire = ""
    Do While (i > 0)
        m = (i - 1) Mod 26
        NomTemporaire = Chr(65 + m) + NomTemporaire
        i = Int((i - m) / 26)
    Loop
    NomDeColonneGeneral = NomTemporaire
Exit Function
NomDeColonneGeneralErreur:
    NomDeColonneGeneral = CVErr(xlErrNA)
End Function

VBA: Trouver le numéro de la colonne

Et voici la conversion contraire: comment trouver le numéro de colonne à partir de son nom. Par exemple: la colonne "BC" est la 55ème.

Code source VBA pour trouver le numéro de la colonne

Cette fonction peut être facilement utilisée dans vos applications Excel. Elle utilise comme argument le nom de la colonne et retourne son numéro.

Public Function NumeroDeColonne(NomDeColonne As String) As Integer
'par: Excel-Malin.com ( http://excel-malin.com )
On Error GoTo NumeroDeColonneErreur
    NumeroDeColonne = CInt(Range(NomDeColonne & "1").Column)
Exit Function
NumeroDeColonneErreur:
    NumeroDeColonne = CVErr(xlErrNA)
End Function

 

L'algorithme pour trouver le numéro de la colonne (sans l'utilisation des fonctionalitées particulières d'Excel).

Cet algorithme peut être transformé dans d'autres langages de programmation (Java, C#,…) car il n'utilise pas des fonctionnalités spécifiques à Excel (comme par ex. Range)

Du point de vue d'Excel, cette fonction utilise comme paramètre un argument de type String qui contient le nom de la colonne (e.g. "AT" ou "FRB"). La valeur renvoyée par cette fonction est le numéro de la colonne (en tant qu'Integer)

Public Function NumeroDeColonneGeneral(NomDeColonne As String) As Integer
'par: Excel-Malin.com ( http://excel-malin.com )
On Error GoTo NumeroDeColonneGeneralErreur

For i = Len(NomDeColonne) To 1 Step -1
x = Asc(UCase(Mid(NomDeColonne, i, 1))) - 64
y = x * 26 ^ (Len(NomDeColonne) - i) + y

Next i
Debug.Print y
Exit Function

NumeroDeColonneGeneralErreur:
    NumeroDeColonneGeneral = CVErr(xlErrNA)
End Function

 

21 0