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 :

Variables currency et single


Sujet :

Macros et VBA Excel

  1. #1
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut Variables currency et single
    Bonjour,

    Un utilisateur me pose une colle sur les variables de type single et currency. Avec la valeur 1500.15678 en B2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim ValMonetaire As Currency, ValSingle  As Single
     
    ValMonetaire = Cells(2, 2).Value
    ValSingle = Cells(2, 2).Value
     
    Cells(5, 2).Value = ValMonetaire
    Cells(7, 2).Value = ValSingle
    je récupère 1500.15673828125 en B7 (format standard et barre de formule)
    1500.16€ en B5 (format monétaire 2 décimales et 1500.16 dans la barre de formule)

    Avez-vous une explication ?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    j'obtiens le même résultat en direct sans les variables - inutiles - alors c'est le résultat de la conversion monétaire.

    Pour de la précision utiliser   CDbl   …

    ___________________________________________________________________________________________________________
    Je suis Paris, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Oui si le format est déjà au format monétaire. Si le format est au format standard, pourquoi une valeur à 5 décimales en entrée donne-t-elle un résultat à deux décimales ? Pour le type Single, comment expliquer le résultat ?

    Merci d'avance.

    Daniel

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Non, c'est dû au format de conversion, voir les explications déjà présentes sur le net et même peut-être déjà sur ce forum.

    Aucun souci en format Double …

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Aucun souci en format Double
    Les variables de type Currency sont stockées sous la forme de nombres de 64 bits (8 octets).
    Ce type de données est utilisé dans les calculs monétaires ou dans les calculs à virgule fixe pour lesquels une grande précision est requise
    Donc plus sûr que le format Double

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    et pour compléter Currency est en Entier à virgule fixe 4 décimales (d'où la précision supérieure à un Double, celle d'un entier mais avec des décimales limitées) dont 2 d'affichées, les 2 suivantes sont justement là pour s'affranchir des problèmes de pertes de précisions dues aux conversions.
    Avec on a des centimes exacts ce qui est leur but, contrairement à un stockage avec mantisse et exposant (réel flottant)
    eric

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Merci pour tes explications. Cependant, le report de la variable au format Currency tronque le résultat à deux décimales. La variable étant limitée à 4 décimales, je ne comprends pas pourquoi la cellule n'en comporte que deux.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    1500.16 pour 1500.15678 ce n'est pas tronquer mais arrondir.
    Comme je l'ai dit, le but d'un Currency est d'avoir des centimes exacts pour les comptabilités.
    Un currency n'est pas fait pour calculer sur 5 décimales, tu en perds déjà une d'office, mais pour avoir 2 décimales exactes.
    Pour ça il affiche 2 décimales mais calcule sur 4 (décimales que tu peux voir, dans vba tu lis 1500.1568).

    Un peu comme une calculette qui semble toujours afficher le bon résultat sans problème de perte suite aux conversions.
    Elle n'y est pas plus insensible, mais va afficher l'arrondi sur 15 digit par exemple alors qu'en interne elle aura calculé sur 18.
    Mais attention que sur feuille ton Currency redevient un Double. Il n'est et ne reste Currency (entier à virgule fixe) qu'en vba.

    Peut-être que ce petit test t'éclairera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim v1 As Double, v2 As Double, i As Long
    'Dim v1 As Currency, v2 As Currency, i As Long
    v1 = 0.1: v2 = 0
    For i = 1 To 10
        v2 = v2 + v1
        If Round(v2, 1) <> v2 Then MsgBox "delta pour i=" & i & vbLf & v2 - Round(v2, 1): Exit For
    Next i
    Lance-ce avec des Double, puis ensuite en inversant les déclarations pour avoir des Currency

  9. #9
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par Daniel.C Voir le message
    Bonjour,

    Merci pour tes explications. Cependant, le report de la variable au format Currency tronque le résultat à deux décimales. La variable étant limitée à 4 décimales, je ne comprends pas pourquoi la cellule n'en comporte que deux.
    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
    Sub EcrireValeurMonetaire()
     
    Dim mynumber As Variant
     
    Range("A1").Value = CDbl(100.123456)
    Range("A1").NumberFormat = "#,##0.0000 $"
    'Range("A1").NumberFormat = ""
     
    mynumber = Range("A1").Value
    If TypeName(mynumber) = "Currency" Then
       Call MsgBox("currency " & mynumber)
    End If
     
    'Ecrire valeur de type Double
    Range("A1").Value = CDbl(mynumber)
    mynumber = Range("A1").Value
    If TypeName(mynumber) = "Currency" Then
       Call MsgBox("currency " & mynumber)
    End If
     
    'Ecrire valeur de type Currency
    Range("A1").Value = mynumber
    mynumber = Range("A1").Value
    If TypeName(mynumber) = "Currency" Then
       Call MsgBox("currency " & mynumber)
    End If
    End Sub

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Merci pour vos réponses. J'ai obtenu une Réponse concernant le nombre de décimales dans la cellule Excel. Pour obtenir les 4 décimales statutaires, il faut utiliser "Value2" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim ValMonetaire As Currency
    ValMonetaire = 1500.1568
    Range("B5:B6").NumberFormat = "General"
    Range("B5").Value = ValMonetaire
    Debug.Print Range("B5").Value
    Range("B6").Value2 = ValMonetaire
    Debug.Print Range("B6").Value2
     
    ?Range("B5").Value => 1500.16
    ?Range("B6").Value2 =>W 1500.1568
    (communiqué par Gustav Brock)

Discussions similaires

  1. Conserver le format d'une cellule définie en variable (currency)
    Par 419 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/03/2016, 23h18
  2. Réponses: 14
    Dernier message: 26/03/2011, 15h48
  3. variable de type single dans FormulaR1C1
    Par bbouling dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/04/2008, 15h25
  4. [fmincon] Problème avec des variables de classe Single
    Par Wassim123 dans le forum MATLAB
    Réponses: 5
    Dernier message: 11/10/2007, 17h01

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