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 :

Bug égalité ? [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien BE Bâtiment
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien BE Bâtiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Par défaut Bug égalité ?
    Bonjour

    Sur la procédure ci-après VBA-Excel ne résout pas correctement l'égalité VideTotTest <> VideTot.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    Public Sub Calcul()
    Dim LongTot, LargPtx, VideReel, LondDePtx As Double
    Dim NbPtr, NbPtx As Integer
     
    Dim VideTot, VideTot1, VideTot2, VideTotTest As Double
     
    Dim NbPtr1, NbPtr2 As Integer
    Dim LgPtr1, LgPtr2 As Double
     
        If IsNumeric(TXB_NbPtr.Value) And IsNumeric(TXB_LargPtx.Value) And IsNumeric(TXB_LongTot.Value) Then
            LongTot = TXB_LongTot.Value
            LargPtx = TXB_LargPtx.Value
            NbPtr = TXB_NbPtr.Value
     
            NbPtx = TXB_NbPtr - 1
            LongDePtx = LargPtx * NbPtx
            VideReel = (LongTot - NbPtx * LargPtx) / NbPtr
     
     
        'Mise à jour des infos de calcul (en bas)
            'si nombres < 0 alors nombre = 0
            If LongDePtx < 0 Then
                LBL_LongDePtx.Caption = 0
            Else
                LBL_LongDePtx.Caption = LongDePtx
            End If
     
            If NbPtx < 0 Then
                LBL_NbPtx.Caption = 0
            Else
                LBL_NbPtx.Caption = NbPtx
            End If
     
            If VideReel < 0 Then
                LBL_VideReel.Caption = 0
            Else
                LBL_VideReel = VideReel
            End If
     
        Else
            LBL_VideReel.Caption = 0
            LBL_NbPtx.Caption = 0
            LBL_LongDePtx = 0
        End If
     
        If IsNumeric(TXB_NbPtr.Value) And IsNumeric(TXB_LargPtx.Value) And IsNumeric(TXB_LongTot.Value) Then
            LBL_NbPtr1 = True
     
            VideTot = LongTot - LongDePtx
     
            If Len(VideReel) <= 5 Then
                If Mid(VideReel, 5) = 5 Or Len(VideReel) < 5 Then
                    LgPtr1 = VideReel
                    NbPtr1 = NbPtr
     
                    LBL_Nb1 = NbPtr1 & " poutres de " & VideReel & " ml."
                    LBL_Nb1.Visible = True
                    LBL_Nb2.Visible = False
     
                    Exit Sub
                End If
     
            Else
                NbPtr1 = 1
                LgPtr1 = Round(VideReel - 0.005, 2)
     
                NbPtr2 = NbPtr - NbPtr1
                LgPtr2 = Round(VideReel + 0.005, 2)
     
                VideTot1 = NbPtr1 * LgPtr1
                VideTot2 = NbPtr2 * LgPtr2
                VideTotTest = VideTot1 + VideTot2
     
                While VideTotTest <> VideTot 'C'est ici que ça ne marche pas comme prévu
                    MsgBox "hop"
                    If NbPtr1 > 1000 Then
                        MsgBox "erreur"
                        LBL_Nb1.Visible = False
                        LBL_Nb2.Visible = False
                        Exit Sub
                    End If
     
                    NbPtr1 = NbPtr1 + 1
                    NbPtr2 = NbPtr - NbPtr1
     
                    VideTot1 = NbPtr1 * LgPtr1
                    VideTot2 = NbPtr2 * LgPtr2
                Wend   
            End If
        Else
            LBL_Nb1.Visible = False
            LBL_Nb2.Visible = False
        End If
    End Sub
    Nom : Capture.PNG
Affichages : 478
Taille : 16,7 Ko

    Je ne sais pas pourquoi mais si j'ai par exemple VideTot1 = 5.23 ,VideTot2 = 10.48, VideTotTest = 15.71 et VideTot = 15.71. Et bien l'égalité VideTotTest = VideTot renvoit faux, et VideTotTest <> VideTot renvoit vrai . Peux-etre n'ai je pas fait correctement quelque chose dans mon code.

    Pourriez-vous m'aider svp ? Je galère

    Merci à vous

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Bonjour,

    ta ligne de déclaration de variables peut poser problème

    change pour commencer ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim VideTot, VideTot1, VideTot2, VideTotTest As Double
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim VideTot As Double, VideTot1 As Double, VideTot2 As Double, VideTotTest As Double
    même chose pour les autres lignes de déclaration...
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre averti
    Homme Profil pro
    Technicien BE Bâtiment
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien BE Bâtiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Par défaut Déclaration des variables
    Ok j'ai modifié mes déclarations de variables selon tes conseils. Mais cela ne corrige pas le problème.

    As-tu/Avez-vous une autre idée ?

    Merci pour vos réponse.

  4. #4
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour
    Citation Envoyé par Maxime63 Voir le message
    Sur la procédure ci-après VBA-Excel ne résout pas correctement l'égalité VideTotTest <> VideTot.

    Je ne sais pas pourquoi mais si j'ai par exemple VideTot1 = 5.23 ,VideTot2 = 10.48, VideTotTest = 15.71 et VideTot = 15.71. Et bien l'égalité VideTotTest = VideTot renvoit faux, et VideTotTest <> VideTot renvoit vrai . Peux-etre n'ai je pas fait correctement quelque chose dans mon code.
    Fait ton code en pas à pas en testant tes variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print "VideTot = " & VideTot & "  -  " & "VideTotTest = " & VideTotTest
    Tu verras sûrement ce qu'il en est …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  5. #5
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Peut être ceci à vérifier lors de l'exécution du code :
    Exemple à faire dans la fenêtre d'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VideTotTest = "15.71": VideTot = 15.71: Debug.Print VideTot = VideTotTest
    vois tu la différences …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  6. #6
    Membre averti
    Homme Profil pro
    Technicien BE Bâtiment
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien BE Bâtiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Par défaut Résolu
    Bonjour,

    J'ai trouvé la solution sur un autre post. J'aurai pu chercher un peu mieux mais je n'ai compris que aujourd'hui d'où mon problème venait.
    https://www.developpez.net/forums/d9...rsion-nombres/
    Comme l'explique très bien le post c'est un problème de conversion entre le système binaire et décimal qui rajoute des petite miettes à la fin des variables Double.

    En déclarant mes variables en Single je n'ai plus de problème.

    Merci pour vos réponse et de m'avoir fait découvrir l’exécution pas à pas que je ne connaissez pas jusque là (Super pratique !)

    Ce post est résolu. alors bonne journée .

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

Discussions similaires

  1. [Bug ?] intval et test d'égalité fait ce qui lui plait.
    Par titoumimi dans le forum Langage
    Réponses: 8
    Dernier message: 22/12/2006, 10h17

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