EXCEL VBA - Transformation nombre en code

Résolu
Bonjour à tous,

Voici la question que je me pose :

J'ai une cellule 1 avec un montant à virgule ex : 45,23
Il faut que je transforme cette cellule 1 dans une autre cellule 2 en code à 16 chiffres :
0000000000004523

En fait, j'ai besoin d'une macro qui va me permettre que quelque soit le montant enregistré dans la cellule 1, celui ci est transformé sans virgule en code à 16 chiffres complété par des 0 devant.

Merci d'avance,

Péro

4 réponses

  1. Bonjour,

    Voilà une fonction qui permet de faire ça:

    Function ConvertirChaine(ByVal chaine As Variant) As String 
    
        chaine = Replace(chaine, ",", "") 
         
        While Len(chaine) < 16 
            chaine = "0" & chaine 
        Wend 
         
        ConvertirChaine= chaine 
         
    End Function


    chaine est le contenu de la cellule.

    Si tu as "45,23" dans la cellule B1 et que tu veuilles avoir "0000000000004523" dans la cellule D2:

    Range("D2").Value = ConvertirChaine(Range("B1").value)


    Tu peux également l'utiliser par les fonctions personnalisées.

    ;o)

    «Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
    Nicolas Boileau
    1. Modérateur
      Bonjour,
      2 méthodes :
      Par macro : avec le code suivant :
      Ce code permet de remplacer les chiffres directement dans la cellule active. Donc sélectionner d'abord la cellule contenant 45,23 par exemple. Ne fonctionne que si le séparateur est la virgule.
      Sub transforme_en_16_chiffres()
      Dim longueur As String
      Dim i As Integer
      longueur = "0000000000000000"
      i = Len(Replace(ActiveCell, ",", ""))
      ActiveCell.NumberFormat = "@"
      ActiveCell = Left(longueur, 16 - i) & Replace(ActiveCell, ",", "")
      End Sub

      Par formule :
      Soit en A1, le nombre que vous souhaitez modifier, en B1 inscrire :
      =GAUCHE("0000000000000000";16-NBCAR(A1*10^(NBCAR(A1)-TROUVE(",";A1))))&A1*10^(NBCAR(A1)-TROUVE(",";A1))
      1. Pijaku, j'aime bcp ta méthode par formule, seulement, si mon nombre est avec un zéro à la fin, par exemple 39,40, la formule fait apparaître 0000000000000394 alors qu'il me faudrait : 0000000000003940...
        As-tu une solution pour ça ?
        Merci d'avance
      2. Modérateur
        Si tu aimes ma méthode par formule, je te réponds deux choses :
        1- perso je préfères la macro de Polux
        2- Flatté, mais la solution que je te propose alors est une usine à gaz. Efficace mais...
        La nouvelle formule, teste si :
        - il n'y a pas de virgule (ex renvoie 0000000000000036 si est écrit 36)
        - il n'y a qu'un chiffre après la virgule (ex renvoie 0000000000003640 si est écrit 36,40)

        la voici (attention les yeux, roulement de tambour...) :
        =SI(ESTERREUR(TROUVE(",";A1));GAUCHE("0000000000000000";16-NBCAR(A1))&A1;SI(NBCAR(A1)-TROUVE(",";A1)<2;GAUCHE("0000000000000000";15-NBCAR(A1*10^(NBCAR(A1)-TROUVE(",";A1))))&A1*10^(NBCAR(A1)-TROUVE(",";A1))&0;GAUCHE("0000000000000000";16-NBCAR(A1*10^(NBCAR(A1)-TROUVE(",";A1))))&A1*10^(NBCAR(A1)-TROUVE(",";A1))))

        Ce genre de formule alourdit énormément les classeurs excel il me semble, d'où mon intérêt pour les macros...
    2. Arf, tout fonctionne bien avec ton usine à gaz, sauf que quand je rentre 23,00, ca me marque 0000000000000023 alors qu'il me faudrait 0000000000002300, une solution ? :-)
      1. Modérateur
        Salut,
        Arfffffff! Utilise la macro de Polux....
        Sinon :
        =SI(ESTERREUR(TROUVE(",";A1));GAUCHE("0000000000000000";14-NBCAR(A1))&A1&"00";SI(NBCAR(A1)-TROUVE(",";A1)<2;GAUCHE("0000000000000000";15-NBCAR(A1*10^(NBCAR(A1)-TROUVE(",";A1))))&A1*10^(NBCAR(A1)-TROUVE(",";A1))&0;GAUCHE("0000000000000000";16-NBCAR(A1*10^(NBCAR(A1)-TROUVE(",";A1))))&A1*10^(NBCAR(A1)-TROUVE(",";A1))))
      2. Super !! Ca marche nikel !
        D'ailleurs j'ai mis une autre question .... "Excel, ajouter espaces à texte..."
        Si tu as un peu de temps... LOL
        Merci en tout cas !
    3. Function ConvertirChaine(ByVal chaine As Variant) As String 
         
       If InStr(1, chaine, ",") <> 0 Then
              chaine = Replace(chaine, ",", "")
          Else
              chaine = chaine & "00"
          End If
           
          While Len(chaine) < 16
              chaine = "0" & chaine
          Wend
           
          ConvertirChaine = chaine
      
      End Function