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 :

Arrondi au Nème chiffre après la virgule


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut Arrondi au Nème chiffre après la virgule
    Bonjour,

    Dans le cadre de retraitement de données, j'ai besoin de convertir des montants en devise locale. Pour celà, je dispose de taux de change mensuels que j'inclue dans mes macros de retraitement de fichier. Les taux de change que l'on me donne sont fixés au 6ème chiffre après la virgule. Ci-dessous mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Montant en €
     
            Dim ClosingRate As Single, AverageRate As Single, EURAmount As Range
            ClosingRate = Round(CDbl(InputBox("Entrez le taux de clôture CZK => EUR (Séparateur de décimal => virgule)", "Définition du taux de clôture")), 6)
            AverageRate = Round(CDbl(InputBox("Entrez le taux moyen CZK => EUR (Séparateur de décimal => virgule)", "Définition du taux moyen")), 6)
     
                For Each EURAmount In .Range("F2:F" & BSE)
                    EURAmount.Value = EURAmount.Offset(0, -1).Value / ClosingRate
                Next EURAmount
     
                For Each EURAmount In .Range("F" & PNLS & ":F" & PNLE)
                    EURAmount.Value = EURAmount.Offset(0, -1).Value / AverageRate
                Next EURAmount

    La variable "BSE" a bien été définie en amont. Mon problème dans ce cas concret, mes deux taux de change sont 24,223000 et 24,654205.
    Lors de la vérification de mes données après exécution de ma macro, voilà les deux taux de change ressortis : 24,2229995727539 et 24,6542053222656.
    Cela peut vous sembler idiot car l'écart global généré est de 0,05 mais ce n'est pas acceptable par le logiciel dans lequel je charge ces données. Pourriez-vous SVP m'aider à trouver une solution pour palier à ce souci ?

    D'avance merci !

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub AAA()
    Dim MaVar As Double
     
    MaVar = 24.6542053222656
    MsgBox Application.Round(MaVar, 6)
    End Sub

  3. #3
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Bonjour mercatog,

    Tout d'abord, merci pour ton aide
    En passant par deux variables comme ceci grâce à du pompage de ton code, j'ai bien le résultat escompté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim ClosingRate As String, AverageRate As String, ClosingRate1 As Single, AverageRate1 As Single, EURAmount As Range
            ClosingRate = InputBox("Entrez le taux de clôture CZK => EUR (Séparateur de décimal => virgule)", "Définition du taux de clôture")
            AverageRate = InputBox("Entrez le taux moyen CZK => EUR (Séparateur de décimal => virgule)", "Définition du taux moyen")
            ClosingRate1 = Round(ClosingRate, 6)
            AverageRate1 = Round(AverageRate, 6)
     
                For Each EURAmount In .Range("F2:F" & BSE)
                    EURAmount.Value = EURAmount.Offset(0, -1).Value / ClosingRate1
                Next EURAmount
     
                For Each EURAmount In .Range("F" & PNLS & ":F" & PNLE)
                    EURAmount.Value = EURAmount.Offset(0, -1).Value / AverageRate1
                Next EURAmount
    Peux-tu par contre m'expliquer pourquoi je ne pouvais pas le faire "one shot" STP ? Merci !

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim MaVar As Double
    MaVar = CDbl(InputBox("Entrez le taux de clôture CZK => EUR (Séparateur de décimal => virgule)", "Définition du taux de clôture"))
    Ça m'étonne que ça fonctionne avec la virgule comme séparateur.

  5. #5
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Je me suis planté, ça ne fonctionne pas. Uniquement si je dimensionne tout en String, là il me gardera les valeurs entrée dans l'Inputbox mais si j'ai plus de 6 chiffres après la virgule, alors je ne vais pas pouvoir arrondir...

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    1. InputBox renvoit une valeur de type string (fais un F1 sur).
    2. Le séparateur décimal en vba est toujours le point.

    De ce fait, on doit convertir le texte saisi dans l'inputbox avec la virgule comme "séparateur"

    Teste ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub AAA()
    Dim MaRep As String
    Dim MaVar As Double
     
    MaRep = InputBox("Entrez le taux de clôture CZK => EUR (Séparateur de décimal => virgule)", "Définition du taux de clôture")
    If MaRep <> "" Then
        MaVar = Round(Val(Replace(MaRep, ",", ".")), 6)
        MsgBox MaVar
    End If
    End Sub

  7. #7
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Re,

    En suivant l'exemple du code que tu m'as donné, voilà ce que j'ai écrit :

    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
    'Montant en €
     
            Dim ClosingRate0 As String, AverageRate0 As String, ClosingRate As Single, AverageRate As Single, EURAmount As Range
            ClosingRate0 = InputBox("Entrez le taux de clôture CZK => EUR (Séparateur de décimal => ',')", "Définition du taux de clôture")
            AverageRate0 = InputBox("Entrez le taux moyen CZK => EUR (Séparateur de décimal => ',')", "Définition du taux moyen")
            ClosingRate = Round(Replace(ClosingRate0, ",", "."), 6)
            AverageRate = Round(Replace(AverageRate0, ",", "."), 6)
     
                For Each EURAmount In .Range("F2:F" & BSE)
                    EURAmount.Value = EURAmount.Offset(0, -1).Value / ClosingRate
                Next EURAmount
     
                For Each EURAmount In .Range("F" & PNLS & ":F" & PNLE)
                    EURAmount.Value = EURAmount.Offset(0, -1).Value / AverageRate
                Next EURAmount
    Excel m'a insulté, "Run-time error '13' Type mismatch".
    Je crois que je vais pas m'embêter, je vais définir la variable en string, avec une saisie du séparateur de décimal en virgule et au diable l'arrondi !

  8. #8
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    bjr,

    Citation Envoyé par Runsh63 Voir le message
    Excel m'a insulté, "Run-time error '13' Type mismatch".

    mercatog avait mis un Val que tu as retiré...

  9. #9
    Membre confirmé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Points : 478
    Points
    478
    Par défaut
    Cette fois c'est bon, en ne déterminant pas ma variable en Single mais en appliquant mon arrondi directement sur ma variable String, c'est bon. Merci pour m'avoir aiguillé mercatog !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim ClosingRate As String, AverageRate As String, EURAmount As Range
            ClosingRate = Round(InputBox("Entrez le taux de clôture CZK => EUR (Séparateur de décimal => virgule)", "Définition du taux de clôture"), 6)
            AverageRate = Round(InputBox("Entrez le taux moyen CZK => EUR (Séparateur de décimal => virgule)", "Définition du taux moyen"), 6)
     
                For Each EURAmount In .Range("F2:F" & BSE)
                    EURAmount.Value = EURAmount.Offset(0, -1).Value / ClosingRate
                Next EURAmount
     
                For Each EURAmount In .Range("F" & PNLS & ":F" & PNLE)
                    EURAmount.Value = EURAmount.Offset(0, -1).Value / AverageRate
                Next EURAmount
    En effet Arkham46, je n'avais pas suivi le code mercatog à la lettre, honte à moi...
    C'est bon, c'est reglé !

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

Discussions similaires

  1. [POI]: définir une cellule arrondi a 2 chiffre après la virgule
    Par mouss4rs dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 22/02/2012, 15h04
  2. Float et affichage de 3 chiffres après la virgule sans arrondi
    Par Lolitaaa dans le forum Général Java
    Réponses: 3
    Dernier message: 20/05/2011, 10h59
  3. Réponses: 3
    Dernier message: 22/03/2011, 07h41
  4. Arrondi à 2 chiffres après la virgule
    Par Telemak dans le forum Général Java
    Réponses: 9
    Dernier message: 18/01/2009, 16h46
  5. [langage] Arrondi 2 chiffre après la virgule
    Par pacificc dans le forum Langage
    Réponses: 4
    Dernier message: 19/05/2005, 23h44

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