DadaKarl
Messages postés1Date d'inscriptionmercredi 5 novembre 2008StatutMembreDernière intervention17 février 2012 17 févr. 2012 à 19:41
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és1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 1 déc. 2009 à 17:29
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és6Date d'inscriptionvendredi 18 avril 2003StatutMembreDernière intervention 1 juin 2009 12 déc. 2008 à 03:02
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és1Date d'inscriptionvendredi 16 novembre 2007StatutMembreDernière intervention 5 décembre 2007 5 déc. 2007 à 15:17
Je recherchais exactement un code comme cela.
Simple et efficace
Merci !
10/10
PS fonctionne en vb.net
MrOsmose
Messages postés24Date d'inscriptiondimanche 4 juillet 2004StatutMembreDernière intervention18 avril 2007 13 mars 2007 à 14:18
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 ;)
xavsanenzo
Messages postés1Date d'inscriptionjeudi 14 août 2003StatutMembreDernière intervention22 mai 2004 22 mai 2004 à 01:50
Le Tableur EXCEL comporte 256 colonnes (IV) et + de 65000 lignes. C'est EXCEL, c'est tout. En changeant l'affichage des colonnes par les options == styles L1C1 pour utiliser les formules EXCEL en VBA. Sinon, bon code
cs_thitoune
Messages postés124Date d'inscriptionmardi 19 février 2002StatutMembreDernière intervention 7 mars 20042 7 mars 2004 à 03:10
Je ne vois pas pkoi le no de colonne serait limité à 256 ???
cs_LuTo
Messages postés102Date d'inscriptionmercredi 9 janvier 2002StatutMembreDernière intervention 6 juin 2010 22 déc. 2003 à 14:49
Tiens, je croyais que le nombre max de colonnes dans Excel etait 256.
jmlucienvb
Messages postés129Date d'inscriptionmercredi 24 septembre 2003StatutMembreDernière intervention12 février 2009 17 déc. 2003 à 07:58
Il me semble que tu peux obtenri cela très simplement :
MsgBox ActiveCell.Row & " " & ActiveCell.Column
te renverras 1 1 si la cellule active est A1
Bon code
17 févr. 2012 à 19:41
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
1 déc. 2009 à 17:29
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
12 déc. 2008 à 03:02
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
5 déc. 2007 à 15:17
Simple et efficace
Merci !
10/10
PS fonctionne en vb.net
13 mars 2007 à 14:18
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 ;)
22 mai 2004 à 01:50
7 mars 2004 à 03:10
22 déc. 2003 à 14:49
17 déc. 2003 à 07:58
MsgBox ActiveCell.Row & " " & ActiveCell.Column
te renverras 1 1 si la cellule active est A1
Bon code