Encore un 'tite Function VBA ?

bonjour,

Je travaille sur un convertisseur VBA capable de convertir un nombre en lettre ou :

1 = A

2 = B

27 = AB

53 = BA

703=AAA

17602 =AAAA

...inutile de dépasser ZZZZ

Et vice-versa il me faudrait aussi le décodeur qui va bien avec !

p.e. PNM = 11193 !

Merci

A+

Bonsoir,

trouvé sur le net :

Function ConvertToLetter(Cel As Range) As String
    Dim a As Long
    Dim b As Long
    Dim iCol As Long
    iCol = Cel.Value
    a = iCol
    ConvertToLetter = ""
    Do While iCol > 0
       a = Int((iCol - 1) / 26)
       b = (iCol - 1) Mod 26
       ConvertToLetter = Chr(b + 65) & ConvertToLetter
       iCol = a
    Loop
End Function

Ceci donne les lettres par rapport au nombre.

@ bientôt

LouReeD

Bonsoir,

dans la même idée mais en mode bricolage de mon côté (pas regardé sur internet):

Function f_numberToZZZZ(ByVal nombre As Long) As String
Dim resultat As String
Dim Valeurs As New Collection
Dim test
Dim indValeur As Integer

Do
    Set Valeurs = New Collection
    Valeurs.Add nombre
    Do
        indValeur = Valeurs.Count
        test = (Valeurs(indValeur) - 1) \ 26

        If test > 0 Then Valeurs.Add test
    Loop Until test = 0

    resultat = resultat & Chr(64 + Valeurs(indValeur))
    nombre = nombre - (26 ^ (indValeur - 1)) * Valeurs(indValeur)
Loop Until nombre <= 0

f_numberToZZZZ = resultat
End Function

Function f_ZZZZtoNumber(ByVal texte As String) As Long
Dim resultat As Long
Dim puissance As Integer, numCar As Integer

numCar = 1
puissance = Len(texte) - 1

Do
    resultat = resultat + (Asc(Mid(texte, numCar, 1)) - 64) * 26 ^ puissance
    numCar = numCar + 1
    puissance = puissance - 1
Loop While numCar <= Len(texte)

f_ZZZZtoNumber = resultat
End Function

Bonsoir Ausecour !

Ceci pourrait faire un petit exercice ! Je garde car j'en comprend le principe !

@ bientôt

LouReeD

re,

à mon avis, la méthode de LouReeD mais avec 26^2 pour division et puis on utilise les lettres de l'adresse de la colonne entre 1 et 26^2

Bonjour,

Oui j'avais omis de préciser mais la conversion des colonnes je l'utilisais déjà mais c'est un petit peu agaçant car limité à 16385

Function BIDON(x&)
Dim S$
   If x < 16385 Then
      S = Cells(x).Address
      BIDON = Split(S, "$")(1)
   Else
      MsgBox "Dépassement de capacité"
   End If
End Function

En revanche les fonctions de Ausecours sont impeccables. Je valide !

A+

Bonjour,

l'opération inverse, conversion de Alpha vers Num:

Function Convert_Num(Valeur As String) As Long
    Dim Result As Long, i As Long, p As Long, Val_Num As Long
    Dim Car As String
    For i = Len(Valeur) To 1 Step -1
        Car = Mid(Valeur, i, 1)
        If i = Len(Valeur) Then
            Result = Int(Asc(Car) - 64)
        Else
            p = Len(Valeur) - i
            Puissance = 1
            Do While p > 0
                Puissance = Puissance * 26
                p = p - 1
            Loop
            Val_Num = Int(Asc(Car) - 64) * Puissance
            Result = Result + Val_Num
        End If
    Next i
    Convert_Num = Result
End Function

Cdlt

Bonjour,

Bon eh bien content que mon bricolage serve!

Bonne journée à vous

Bonjour,

Arturo83 : La première partie du if est inutile : Le Else est suffisant.

A+

Oui effectivement, j'ai pas cherché à fignoler, mais est-ce que cela donne les résultats souhaités?

oui c'est correct.

A+

Rechercher des sujets similaires à "encore tite function vba"