Boucle For Next imbriquée

Résolu
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012 - 27 juin 2012 à 07:20
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012 - 22 juil. 2012 à 23:58
Bonjour à tous,

j'ai fait une macro qui compare d'abord une cellule d'une colonne à une autre et qui compare ensuite (si la 1ere condition est bonne) une autre cellule d'une autre colonne à 2 autres(la valeur dans la 1ere doit être encadré par les 2 valeurs dans les deux autres). Si toutes les conditions sont remplis on écrit dans une cellule, sinon on incrémentre la boucle.

C'est assez compliqué à s'en faire une image je vous met en pièce jointe un exemple : http://cjoint.com/?0FBhtQ6Ssmj

La macro ressemble à ca :
Sub position()
For i = 2 To Sheets(2).Range("C" & Rows.Count).End(xlUp).Row
    For j = 2 To Sheets(3).Range("A" & Rows.Count).End(xlUp).Row
    
        If Sheets(2).Range("C" & i) = Sheets(3).Range("A" & j) Then
            If Sheets(2).Range("F" & i) >= Sheets(3).Range("B" & j) And Sheets(2).Range("F" & i) <= Sheets(3).Range("C" & j) Then
                Sheets(2).Range("G" & i) = "couche"
            Else: Sheets(2).Range("G" & i) = ""
            End If
    Next j
        
        End If
    Next j

Next i
        
    
End Sub


Le problème est que j'obtiens l'erreur : erreur de compilation Next sans For à la ligne du premier Next j.

Merci de votre aide !

86 réponses

robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
29 juin 2012 à 08:52
Oui j'avais remarquer que je pouvais remplacer la boucle pour alimenter le tab_exb par :
tab_exb = Range(A2:C73)
Mais au cas où si la place serait modifié j'ai préféré le faire avec une boucle.
En revanche pour le tab_exa je ne voyais pas comment faire sans une boucle vu que le tableau est dynamique.

J'ai remplacé le i par i-1 à la dernière ligne je n'ai plus d'erreur mais je n'ai pas encore le résultat attendu. Je ne sais pas pourquoi mais mes conditions ne fonctionnent pas on dirait puisque quand les conditions sont remplies la cellule n'affiche pas "couche"

Est ce que la méthode était bien de créer deux tableaux et de les comparer ensuite avec une boucle ou alors j'ai mal interpreté la méthode et j'aurai eu juste besoin de créer un tableau qui regroupe toutes les données?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2012 à 09:29
Je vais d'abord laisser cheyenne faire avec deux tableaux.
Je ne reviendrai que s'il ne s'en sort pas seul. Cela permettra de "former" deux membres à la fois.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2012 à 09:51
Je voudrais toutefois juste appeler l'attention (cheyenne comprendra) sur le fait que tu dois comparer les éléments de deux plages ====>> donc comparer deux tableaux.
Et chacun d'eux doit être créé directement (sans même dimensionner et sans boucle), chacun à partir de la plage (range) dont il est le "reflet"

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
29 juin 2012 à 13:51
Bonjour ucfoutu,
Je vais d'abord laisser cheyenne faire avec deux tableaux.
Je ne reviendrai que s'il ne s'en sort pas seul. Cela permettra de "former" deux membres à la fois.

Heu, hein, quoi, qu'est-ce ?????
Mais je m'en sors très bien tout seul... Merci quand même.

J'ai modifié, comme dit précédemment, le code de certaines applis qui du coup se trouvent grandement boostées.

Puis "pour m'amuser" j'ai créé un premier tableau (à partir d'un range et sans boucles, HI) dont j'ai analysé les différentes cellules. En fonction des résultats, j'ai rempli un deuxième tableau que j'ai injecté d'un bloc à côté du premier.
Ensuite, toujours en mémoire, j'ai comparé les 2 premiers tableaux pour en créer un 3ème injecté de la même façon.
Le gain de temps est considérable !

Je vais aussi recoder mon application astro qui calcule pour l'année les levers et couchers de lune et de soleil ainsi que divers paramètres. Au lieu d'inscrire jour par jour les data je vais faire différents tableaux qui seront injectés d'un bloc dans chaque feuille mensuelle.

Comme tu le vois, je n'ai aucun problèmes, tu peux donc continuer avec robby98800.

Bonne journée,

Cheyenne
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2012 à 14:58
Comme tu le vois, je n'ai aucun problèmes, tu peux donc continuer avec robby98800

Non non !
Tu vas le faire !



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
29 juin 2012 à 15:08
Il y a un smiley, serait-ce un trait d'humour ?

Sinon, faire quoi ? ce n'est pas moi le demandeur, tu dois te tromper d'interlocuteur !

Cheyenne
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
1 juil. 2012 à 17:24
Bonjour ucfoutu,

J'attends toujours une réponse de ta part !

Bon dimanche,

Cheyenne
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
1 juil. 2012 à 18:26
Bonjour, cheyenne,
Tu n'a pas compris. Ce n'est pas du tout un trait d'humour !
Je veux simplement te laisser l'honneur de transformer (par utilisation de deux tableaux dynamiques) ta solution, que robby98800 à approuvée.
Je ne veux pas de la voler, cette solution. C'est tout !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
1 juil. 2012 à 20:33
Bonsoir ucfoutu,

Tu sais, je n'aurai nullement pris ombrage que tu le fasses et n'aurai pas considéré non plus que ma solution soit "volée".
D'ailleurs, je te laisse le faire, non que je ne m'en sente pas capable (car c'est somme toute très facile, puisqu'il s'agit de de comparer les valeurs dans les tableaux au lieu de les comparer avec les valeurs des cellules) mais je suis actuellement absorbé avec mon appli astro qui est très lourde et je tiens à m'y tenir. Un peu longue la phrase, non ?, HI.

Donc vas-y, que robby98800 puisse avancer si il n'y est pas arrivé pas tout seul ou qu'il se manifeste pour solliciter de l'aide.

Bonne soirée à toi.

Cheyenne
0
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
2 juil. 2012 à 00:25
Bonjour à vous deux,

J'ai bien l'impression que le programme s’exécute beaucoup plus vite mais je n'ai toujours pas le résultat attendu.
Peu importe qui peut m'aider mais j'ai vraiment besoin qu'on me débloque sur ce point étant donné qu'en plus cette méthode me servira encore beaucoup pour la suite de mon travail.
Je vois comment rentrer le tableau fixe (tab_exb) avec Range bien que je ne le fasse pas puisque le nombre de lignes est amené a être modifier par la suite. En revanche pour un tableau dynamique je ne vois pas comment faire.
Ensuite pour la comparaison des deux tableaux j'ai l'impression que le code est bon mais je n'ai pas ce que j'attends !
Peut-être que le problème vient de la recopie à la dernière ligne car Range("G2:G" & [G65536].End(xlUp).Row).Value = tab_exa(i - 1, 2)
recopie le tableau dans la colonne G jusqu'à la dernière ligne de G mais à la base G est vide!

Bref, j'ai besoin d'aide pour pouvoir avancer,

Merci

PS : Je remets la macro avec en pièce jointe le fichier où j'ai recopié seulement les colonnes qui rendre en jeu dans le code. J'ai fait exprès de modifier les données du ficher Excel pour que les deux premières lignes de G affichent "couche". http://cjoint.com/?0GcayV8tcJw

Sub tabex()
derniere_ligne = Sheets(2).Range("C1").End(xlDown).Row

Dim tab_exa()
ReDim tab_exa(derniere_ligne - 2, 2)

Dim tab_exb(215, 2)
    
    For i = 2 To derniere_ligne - 2
        tab_exa(i, 0) = Sheets(2).Range("C" & i + 2)
        tab_exa(i, 1) = Sheets(2).Range("F" & i + 2)
        tab_exa(i, 2) = Sheets(2).Range("G" & i + 2)

    Next i
    
    For j = 2 To UBound(tab_exb, 1)
            tab_exb(j, 0) = Sheets(3).Range("A" & j)
            tab_exb(j, 1) = Sheets(3).Range("B" & j)
            tab_exb(j, 2) = Sheets(3).Range("C" & j)
    
    Next j
    
    For i = 2 To UBound(tab_exa, 1)
        For j = 2 To UBound(tab_exb, 1)
            If tab_exa(i, 0) = tab_exb(j, 0) Then
                If tab_exa(i, 1) >= tab_exb(j, 1) And tab_exa(i, 1) <= tab_exb(j, 2) Then
                    tab_exa(i, 2).Value = "couche"
               
                End If
            End If
    
        Next j
    Next i

Range("G2:G" & [G65536].End(xlUp).Row).Value = tab_exa(i - 1, 2)

End Sub
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
2 juil. 2012 à 14:40
Bonjour ucfoutu,

Je passe juste en coup de vent...

Merci pour robby98800, mais
tablo3 = Sheets("Feuil3").Range("A2:C" & derlig2)

Ne serait-ce pas plutôt :
tablo3 = Sheets("Feuil3").Range("A2:C" & derlig3)


Cheyenne
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 juil. 2012 à 15:52
Bonjour, Cheyenne.
Oui. Merci de l'avoir vu.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
3 juil. 2012 à 00:28
Bonjour ucfoutu,

Merci ça fonctionne et rapidement! En plus de ça j'ai compris le fonctionnement
Je voudrais juste avoir une petite précision :

derlig2 = Sheets("Feuil2").Range("C" & Rows.Count).End(xlUp).Row
Range("A2:G" & derlig2)

En faisant comme ça on prend en compte les colonnes de A à G avec pour ligne, le nombre de ligne de C non vide, est ce bien ça?
En fait je ne comprends pas le A2:G qu'est ce que cela signifie (On prend les colonnes de A à G à partir de la 2eme ligne??)

En tout cas merci, ca me servira beaucoup
0
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
3 juil. 2012 à 02:02
Ah je crois que je viens de comprendre, derlig2 est l'indice de G.
Désolé si c'était bien cela, sinon je vois toujours pas.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 juil. 2012 à 07:05
Les deux tableaux sont bâtis depuis la colonne A jusqu'à la colonne utile pour chacun d'eux (donc G pour tablo2 et C pour tablo3)
Les bâtir depuis la colonne A permet d'éviter des calculs relatifs (de colonnes) puisque, ainsi, la D, par exemple, sera toujours la 4ème, la B la 2ème, ... sans se "casser la tête".
Et il suffit ensuite (sens de la dernière ligne du code) de réinjecter lke tableau dans la plage qui en avait permis la création.
C'est tout bête .
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
3 juil. 2012 à 07:45
Ok super je viens de m'en servir pour une autre application et ça marche très bien.
J'aurais vraiment appris quelquechose, merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 juil. 2012 à 07:51
Bravo.
Juste une prière, maintenant :
Fort de ce que tu as appris dans la présente discussion, te voilà maintenant apte à aider à ton tour d'autres forumeurs.
Fais-le, s'il te plait.
Tu y gagneras toi-même au passage, tu verras


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
3 juil. 2012 à 08:09
Oui je suis encore en stage pendant 2 mois donc je n'aurai pas vraiment le temps mais ensuite ça sera avec plaisir d'aider d'autres personnes.
0
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
3 juil. 2012 à 11:37
J'aurais encore besoin d'un petit plus. Si il y a plusieurs cas qui satisfont aux mêmes conditions, comment faire pour tous les afficher?
Actuellement il m'affiche le dernier qui est passé dans la boucle.
For i = 1 To UBound(tablo1)
    For j = 1 To UBound(tablo2)
        If Sheets("Fiche_machine").Range("A1") = tablo2(j, 2) Then
            If tablo1(i, 2) = tablo2(j, 1) Then
                If tablo1(i, 1) = tablo2(j, 5) Then
                    If tablo2(j, 8) <= 14 Then
                        tablo1(i, 3) = tablo2(j, 3)
                    End If
                End If
            End If
        End If
    Next j
Next i

Sheets("Fiche_machine").Range("A22:C" & derlign1) = tablo1
End Sub

Ils se trouvent que j'ai plusieurs cas qui remplissent les mêmes conditions.
Faut-il faire une boucle sur les réponses qui satisfont aux mêmes conditions pour les classer dans des cellules différentes après?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 juil. 2012 à 12:13
Voilà aut'chose

Je veux bien essayer, mais tu vas devoir me dire avec précision où les afficher tous !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Rejoignez-nous