1 est inférieur à 1

Bonjour à tous!

J’ai un problème très étrange avec un code VBA tout simple.

J’ai 3 cases (en pourcentage) dont la somme doit être égale à 1, sinon il y a un message d’erreur.

Mon code est donc le suivant :

If (Range("D9") + Range("D10") + Range("D11")) <> 1 Then
        MsgBox ("Sum of percentage of Norg, NH4 and NO3 must be equal to 100")
End If

Tout va bien, SAUF pour le cas très précis où il y a 70% en D9, 20% en D10 et 10% en D11. La somme est donc normalement bien égale à 1 mais il me met le message d’erreur.

(Je n’ai pas essayé toutes les autres combinaisons possible mais quand même un bon nombre et c’est bien la seule pour laquelle ça bug)

Pour comprendre comment la chose était interprété j’ai changé le code en :

If (Range("D9") + Range("D10") + Range("D11")) <> 1 Then
        MsgBox (Range("D9") + Range("D10") + Range("D11"))
End If

Pour mon cas du 70,20,10, il m’ouvre donc une boite de dialogue avec un joli 1…

J’ai aussi testé en mettant « inférieur à »/« supérieur à » au lieu de « différent de » dans le If et c’est quand je mets « inférieur à » qu’il me met le message d’erreur.

Soit j’ai fait une erreur vraiment bête (surtout au vu de la simplicité du code), soit Excel est en train de me dire que 1 est inférieur à 1

Je reste complètement perplexe

Merci pour votre aide.

Bonjour,

Fais le test avec

    If Round(Range("D9"), 0) + Round(Range("D10"), 0) + Round(Range("D11"), 0) <> 100 Then
            MsgBox ("Sum of percentage of Norg, NH4 and NO3 must be equal to 100")
    End If

A+

Bonjour Frangy et merci pour ta réponse.

En fait j'ai voulu "simplifier" les choses dans mon message mais je viens de me rendre compte que ça change tout le problème donc on reprend : mes 3 cases sont en pourcentage, donc le code est le suivant :

If (Range("D9") + Range("D10") + Range("D11")) <> 1 Then
        MsgBox ("Sum of percentage of Norg, NH4 and NO3 must be equal to 100")
End If

(Il y a juste le 100 qui est remplacé par un 1 dans le If)

J'édite mon premier message.

Du coup j'ai essayé ta méthode mais en mettant 1 à la place de 0 dans le round (vu que mes 70, 20 et 10 valent 0,7 0,2 et 0,1), mais le bug persiste.

Avec Range("D9") =0.7, Range("D10")=0.2 et Range("D11")=0.1

si tu effectues l'opération Range("D9") + Range("D10") + Range("D11") - 1

tu obtiens le résultat -1,11022302462516E-16, alors que tu attends 0.

D'où la nécessité d'arrondir

    If Round(Range("D9") + Range("D10") + Range("D11"), 10) <> 1 Then
            MsgBox ("Sum of percentage of Norg, NH4 and NO3 must be equal to 100")
    End If

A+

Bonsoir,

Dans les options Excel cocher "Définir le calcul calcul avec la précion au format affiché"

precision

A+

Bonjour,

Merci à vous 2, effectivement vos 2 solutions marchent

Mais j'aimerais bien comprendre le pourquoi, du comment.

Pourquoi Range("D9") + Range("D10") + Range("D11") - 1 ne donne pas 0? Alors que quand je fais Range("D9") + Range("D10") + Range("D11") ça me donne bien 1.

Et pourquoi SEULEMENT dans le cas de 0,7 0,2 et 0,1 ??

En tout cas, merci.

Bonjour,

Je te rassure, ce n'est pas seulement dans ce cas...

C'est lié au mode de fonctionnement d'Excel.

Pour la plupart des calculs "ordinaires" cette option est souvent préférable.

Je me demande bien d'ailleurs pourqoi elle n'est pas cochée par défaut...

A+

Bonjour à tous,

Elle n'est pas cochée par défaut car si, visuellement, on a l'impression d'avoir un calcul plus exact, en fait on ne fait qu'accumuler des erreurs d'arrondis. Ce qui risque de fausser tous les calculs qui en découlent.

A n'utiliser qu'à bon escient et si on comprend et accepte l'impact.

Et l'explication du pourquoi de ces erreurs : excel converti les décimaux en binaire pour calculer.

Un nombre décimal ne tombe pas forcément pile en binaire et il arrive qu'on perde la précision sur le dernier bit.

Excel calculant avec 15 chiffres significatifs on peut perdre le dernier, d'où cet écart d'environ 1E-15. Des fois ces défauts se compensent, des fois ils s'accumulent.

Sur la feuille seuls 10 chiffres significatifs sont affichés donc on voit l'arrondi d'affichage avec = 1. En vba on a tous les chiffres significatifs et le test n'est plus exact.

Je te conseille soit d'arrondir dans vba, soit d'y travailler avec des variables typées Currency. Ce sont des entiers avec virgule fixe à 4 décimales.

Comme ce sont des entiers pas d'erreurs d'arrondi lors des conversions.

Ex:

Sub test()
    Dim v1 As Currency, v2 As Currency, v3 As Currency
    v1 = [D9]
    v2 = [D10]
    v3 = [D11]
    If (v1 + v2 + v3) <> 1 Then
        MsgBox ("Sum of percentage of Norg, NH4 and NO3 must be equal to 100")
    End If
End Sub

eric

Rechercher des sujets similaires à "inferieur"