OVH Cloud OVH Cloud

Hexavigesimal

7 réponses
Avatar
percyval
je desire faire une fonction qui permettrai de numeroter de la meme facon que
le fait excell pour les entetes de colonne
(1=A....26=Z...27=AA.........104=CZ)

j'ai une fonction qui marche moyen car elle plante a chaque fois qu'elle
tombe sur "Z" :/

si un de vous peu me filer un coup de main

Private Const Chaine26 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

'Decimal vers Hexavigesimal windows
Function DecToB26(ByVal Value As String) As String
If Not IsNumeric(Value) Then Return Value
Dim v1 As Long
Dim Resultat As String = ""
Do While (Value > 0)
v1 = (Value Mod 26)
Value = Int(Value / 26)
Resultat = Mid$(Chaine26, 0 + v1, 1) & Resultat
Loop
Return Resultat
End Function

Par contre la fonction inverse fonctionne impec

'Hexavigesimal windows vers Decimal
Function B26ToDec(ByVal MyString As String) As Decimal
If IsNumeric(MyString) Then Return MyString
Dim v2 As Decimal
Dim i As Integer
Dim j As Byte
Dim Resultat As Decimal
'Virer les Espaces
Dim MyString2 As String = MyString.Replace(" ", "").ToUpper
For i = Len(MyString2) To 1 Step -1
v2 = InStr(1, Chaine26, Mid$(MyString2, i, 1))
If v2 < 1 Then Return Resultat
If v2 >= 27 Then Return Resultat
For j = 1 To (Len(MyString2) - i)
v2 = v2 * 26
Next
Resultat = Resultat + v2
Next
Return Resultat
End Function

7 réponses

Avatar
jm
"percyval" wrote in message
news:
je desire faire une fonction qui permettrai de numeroter de la meme facon
que
le fait excell pour les entetes de colonne
(1=A....26=Z...27ª.........104=CZ)

j'ai une fonction qui marche moyen car elle plante a chaque fois qu'elle
tombe sur "Z" :/

si un de vous peu me filer un coup de main

Private Const Chaine26 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

'Decimal vers Hexavigesimal windows
Function DecToB26(ByVal Value As String) As String
If Not IsNumeric(Value) Then Return Value
Dim v1 As Long
Dim Resultat As String = ""
Do While (Value > 0)
v1 = (Value Mod 26)
Value = Int(Value / 26)
Resultat = Mid$(Chaine26, 0 + v1, 1) & Resultat
Loop
Return Resultat
End Function



Hello,

j'ai réécrit en VB6, mais tu n'auras pas de mal à
adapter.

Il faut faire un modulo 27, sinon tu ne vois jamais le 26eme
D'autre part, il faut tester explicitement le cas v1=0 pour
justement repasser à 1, car le premier caractère d'une chaine
en VB est à l'offset 1.

En C, c'est plus commode car les chaines commencent à l'offset 0.
Tu aurais pu aussi t'en sortir en utilisant un tableau commençant à
0 pour stocker tes lettres, au lieu d'une chaine.

Bref, voici la chose, testée et tout ça:


Function DecToB26(ByVal Value As Long) As String
Dim v1 As Long
Dim Resultat As String

Do While (Value > 0)
v1 = (Value Mod 27)
If v1 = 0 Then v1 = 1
Value = Int(Value / 27)
Resultat = Mid$(Chaine26, v1, 1) & Resultat
Loop
DecToB26 = Resultat
End Function


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
percyval
"jm" a écrit :

"percyval" wrote in message
news:
> je desire faire une fonction qui permettrai de numeroter de la meme facon
> que
> le fait excell pour les entetes de colonne
> (1=A....26=Z...27ª.........104=CZ)
>
> j'ai une fonction qui marche moyen car elle plante a chaque fois qu'elle
> tombe sur "Z" :/
>
> si un de vous peu me filer un coup de main
>
> Private Const Chaine26 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
>
> 'Decimal vers Hexavigesimal windows
> Function DecToB26(ByVal Value As String) As String
> If Not IsNumeric(Value) Then Return Value
> Dim v1 As Long
> Dim Resultat As String = ""
> Do While (Value > 0)
> v1 = (Value Mod 26)
> Value = Int(Value / 26)
> Resultat = Mid$(Chaine26, 0 + v1, 1) & Resultat
> Loop
> Return Resultat
> End Function

Hello,

j'ai réécrit en VB6, mais tu n'auras pas de mal à
adapter.

Il faut faire un modulo 27, sinon tu ne vois jamais le 26eme
D'autre part, il faut tester explicitement le cas v1=0 pour
justement repasser à 1, car le premier caractère d'une chaine
en VB est à l'offset 1.

En C, c'est plus commode car les chaines commencent à l'offset 0.
Tu aurais pu aussi t'en sortir en utilisant un tableau commençant à
0 pour stocker tes lettres, au lieu d'une chaine.

Bref, voici la chose, testée et tout ça:


Function DecToB26(ByVal Value As Long) As String
Dim v1 As Long
Dim Resultat As String

Do While (Value > 0)
v1 = (Value Mod 27)
If v1 = 0 Then v1 = 1
Value = Int(Value / 27)
Resultat = Mid$(Chaine26, v1, 1) & Resultat
Loop
DecToB26 = Resultat
End Function




Merci pour ta reponse rapide :)

mais .... a marche juste un peu plus loin que la mienne

26 = Z
27 = AA
28 = AA !!
29 = AB

v tester avec un tableau comme tu disait plus haut
Avatar
jm
"percyval" wrote in message
news:


"jm" a écrit :

"percyval" wrote in message
news:
> je desire faire une fonction qui permettrai de numeroter de la meme
> facon
> que
> le fait excell pour les entetes de colonne
> (1=A....26=Z...27ª.........104=CZ)




Merci pour ta reponse rapide :)

mais .... a marche juste un peu plus loin que la mienne

26 = Z
27 = AA
28 = AA !!
29 = AB

v tester avec un tableau comme tu disait plus haut




arf oui tu as raison, j'ai posté trop vite. un petit ajustement s'impose,
car c'est le
Value = Int(Value / 27)
qui n'est pas correct. Il faut tenir compte du cas particulier ou on a forcé
v1 à 1.

--
jean-marc
Avatar
percyval
"jm" a écrit :

"percyval" wrote in message
news:
>
>
> "jm" a écrit :
>
>> "percyval" wrote in message
>> news:
>> > je desire faire une fonction qui permettrai de numeroter de la meme
>> > facon
>> > que
>> > le fait excell pour les entetes de colonne
>> > (1=A....26=Z...27ª.........104=CZ)
>>
>>
> Merci pour ta reponse rapide :)
>
> mais .... a marche juste un peu plus loin que la mienne
>
> 26 = Z
> 27 = AA
> 28 = AA !!
> 29 = AB
>
> v tester avec un tableau comme tu disait plus haut


arf oui tu as raison, j'ai posté trop vite. un petit ajustement s'impose,
car c'est le
Value = Int(Value / 27)
qui n'est pas correct. Il faut tenir compte du cas particulier ou on a forcé
v1 à 1.

--
jean-marc




Pas gagné
j'ai trouvé sur ton site dans les faq un code que j'ai modifié mais
toujours un pb sur ce foutu "Z"

'Decimal vers Hexavigesimal windows
Public Function DecimalToB26(ByVal nNumber As Long) As String
Do While (nNumber >= 26)
DecimalToB26 = NumberToSymbol((nNumber Mod 26)) & DecimalToB26
nNumber = nNumber 26
Loop
DecimalToB26 = NumberToSymbol(nNumber) & DecimalToB26
End Function

Public Function NumberToSymbol(ByVal nNumber As Long) As String
NumberToSymbol = Chr(Asc("A") + (nNumber - 1))
End Function

Percyval ..... continu de ramer
Avatar
percyval
"jm" a écrit :

"percyval" wrote in message
news:
>
>
> "jm" a écrit :
>
>> "percyval" wrote in message
>> news:
>> > je desire faire une fonction qui permettrai de numeroter de la meme
>> > facon
>> > que
>> > le fait excell pour les entetes de colonne
>> > (1=A....26=Z...27ª.........104=CZ)
>>
>>
> Merci pour ta reponse rapide :)
>
> mais .... a marche juste un peu plus loin que la mienne
>
> 26 = Z
> 27 = AA
> 28 = AA !!
> 29 = AB
>
> v tester avec un tableau comme tu disait plus haut


arf oui tu as raison, j'ai posté trop vite. un petit ajustement s'impose,
car c'est le
Value = Int(Value / 27)
qui n'est pas correct. Il faut tenir compte du cas particulier ou on a forcé
v1 à 1.

--
jean-marc




Je continu de chercher..

J'ai bien trouvé un code sur ton site que j'ai modifié mais toujours un pb
sur le "Z"

'Decimal vers Hexavigesimal windows
Public Function DecimalToB26(ByVal nNumber As Long) As String
Do While (nNumber >= 26)
DecimalToB26 = NumberToSymbol((nNumber Mod 26)) & DecimalToB26
nNumber = nNumber 26
Loop
DecimalToB26 = NumberToSymbol(nNumber) & DecimalToB26
End Function

Public Function NumberToSymbol(ByVal nNumber As Long) As String
NumberToSymbol = Chr(Asc("A") + (nNumber - 1))
End Function

je rame je ram
Avatar
Vincent Guichard
si le récursif ne te dérange pas,

Private Function DecimalToB26(ByVal nNumber As Long) As String
Const s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
If nNumber <= 0 Then Exit Function
Dim i As Integer
i = ((nNumber - 1) Mod 26) + 1
nNumber = (nNumber - i) 26
DecimalToB26= DecimalToB26(nNumber) & Mid(s, i, 1)
End Function

devrais faire l'affaire

Vincent Guichard
Avatar
Jean-marc
"Vincent Guichard" a écrit dans le message de
news: 4566dd11$0$5083$
si le récursif ne te dérange pas,

Private Function DecimalToB26(ByVal nNumber As Long) As String
Const s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
If nNumber <= 0 Then Exit Function
Dim i As Integer
i = ((nNumber - 1) Mod 26) + 1
nNumber = (nNumber - i) 26
DecimalToB26= DecimalToB26(nNumber) & Mid(s, i, 1)
End Function



Hello,

En complément de la réponse de Vincent, voici ma version,
non récursive:

Public Function DecimalToB26(ByVal n As Long) As String
Dim szResult As String
Dim v As Long

While n > 0
v = (n - 1) Mod 26
n = (n - 1) 26
szResult = Chr$(65 + v) & szResult
Wend
DecimalToB26 = szResult
End Function

Les 2 fonctions sont testées et retournent bien sur les mêmes valeurs :-)

Nos 2 fonctions (faites séparément, je précise!) utilisent la même astuce
à savoir de travailler sur (nombre - 1) pour tenir compte du fait que dans
cette numérotation, il n'y a pas de 0.

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/