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 :

Double boucle for


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut Double boucle for
    Bonjour à toutes et à tous,

    J'ai récemment terminé un programme assez gros (grâce à l'aide de certains membres du forum merci encore à eux) qui fonctionne très bien mais j'ai juste un petit truc qui me chagrine. Voici un code simplifié du genre de problème que je rencontre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub boucle()
     
    For i = 0 To 1 Step 0.1
    Cells(1, 1) = i
     
        For j = 0 To 1 Step 0.1
        Cells(2, 1) = j
        Next
     
    Next
     
    End Sub
    Pourquoi la boucle sur i ou j ne se termine pas si je met un pas de 0,01 alors que sur 0,1 ça marche ? Avec Step 0,1 on arrive bien à A1=A2=1 mais si Step 0,01 on arrive à A1 ou A2 = 0,990000000000001. D'ailleurs si on regarde ça marche bien mais à partir de i ou j environ 0,8 il commence à mettre beaucoup de chiffres après la virgule.

    D'ailleurs à Step 0,0001 ça remarche bien ^^.

    Donc en gros : Step 0,1 ou 0,0001 ça marche mais Step 0,01 ou 0,001 ben on arrive à 0,990000000000001.

    Du coup cela m'embête un peu car comme je travaille sur un pas assez petit j'ai bien peur qu'il ne m'analyse pas tout.

    Merci pour toute réponse éventuelle et bonne journée.

    Cordialement.

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour,
    effectivement je comprends pas!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub boucle()
    Dim i As Double
    Dim j As Double
    For i = 0 To 1 Step 0.001
    Cells(1, 1) = Round(i, 3)
        For j = 0 To 1 Step 0.001
        Cells(2, 1) = Round(j, 3)
        DoEvents
        Next
    Next
    End Sub

  3. #3
    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,

    c'est aux pertes de précision suite aux conversions décimal/binaire.
    Un nombre pile en décimal ne tombe pas forcément pile en binaire et tu perds les derniers bits. Comme 1/3 en décimal => 0.3333333... sans fin
    Inscrit 6 fois 0.01 dans A1:A6 et fais : =SOMME(A1:A6)-0.06-0
    Résultat = 0 ?

    eric

  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




    Bonjour,

    voir aussi cet autre exemple !


  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Loa,

    C'est effectivement très classique avec des nombres flottants.

    Une bonne habitude est de faire les boucles avec un compteur entier, et dans la boucle, faire à chaque tour le calcul pour obtenir la valeur désirée à partir de celle du compteur.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Bonsoir,

    Merci à tous pour vos réponses. Je ne savais pas que cela pouvait générer des erreurs comme ça.

    Pareil l'exemple du 0.06-6*0.01-0 = 6,93889390390723E-18 ^^ ça m'a presque "choqué" qu'un outils aussi puissant puisse se planter sur des calculs basiques comme ça.

    Par contre Droggo, quand vous dîtes "Une bonne habitude est de faire les boucles avec un compteur entier, et dans la boucle, faire à chaque tour le calcul pour obtenir la valeur désirée à partir de celle du compteur.", vous voulez dire par exemple que si on veut faire pour i de 0 à 10 par pas de 0.1, on fait pour i de 0 à 100 par pas de 1 et on indique dans la boucle que i devient i/10 ?

    Cordialement.

  7. #7
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour Gordon; Tous

    Peut-être avec une fonction qui corrige la valeur d'un FOR...NEXT...STEP incrémentée par un nombre décimal :

    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
     
    Option Explicit
     
    Sub CorrigerErreur_de_STEP()
    'Auteur Docmarti 24/08/2014
     
    Dim Rise As Double, debut As Double, fin As Double
    Dim nb As Long, i As Double
     
    Dim places As Long
     
    places = 14
     
    debut = -0.6
    fin = 1.91
    Rise = 0.01
     
    nb = 0
    For i = debut To fin Step Rise
     nb = nb + 1
     Cells(nb, 4) = i
     i = dmwSymArithRoundUp(i, places)
     If i <> Cells(nb, 4) Then
      Cells(nb, 5) = i
      Cells(nb, 6) = Cells(nb, 4) - i
     End If
    Next
     
    Cells(nb, 5) = fin
    Cells(nb + 1, 5) = i
    Cells(nb, 4).Select
     
     i = dmwSymArithRoundUp(i, places)
     If i < fin Then
       nb = nb + 1
       Cells(nb, 4) = i
     End If
     
    End Sub
     
    Function dmwSymArithRoundUp(ByVal Number As Variant, ByVal places As Integer) _
                                          As Double
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Note: Symmetric arithmetic rounding
    ' Positive and negative numbers move away from 0
    ' .5s rounded up
    ' Author: David Wallis (DMW Consultancy Limited)
    ' Date: 28 Aug 1997
     
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Dim dblTemp As Double
     
    'dblTemp = CDec(Nz(Number))'Modification by Docmarti
     
    dblTemp = IIf(Number = Empty, 0, Number) 'Added by Docmarti
     
     
    dblTemp = CDec(dblTemp * 10 ^ places)
     
    dmwSymArithRoundUp = Fix(dblTemp + 0.5 * Sgn(Number)) / 10 ^ places
     
    End Function

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

Discussions similaires

  1. [Toutes versions] Factorielle à double boucle FOR TO
    Par caribou01 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 21/06/2012, 22h55
  2. [XL-2007] Double boucle for
    Par Goliw dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/05/2011, 08h16
  3. doubles boucles for
    Par tpscience dans le forum MATLAB
    Réponses: 7
    Dernier message: 26/04/2009, 19h38
  4. [batch] double boucle for
    Par schlopa dans le forum Windows
    Réponses: 12
    Dernier message: 11/02/2008, 19h54
  5. Sortir d'une double boucle FOR-END
    Par Invité dans le forum MATLAB
    Réponses: 4
    Dernier message: 05/12/2007, 11h07

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