1. #1
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 070
    Points : 14 181
    Points
    14 181

    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.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2013
    Messages
    8 646
    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 : 8 646
    Points : 17 169
    Points
    17 169

    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, …
    . . . . . Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !

  3. #3
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 070
    Points : 14 181
    Points
    14 181

    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
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2013
    Messages
    8 646
    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 : 8 646
    Points : 17 169
    Points
    17 169

    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 …
    . . . . . Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !

  5. #5
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 070
    Points : 14 181
    Points
    14 181

    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
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    février 2007
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 1 232
    Points : 1 895
    Points
    1 895

    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 éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 070
    Points : 14 181
    Points
    14 181

    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.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    février 2007
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 1 232
    Points : 1 895
    Points
    1 895

    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 émérite
    Inscrit en
    octobre 2010
    Messages
    1 326
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 1 326
    Points : 2 529
    Points
    2 529

    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
    Cordialement

    Docmarti.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    septembre 2011
    Messages
    8 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 8 070
    Points : 14 181
    Points
    14 181

    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)
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

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: 01/04/2016, 00h18
  2. Réponses: 14
    Dernier message: 26/03/2011, 16h48
  3. variable de type single dans FormulaR1C1
    Par bbouling dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/04/2008, 16h25
  4. [fmincon] Problème avec des variables de classe Single
    Par Wassim123 dans le forum MATLAB
    Réponses: 5
    Dernier message: 11/10/2007, 18h01

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