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 :

Plusieurs boucles For next imbriquées


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 70
    Points
    70
    Par défaut Plusieurs boucles For next imbriquées
    Bonjour,

    Donc, voilà mon problème. Je tente de faire des boucles. Cependant, voici mon problème. Je veux que mes chiffres dans mes boucles réfèrent à d'autres chiffres. Voici un exemple qui aiderait à mieux illustrer ma problématique.

    Je veux faire 6 fois la même boucles mais avec des variables différentes. Voici les variables que j'aimerais avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    a = 1 to 10
    b = 15 to 26
    c = 30 to 50
    d = 60 to 62
    e = 64 to 90 
    f = 95 to 100
     
     
    For i = a to f
     
    'blablabla! Ici se retrouve les trucs qui vont s'exécuter dans ma boucle
     
     
    next i
    Présentement, voici à quoi ressemble mon code. Mais bon, je suis obligé bien entendu de le décupler plusieurs fois.


    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
    For i = 1 to 10
     
    'blablabla, ma boucle s'exécute
     
    next i
     
    For i = 15 to 26
     
    'blablabla, ma boucle s'exécute
     
    next i
     
    For i = 30 to 50 
     
    'blablabla, ma boucle s'exécute
     
    next i
     
    For i = 60 to 62
     
    'blablabla, ma boucle s'exécute
     
    next i
     
    For i = 64 to 90
     
    'blablabla, ma boucle s'exécute
     
    next i
     
    For i = 95 to 100
     
    'blablabla, ma boucle s'exécute
     
    next i
    Des suggestions?

    Merci!

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 46
    Points : 67
    Points
    67
    Par défaut
    Tu donnes la réponse dans ton titre: imbriquer les boucles.Voilà une solution avec un seul tableau (tu peux aussi faire un tableau pour le début et un autre pour la fin):

    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
    Dim tableau(12) as Integer
    Dim i, j, debut, fin as Integer
    tableau(1) = 1
    tableau(2) = 10
    tableau(3) = 15
    tableau(4) = 26
    ...
     
    For i=1 to Ubound(tableau) Step 2
        debut = tableau(i)
        fin = tableau(i+1)
        For j=debut to fin
            'blablabla
        Next j
    Next i

  3. #3
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonsoir
    une autre proposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub Test()
    Dim i As Byte
     
    For i = 1 To 100
        Select Case i
            Case 11 To 14, 27 To 29, 51 To 59, 63, 91 To 94
            Case Else
                'Ton Code
        End Select
    Next i
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  4. #4
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 70
    Points
    70
    Par défaut
    Euh.... Mercatog... tu es louche! Ça fonctionne parfaitement ton truc. Hum... je n'y comprends rien, mais au moins j'ai compris la technique.

    Dans le fond, c'est comme si je disais à mon VBA : "Fais ma boucle de 1 à 100, mais fais gaffe de ne pas toucher à ces cellules là, ni ces cellules-là, ni celles-là, etc." Génial!!!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut Problème "Incompatibilité type"
    J'ai deux boucles imbriquées et j'ai une erreur au cours de l'exécution : "Incompatibilité type"

    Voici mon code et en gras, la ligne indiquée comme causant l'erreur :

    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
    Private Sub EtatSanct_Change()
    Dim Sanct
    Dim j, i As Byte
    
    If EtatSanct.Value = "Non Fait" Then
    
            Sheets("SANCTION").Select
            j = 2
            For j = 2 To 140 Step 4
                If Cells(2, j) <> "" Then
                    
                    For i = 3 To 63
                        If Cells(i, j + 3) = "NON" Then
                        Sanct = Cells(2, j) + "_" + Cells(i, j) + "_" + Cells(i, j + 1) + " au " + Cells(i, j + 2)
                        ListSanct.AddItem Sanct
                        Else
                            If Cells(i, j + 3) = "" Then
                            i = 63
                            Else
                            End If
                        End If
                    Next i
                End If
            Next j
    
    End If
    Sheets("APPEL").Select
    End Sub
    En fait, la macro garde en mémoire la dernière donnée du premier j et bloque sur le j+4 .
    Je sais pas si je suis bien clair.

    Merci

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Essaies comme ceci
    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
    Private Sub EtatSanct_Change()
    Dim j As Byte, i As Byte
    Dim Sanct As String
     
    If EtatSanct.Value = "Non Fait" Then
        With Sheets("SANCTION")
            For j = 2 To 140 Step 4
                If .Cells(2, j) <> "" Then
                    For i = 3 To 63
                        If .Cells(i, j + 3) = "NON" Then
                            Sanct = .Cells(2, j).Value & "_" & .Cells(i, j).Value & "_" + .Cells(i, j + 1).Value & " au " & .Cells(i, j + 2).Value
                            ListSanct.AddItem Sanct
                        ElseIf .Cells(i, j + 3) = "" Then
                            Exit For
                        End If
                    Next i
                End If
            Next j
        End With
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Merci,
    Cela semble fonctionner, mais j'aimerais comprendre mon erreur/mes erreurs
    Au niveau de la "grammaire" de programmation :
    quel est l'intéret de coder au lieu de ?

    Le fait de préciser permet de mieux définir les données?

    Mais mon principal problème venait il du fait que je "forçais" la sortie de boucle i avec le i = 63? La fonction Exit For (que je ne connaissais pas semble être le noeud de mon problème non?)

    En tout cas merci!

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    1. Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sheets("XX").select
    range("A1")=1
    range("A2")="toto"
    Sans sélectionner la feuille avec le Select, on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sheets("XX").range("A1")=1
    sheets("XX").range("A2")="toto"
    Ce qui revient à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With sheets("XX")
         .range("A1")=1
         .range("A2")="toto"
    end with
    2. ça revient àdu moment que la propriété .value est la propriété par défait de l'objet range. C'est question d'habitude
    3. Dans une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i=1 to 100
    '...
    Next i
    Il est déconseillé (sinon prohibé) de changer la valeur de la variable de boucle i
    permet de sortir de la boucle.

    Sinon, ton problème venait de la mauvaise déclaration de ta variable Sanct

    PS: Pour la concaténation, j'utilise toujours le & à la place du +
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup!

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

Discussions similaires

  1. [AC-2007] ouvrir plusieurs états avec boucle FOR...NEXT
    Par sylv20 dans le forum IHM
    Réponses: 5
    Dernier message: 30/06/2011, 10h58
  2. Utilisation plusieurs boucles For imbriquées
    Par stick25 dans le forum Général VBA
    Réponses: 2
    Dernier message: 07/04/2010, 18h00
  3. [Toutes versions] Message d'erreur pour 2 boucles "For...next" imbriquées.
    Par vivi4561 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/09/2009, 14h41
  4. [Ex-03] Boucle For Next et Do Loop imbriquées
    Par moilou2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/10/2008, 18h08
  5. Comment optimiser plusieurs boucles FOR-END imbriquées
    Par totoc1001 dans le forum MATLAB
    Réponses: 26
    Dernier message: 13/05/2007, 17h59

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