IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA excel: Ajouter des zéros après une virgule


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut VBA excel: Ajouter des zéros après une virgule
    Bonjour,

    Je possède deux colonnes avec des chiffres dans ce style là:

    16,265 <-> 16265
    19,324<-> 19324
    1,25<-> 1250
    1,9<-> 1900
    etc...

    Ces chiffres proviennent d'une extraction d'un progiciel qui me les donne tels quels, impossible de changer la mise en forme.

    Le problème vient donc de la virgule, au lieu de mettre 1,900 excel me met 1,9
    Donc si j'enlève toutes les virgules j'ai un problème de valeur évident.

    Voici ce que je voudrais obtenir :
    16,265 <-> 16265
    19,324<-> 19324
    1,25<-> 1250
    1,9<-> 1900

    Je sais quelles sont les étapes à effectuer mais je ne sais pas programmer, pouvez-vous m'aider à entre le code suivant?

    si pas de virgule --> ne rien faire
    si 3 chiffres après la virgule--> ne rien faire
    si 2 chiffres après la virgule --> ajouter 1 zéro
    si 1 chiffre après la virgule --> ajouter 2 zéros

    Puis enlever la virgule
    Puis faire un séparateur de millier


    En espérant apprendre des choses,
    Sincères salutations,
    Anita

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Précisions, svp!
    Hello,

    J'ai un petit doute sur l'expression du besoin: en fait, je pense que s'il n'y a pas de virgule, il faut ajouter 3 zéros au lieu de ne rien faire, comme indiqué. Correct?

    Les chiffres reçus du progiciel sont formattés en millier avec la virgule symbolisant cette unité avec -si j'ai bien compris- l'absence de valeurs inférieures à 1.00 (e.g. 123.45 est reçu comme 123). Toujours correct?

    Par ailleurs, qu'en est-il des montant supérieurs à 999'999.99? Les montants reçus sont-ils au format 1,000,000 ou en est-il autrement?

    Avec des réponses précisant ces points, on devrait pouvoir aisément progresser.

    A plus!

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je reprends ton exemple
    16,265 <-> 16265
    19,324<-> 19324
    1,25<-> 1250
    1,9<-> 1900
    En supposant que les nombres décimaux se trouvent en colonne A et que tu souhaites voir le résultat en colonne B, tu fais simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(NoLigne, 2).value = Cells(NoLigne, 1).value * 1000

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Je reprends ton exemple
    16,265 <-> 16265
    19,324<-> 19324
    1,25<-> 1250
    1,9<-> 1900
    En supposant que les nombres décimaux se trouvent en colonne A et que tu souhaites voir le résultat en colonne B, tu fais simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(NoLigne, 2).value = Cells(NoLigne, 1).value * 1000
    J'ai effectivement pensé à ça mais j'ai des chiffres inférieurs à 1000

    Exemple 566

    Si je multiplie tout par mille 566 deviendra 566 000 ce qui est une erreur

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par loris Voir le message
    Hello,

    J'ai un petit doute sur l'expression du besoin: en fait, je pense que s'il n'y a pas de virgule, il faut ajouter 3 zéros au lieu de ne rien faire, comme indiqué. Correct?

    Les chiffres reçus du progiciel sont formattés en millier avec la virgule symbolisant cette unité avec -si j'ai bien compris- l'absence de valeurs inférieures à 1.00 (e.g. 123.45 est reçu comme 123). Toujours correct?

    Par ailleurs, qu'en est-il des montant supérieurs à 999'999.99? Les montants reçus sont-ils au format 1,000,000 ou en est-il autrement?

    Loris tu as raison je vais clarifier un peu mieux les choses:

    Le progiciel me renvoie des valeurs entières comprises entre 0 et parfois plusieurs centaines de millions.
    Jamais de décimales.

    donc si il n'y a pas de virgules, cela veut dire que le chiffre est inférieur à 1000, donc il ne faut surtout pas ajouter des zéros et le laisser tel quel


    si le progiciel renvoie 1,256 cela signifie 1256
    pour 1,9 cela signifie 1900
    pour 854 cela signifie 854
    pour 94,521,21 cela signifie 94521210



    Donc en fait il faudrait programmer ceci :

    Cas 1:pas de virgule
    - ne rien faire

    Cas 2: une ou plusieurs virgule(s)
    -si 3 chiffres après la dernière virgule--> ne rien faire
    -si 2 chiffres après la dernière virgule --> ajouter 1 zéro
    -si 1 chiffre après la dernière virgule --> ajouter 2 zéros

    Puis enlever les virgules (en générale je passe par excel : ctrl-h et je remplace "," par "")
    Puis faire un séparateur de millier

  6. #6
    Membre averti Avatar de casavba
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    455
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 455
    Points : 323
    Points
    323
    Par défaut
    Bonjour

    Essaies ça et tiens moi au courant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Sub Anita()
     
    Dim counter As Integer
    Dim Position As Integer
    Dim j As Integer
    Dim W As Integer
     
     
    For counter = 1 To Feuil1.Cells(65536, 1).End(xlUp).Row
     
        If Cells(counter, 1).Value Like "*,*" Then
                For j = 1 To Len(Cells(counter, 1).Value)
                    If Mid(Cells(counter, 1).Value, j, 1) = "," Then
                        Position = j
                    End If
                Next j
                    If Len(Cells(counter, 1).Value) - Position = 1 Then
                            Cells(counter, 2).Value = Cells(counter, 1).Value & "00"
                        ElseIf Len(Cells(counter, 1).Value) - Position = 2 Then
                            Cells(counter, 2).Value = Cells(counter, 1).Value & "0"
                    Else
                        W = InStr(1, StrReverse(Cells(counter, 1).Value), ",") + 1
                            If InStr(W, StrReverse(Cells(counter, 1).Value), ",") = 0 Then
                                Cells(counter, 2).Value = CInt(Format(Cells(counter, 1).Value * 1000, "#,##0"))
                            Else
                                Cells(counter, 2).Value = Cells(counter, 1).Value
                            End If
                    End If
     
            Else
              Cells(counter, 2).Value = Cells(counter, 1).Value
     
        End If
     
    Next counter
     
    End Sub
    Bien évidemment, tes données sont dans la colonne A et tes résultats sont dans la colonne B.

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    pas le temps de peaufiner, mais voilà une idée (qui marche) à alléger comme tu l'entends ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub Command1_Click()
      Dim toto As String
      toto = "1,9"
      MsgBox toto & " ===>> " & convertir(toto)
      toto = "854"
      MsgBox toto & " ===>> " & convertir(toto)
      toto = "94,521,21"
      MsgBox toto & " ===>> " & convertir(toto)
    End Sub
     
    Private Function convertir(toto As String)
      Dim titi
      If InStr(toto, ",") = 0 Then
        convertir = toto
        Exit Function
      End If
      convertir = ""
      titi = Split(toto, ",")
      For i = 0 To UBound(titi) - 1
        convertir = convertir & titi(i)
      Next
      toto = titi(UBound(titi))
      convertir = convertir & toto & String(3 - Len(toto), "0")
    End Function

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub test()
    For i = 1 To 4
        Select Case UBound(Split(Cells(i, 1), ","))
        Case 0
            Cells(i, 2) = Cells(i, 1)
        Case 1
            Cells(i, 2) = Cells(i, 1) * 1000
        Case 2
            Cells(i, 2) = Left(Cells(i, 1), InStr(Cells(i, 1), ",") - 1) & _
                CDbl(Right(Cells(i, 1), Len(Cells(i, 1)) - InStr(Cells(i, 1), ","))) * 1000
        Case 3
            'pour trois virgules
        End Select
    Next
    End Sub
    En décomposant ce qui est fait dans la ligne pour deux virgules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'Lg = Len(Cells(i, 1)) - InStr(Cells(i, 1), ",")
    'Temp = CDbl(Right(Cells(i, 1), Lg))
    'Cells(i, 2) = Left(Cells(i, 1), InStr(Cells(i, 1), ",") - 1) & Temp * 1000

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour Kimai81,

    Ucfoutu et Oukel'n'or : désolé j'étais en train de tester le code quand j'ai vu vos réponses.

    Comme on le sait, il y a toujours plusieurs façons de faire la même chose, alors à toutes fins utiles je propose quand même ma solution qui devrait fonctionner avec un nombre de virgules indéfini :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Sub Affiche_nombre()
      Dim Text, Tableau() As String
      Dim pl, dl, n As Long
      Dim c, cc  As Byte
        'Remplacer 2 par la première ligne de données le cas échéant
        pl = 1
         'Remplacer 1 par le numéro de colonne contenant les données le cas échéant
        pc = 1
     
       dl = Range("A" & Range("A:A").Rows.Count).End(xlUp).Row
     
     For n = pl To dl
       Text = Cells(n, pc)
       'Remplacer 2 par le numéro de colonne libre
       cc = 2
       mv = ""
        Tableau = Split(Text, ",")
         For i = 0 To UBound(Tableau)
         Cells(n, cc) = Tableau(i)
            cc = cc + 1
        Next i
     
            v = Cells(n, cc - 1)
                If Len(v) = 2 Then
                v = v & "0"
                ElseIf Len(v) = 1 Then
                v = v & "00"
                End If
             For c = cc - 2 To 2 Step -1
             v = Cells(n, c) & v
            Next c
    Range(Cells(n, 2), Cells(n, cc)).Select
    Selection.ClearContents
    Cells(n, 2) = v
    Next n
    End Sub

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Ca marche
    Ucfoutu,
    Mon fichier excel n'a pas trop aimé la macro, ça n'a pas marché!
    je ne sais pas pourquoi.
    En tout cas merci énormément pour ton aide

    Jacques jean, Oukel'n'or et casavba:

    Vraiment merci beaucoup, ça marche nickel.
    Apparemment ça n'avait pas l'air si dur à faire mais c'est encore à des années lumières pour moi.

    Petite mention spéciale à casavba dont la macro intègre en plus le séparateur de milliers.

    Merci énormément à tout le monde pour votre contribution.

    Ne voulant pas mourir idiote (bien que blonde), pourrais-je abuser de votre patience pour vous demander quelles sont les actions des méthodes suivantes?

    Len
    InStr
    Ubound
    Split (casser/séparer)??!!??

    Bisous, Anita

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Regarde maintenant...
    On va faire sans le split, juste pour rigoler (et tu apprendras ainsi 2 autres fonctions) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Private Sub Command1_Click()
      Dim toto As String
      toto = "1,9"
      MsgBox toto & " ===>> " & convertir(toto)
      toto = "854"
      MsgBox toto & " ===>> " & convertir(toto)
      toto = "94,521,21"
      MsgBox toto & " ===>> " & convertir(toto)
    End Sub
     
    Private Function convertir(toto As String)
      Dim pos As Integer, titi As String
      pos = InstrRev(toto, ",")
      If pos = 0 Then
        convertir = toto
      Else
        titi = Mid(toto, pos + 1)
        convertir = Replace(Left(toto, pos - 1), ",", "") & titi & String(3 - Len(titi), "0")
      End If
    End Function

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonsoir Kimai81,

    Pour trouver ce que fait une fonction :

    dans le code VBA vous cliquez sur un des caractères de la fonction par exemple Len et vous appuyez sur "F1".

    La fonction Len renvoie le nombre de caractères contenus dans la cellule sélectionnée ou dans la variables qui contient la valeur.

    Regardez de la même façon l'aide pour les autres fonctions dont vous parler.

    Cliquez également sur "Exemple" lorsque cette option est valide.

    Amicalement.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Jacques_jean: merci pour ton aide
    tu peux me tutoyer!

    ucfoutu:
    A mon avis je dois manquer un wagon parce que lorsque j'appuie sur alt+f8, ta macro n'apparaît pas!

    Désolé mais je crois que les choses les plus évidentes sont encore complexes pour moi pauvre débutante.

    J'ai bien intégré toutes les notions : modules, variables, constantes, objets etc... Selon vous, messieurs les spécialistes, par quoi devrai-je commencer pour réussir mes premières lignes de codes?

    Tous conseils sera pris avec attention!!!

    Merci et bonne semaine

  14. #14
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    La macro d'ucfoutu est une procédure événementielle, c'est-à-dire qu'elle est lancée par un événement. Ici, le clic sur le bouton Command1.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Résolu
    Noté AlainTech,

    Merci à tous,
    En espérant pouvoir aider bientôt... c'est pas encore gagné!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-EXcel] classement des noeuds d'une treeview dans l'ordre alphabétique
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/01/2017, 19h02
  2. vba excel translation des données d'une feuille à l'autre
    Par Marc31 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/09/2010, 15h31
  3. Ajouter deux zéros après la virgule
    Par abbd dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/02/2009, 13h28
  4. VBA EXCEL : Concaténation des cellules d'une colonne
    Par kikaillo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/07/2007, 17h37
  5. Réponses: 7
    Dernier message: 11/08/2006, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo