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 :

[E-07] La fonction MOD et opérateur Mod retournent des valeurs différentes


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 103
    Points : 91
    Points
    91
    Par défaut [E-07] La fonction MOD et opérateur Mod retournent des valeurs différentes
    Bonjour,
    Suis-je cinglé ? :
    La formule de feuille de calcul =mod(-17;224) à pour résultat 207
    et le code VBA
    à pour résultat -17.

    en utilisant la calculette scientifique de windows. le résultat est également -17

    Y a t'il quelque chose qui ne tourne pas rond ?????

    __________
    j'écris trop vite. désolé : http://www.developpez.net/forums/d30...d/#post1888364

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut JMPS et le forum
    Tu mets le doigt sur les limites de l'informatique (dans les tableurs)
    -17/224 => reste -17

    en formule, la différence de signe génère une erreur correspondant à
    =-17-(ent(-17/224)*224)
    au lieu d'avoir
    =-17-(tronque(-17/224)*224)

    C'est une erreur que le VBA ne fait pas, mais je n'étais pas à la création des tableurs, ni du VBA, alors je ne peux que constater.
    A+

  3. #3
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Effectivement, et la chose n'est pas nouvelle vu que Microsof la signalait déjà pour Excel 97 et un test sous 2007 fait pareil... (d'un autre côté) des changements pourraient poser d'autres pb pour la compatibilité

    comme indiqué dans le support, ceci est OK en fonction feuille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =-17-224*QUOTIENT(-17;224)
    Dans Microsoft Excel, le résultat retourné par la feuille de calcul fonction MOD peut différer du résultat retourné par le Microsoft Visual Basic pour opérateur mod Applications.


    .../... La différence entre la fonction de feuille de calcul Mod et l'opérateur Mod se produit à cause de la manière dont Microsoft Excel utilise la fonction ENT. La fonction ENT retourne le premier entier négatif inférieur ou égal au nombre. Par exemple, =INT(17,-3) retournera-6, parce que 17 divisé par-3 est égal à-5.6666667 et le plus proche nombre entier dont la valeur est inférieure ou égale à-5.6666667 est-6.
    etc...
    voir :

    http://support.microsoft.com/kb/214271/fr
    http://support.microsoft.com/kb/141178/fr#appliesto
    http://support.microsoft.com/kb/119083/EN-US/


    PS : JMPS, tu pourrais modifier le titre de ton post dans le genre Micrososft
    La fonction MOD et opérateur Mod retournent des valeurs différentes
    , ça aidera sûrement les recherches futures

    cordialement,

    Didier

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 103
    Points : 91
    Points
    91
    Par défaut
    Merci à tous pour ces explications.


    _____________________________
    Citation Envoyé par Gorfael
    C'est une erreur que le VBA ne fait pas
    Si j'ai bien compris, le VBA serait plus juste que la fonction Excel de feuille de calcul ?

    J'avais cru remarquer le contraire...

    en remplissant des milliers de cellules en utilisant la fonction MOD(N;D) je parvenais toujours au résultat final attendu.

    en effectuant le même traitement dans une chaine en VBA avec l'instruction N MOD D, je ne parvenais jamais au résultat final attendu.

    en incluant un contrôle de l'exécution du code VBA par comparaison de l'état du traitement VBA et de la cellule correspondante j'ai fini par me douter que le problème venait du mode de fonctionnement entre la fonction et l'opérateur MOD.

    les visites de ce forum et la lecture de l'aide d'office m'ont fait obter pour l'usage dans mon code VBA de la formule N-D*ENT(N/D) qui correspond à la formule EXCEL pour le traitement de la fonction MOD(N;D) d'ailleurs l'usage dans la feuille de calcul de la formule N-D*INT(N/D) produit le même résultat final attendu après des milliers de traitements

    dans ce cas VBA et feuille excel parviennent tout les deux ensemble au même résultat final attendu. sans erreurs ni différences de traitements intermédiaires.

    ET TOUT ÇA NE SERAIT PAS JUSTE ?
    ____________________________
    Je ne suis ni développeur, ni mathématicien...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut JMPS et le forum
    Ce n'est pas parce que le résultat final est juste que les opérations intermédiaires le sont.
    Tout le problème vient de la définition des entiers à partir d'une valeur négative :
    Si on a A1 : -0,5, suivant la définition de la formule, on aura
    Tronque(A1) donnera 0 alors que ENT(A1) donnera -1 (même chose avec FIX et INT en VBA). Mais réellement, je ne sais pas qui a raison. Ma formation me fait penser que la bonne réponse c'est 0 (et dans le cas des opérateurs modulo le résultat correspond) mais rien ne dit que je ne fais pas une erreur d'interprêtation.
    Pour moi, la partie entière d'un nombre (négatif ou positif) correspond au nombre dont on supprime la partie décimale. Mais si les concepteur d'un système comme Excel ont créé 2 formules, c'est qu'il doit y avoir une raison. Je vois bien ce qui gène (un interval entre 2 nombres entiers couvre plus d'une unité, de -0,9999... à +0,9999...) mais je ne suis pas assez matheux pour le justifier.
    A+

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

Discussions similaires

  1. [AC-2010] Erreur sur l'opérateur "Mod"
    Par JeanYves70 dans le forum VBA Access
    Réponses: 5
    Dernier message: 04/09/2013, 17h37
  2. Priorité entre les opérateurs mod et *
    Par King2net dans le forum Langage
    Réponses: 6
    Dernier message: 21/10/2010, 17h22
  3. Fonction d'une DLL qui retourne plusieur valeur
    Par vtk37 dans le forum Débuter
    Réponses: 9
    Dernier message: 27/05/2009, 11h01
  4. [C#] Opérateur Mod
    Par PoZZyX dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/12/2007, 12h31

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