Convertir un numéro de colonne excel en caractère (très rapide)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 787 fois - Téléchargée 30 fois

Contenu du snippet

Le code qui suit est à placer dans une macro excel uniquement.

Il faut envoyer en paramètre un numéro de colonne (par exemple 4).

La fonction renvoit alors D

car D est le nom de la 4e colonne d'excel. C'est simple, non ? Cette fonction va jusqu'à ZZ (= 752)

Source / Exemple :


Function convertir(i As Integer) As String

Dim c As Integer
Dim c1 As Integer

c = i Mod 26
c1 = Int(i / 26)

If c1 > 0 Then
    If c = 0 Then
        If c1 > 1 Then
            convertir = Chr(c1 + Asc("A") - 2) + "Z"
        Else
            convertir = "Z"
        End If
    Else
        convertir = Chr(c1 + Asc("A") - 1) + Chr(c + Asc("A") - 1)
    End If
Else
    convertir = Chr(c + Asc("A") - 1)
End If
End Function

A voir également

Ajouter un commentaire

Commentaires

DadaKarl
Messages postés
1
Date d'inscription
mercredi 5 novembre 2008
Statut
Membre
Dernière intervention
17 février 2012
-
Bonsoir,
C'est la première fois que je dialogue sur ce site, et d'une manière plus générale sur Internet. J'étais content car j'avais développé un petit algorithme pour sortir les lettres des colonnes Excel à partir des numéros. Ca marche pour les 16384 colonnes.
Et là, bravo, je suis calmé. Merci pour cette belle démonstration qui montre qu'il faut toujours réfléchir aux éléments dont on dispose avant de commencer à foncer tête baissée.
Le code de BIGFISH_LE VRAI
Function ColStrIndx(ByVal ColIndx As Integer) As String
ColStrIndx = Columns(ColIndx).Address(False, False)
ColStrIndx = Left$(ColStrIndx, InStr(1, ColStrIndx, ":", vbTextCompare) - 1)
End Function
Ci-dessous, le code que j'avais fait :
Public Function ColEntete(NumCol As Integer) As String
' Fonction qui permet de déterminer les lettres repérant une colonne en fonction de son numéro.
' La colonne A porte le numéro 1.
' La fonction fonctionne jusqu'à la colonne 16384 (limite Excel).
' Elle sort 3 erreurs :
' - ColEntete=ErreurInf0 si le numéro de colonne passé en paramètre est inférieur à 0.
' - ColEntete=ErreurEgal0 si le numéro de colonne passé en paramètre est égal à 0.
' - ColEntete=ErreurSup16384 si le numéro de colonne passé en paramètre est supérieur à 16384.
Dim AuxNumCol As Integer
Dim PE26 As Integer
Dim Reste26 As Integer
Dim PE676 As Integer
Dim Reste676 As Integer
Dim AuxReel As Double
Dim AuxEntier As Integer
AuxNumCol = NumCol
' TRAITEMENT SI NUMERO DE COLONNE NEGATIF
If NumCol < 0 Then
ColEntete = "ErreurInf0"
End If
' TRAITEMENT SI NUMERO DE COLONNE NUL
If NumCol < 0 Then
ColEntete = "ErreurEgal0"
End If
' TRAITEMENT POUR LES COLONNES A 1 LETTRE
If NumCol >= 1 And NumCol <= 26 Then
ColEntete = Chr(64 + NumCol)
End If
' TRAITEMENT POUR LES COLONNES A 2 LETTRES
If NumCol >= 27 And NumCol <= 702 Then
AuxNumCol = AuxNumCol - 26
AuxReel = AuxNumCol / 26
AuxEntier = CInt(AuxReel)
AuxReel = AuxEntier - AuxReel
If AuxReel > 0 Then
AuxEntier = AuxEntier - 1
End If
PE26 = AuxEntier
Reste26 = AuxNumCol - (AuxEntier * 26)
If Reste26 = 0 Then
PE26 = PE26 - 1
Reste26 = 26
End If
ColEntete = Chr(65 + PE26) + Chr(64 + Reste26)
End If
' TRAITEMENT POUR LES COLONNES A 3 LETTRES
If NumCol >= 703 And NumCol <= 16384 Then
AuxNumCol = AuxNumCol - 702
AuxReel = AuxNumCol / 676
AuxEntier = CInt(AuxReel)
AuxReel = AuxEntier - AuxReel
If AuxReel > 0 Then
AuxEntier = AuxEntier - 1
End If
PE676 = AuxEntier
Reste676 = AuxNumCol - (AuxEntier * 676)
If Reste676 = 0 Then
PE676 = PE676 - 1
Reste676 = 676
End If
AuxReel = Reste676 / 26
AuxEntier = CInt(AuxReel)
AuxReel = AuxEntier - AuxReel
If AuxReel > 0 Then
AuxEntier = AuxEntier - 1
End If
PE26 = AuxEntier
Reste26 = Reste676 - (AuxEntier * 26)
If Reste26 = 0 Then
PE26 = PE26 - 1
Reste26 = 26
End If
ColEntete = Chr(65 + PE676) + Chr(65 + PE26) + Chr(64 + Reste26)
End If
' TRAITEMENT SI NUMERO DE COLONNE SUPERIEUR A LIMITE
If NumCol > 16384 Then
ColEntete = "ErreurSup16384"
End If
End Function
bigfish_le vrai
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
8 -
Et encore plus simple, sans boucle et sans limite:

Function ColStrIndx(ByVal ColIndx As Integer) As String
ColStrIndx = Columns(ColIndx).Address(False, False)
ColStrIndx = Left$(ColStrIndx, InStr(1, ColStrIndx, ":", vbTextCompare) - 1)
End Function

Gain de temps et efficacité, surtout avec Excel2007 et ces 16384 colonnes
cs_YvesMarie
Messages postés
6
Date d'inscription
vendredi 18 avril 2003
Statut
Membre
Dernière intervention
1 juin 2009
-
réponse au Commentaire de MrOsmose du 13/03/2007 14:18:11
l'idée du while est sympa.
à condition de se rappeler que 'Mod' commence à compter à partir de zéro!
je propose cette mouture :
Function conversion_Col(colrest As Integer)
Dim xBase As Integer
Dim colstr As String
xBase = 26
colstr = ""
While (colrest > 0)
colstr = Chr(((colrest - 1) Mod xBase) + 64 + 1) & colstr
colrest = ((colrest - 1) \ xBase)
Wend
conv_ff = colstr
End Function
Tylirius
Messages postés
1
Date d'inscription
vendredi 16 novembre 2007
Statut
Membre
Dernière intervention
5 décembre 2007
-
Je recherchais exactement un code comme cela.
Simple et efficace
Merci !
10/10

PS fonctionne en vb.net
MrOsmose
Messages postés
26
Date d'inscription
dimanche 4 juillet 2004
Statut
Membre
Dernière intervention
18 avril 2007
-
pourquoi ne pas utiliser un while? cela permet d'avoir un code qui fonctionne tout le temps, meme avec des tableaux qui seraient plus large...

ici le code en VBA
---------------------------------------------------
dim colrest as integer
dim colstr as string
colrest = ' (nombre de colonne en chiffre)
colstr = ""

While (colrest > 0)
colstr = Chr((colrest Mod 26) + 64) + colstr
colrest = (colrest / 26) - 0.5
Wend
-------------------------------------------------
l'astuce (pour VBA) consiste a faire le "-0.5" car ce langage arrondi a l'unité supérieure, ce qu'on ne veut pas (division entière uniquement).

avec ce code, on peut sans problèmes retrouver la colonne "AZEFAIX" si on a un numéro de colonne suffisament grand ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.