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

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juil. 2012 à 17:41
Ouais... Tu as de la chance : il me faut libérer ma machine.
Le voilà donc, le code que je "vois" :
  Dim I As Long, J As Long, macol As New Collection, quoi
  Application.ScreenUpdating = False
  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
               If InStr(tablo1(I, 3), vbCrLf) = 0 Then
                 tablo1(I, 3) = tablo2(J, 3)
               Else
                 tablo1(I, 3) = tablo1(I, 3) & Chr(10) & tablo2(J, 3)
                 On Error Resume Next
                 macol.Add I, Str(I)
               End If
             End If
           End If
         End If
      End If
    Next J
Next I
Sheets("Fiche_machine").Range("A22:C" & derlign1) = tablo1
For I = macol.Count To 1 Step -1
  quoi = Split(Range("C" & macol.Item(I)), Chr(10))
  For J = UBound(quoi) To 1 Step -1
    Rows(macol.Item(I) + 1).Insert , xlShiftDown
    Range("C" & macol.Item(I) + 1).Value = quoi(J)
  Next J
  Range("C" & macol.Item(I)).Value = quoi(0)
Next
Application.ScreenUpdating = true

Je n'ai ajouté, comme tu peux le constater, que très peu de code (une dizaine de lignes très courtes).
Essaye-le et dis-nous (je n'ai pas de données et travaille "en aveugle", sans pouvoir vérifier)

________________________
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
8 juil. 2012 à 21:49
Oui, mais attends un peu, là :
On ne voit pas du tout ta déclaration de tablo1 et de tablo2.
Du coup : et si on suppose que tablo1 correspond à la plage commençant en ligne 22, il faut transformer la ligne disant :
macol.Add I, Str(I)
en
macol.Add I + 21, Str(I + 21)


________________________
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
9 juil. 2012 à 12:58
Bonjour,

Alors voici comment j'ai déclarer les deux tableaux avec la macro :
Sub fichemachine2()
Dim I As Long, J As Long, macol As New Collection, derlign1 As Byte, derlign2 As Integer
Dim tablo1() As Variant, tablo2() As Variant, quoi

derlign1 = Sheets("Fiche_machine").Range("B" & Rows.Count).End(xlUp).Row
derlign2 = Sheets("Maxituo").Range("A" & Rows.Count).End(xlUp).Row

tablo1 = Sheets("Fiche_machine").Range("A22:C" & derlign1)
tablo2 = Sheets("Maxituo").Range("A3:K" & derlign2)
   
  Application.ScreenUpdating = False
  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
               If InStr(tablo1(I, 3), vbCrLf) = 0 Then
                 tablo1(I, 3) = tablo2(J, 3)
               Else
                 tablo1(I, 3) = tablo1(I, 3) & Chr(10) & tablo2(J, 3)
                 On Error Resume Next
                 macol.add I + 21, Str(I + 21)
               End If
             End If
           End If
         End If
      End If
    Next J
Next I
Sheets("Fiche_machine").Range("A22:C" & derlign1) = tablo1
For I = macol.Count To 1 Step -1
  quoi = Split(Range("C" & macol.Item(I)), Chr(10))
  For J = UBound(quoi) To 1 Step -1
    Rows(macol.Item(I) + 1).Insert , xlShiftDown
    Range("C" & macol.Item(I) + 1).Value = quoi(J)
  Next J
  Range("C" & macol.Item(I)).Value = quoi(0)
Next
Application.ScreenUpdating = True
End Sub


Je vois bien la gymnastique du code et c'est cela dont j'ai besoin. Pour l'instant ça ne fait pas encore ce que je voulais. Seul la dernière erreur qui répond aux même conditions que d'autres erreurs est marquée.
Je pense que c'est la forme du tableau que j'ai construit sur ma feuille qui fait que je n'obtiens pas ce que je souhaite.
Je vous explique plus précisemment ce qu'il en est.
Je compare deux tableaux, le deuxième contient des erreurs que je souhaite classer dans le premier.
Du coup si le n° de machine est le même, si la machine est en fonctionnement, si l'erreur vient d'une Todolistchef, alors on remplie la cellule du tableau 2 qui remplie ces conditions, avec l'erreur du tableau 1 (ici elle serait en [C22]). Si les mêmes conditions sont satisfaites pour une autre erreur alors on remplie la cellule en dessus de la première erreur en colonne C ([C23])etc.. Je m'étais fixé 4 erreurs qui satisfont au mêmes conditions.
A ce que je comprends du code de ucfoutu, c'est encore mieux puisque le nombre d'erreurs qui peuvent être rentrées dans la colonne C est variable, ce qui m'évite, si il y a moins de 4 erreurs de laisser des cellules vides.

Voici une représentation du tableau que j'ai sur ma feuille. Les "" sont des cellules vides.

n° de machine

[A22]gev en fonctionnement [B22]Todolistchef [C22]erreur 1
"" "" erreur 2
"" "" erreur 3
"" "" erreur 4

gev en fonctionnement TodolistResp erreur 1
"" "" erreur 2
"" "" erreur 3
"" "" erreur 4

gev en fonctionnement Retrofit erreur 1
"" "" erreur 2
"" "" erreur 3
"" "" erreur 4

gev en fonctionnement Suivi erreur 1
"" "" erreur 2
"" "" erreur 3
"" "" erreur 4

gev debout arrêtée Todolistchef erreur 1
"" "" erreur 2
"" "" erreur 3
"" "" erreur 4

.
.
.
Comme j'ai bien dit, il se pourrait que j'ai des modifications sur ma feuille pour que le code fasse que je veux.

Je vous tiens au courant,

Robin
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 juil. 2012 à 16:48
Ce qu'il y a de certain, robby :
- on ne peut constamment changer les tenants d'un problème. Tu an avais définis deux types et en voilà maintenant un troisième ! (A toi de t'y mettre, dans ce cas).
- Il me parait en effet probable que tu n'as pas passé suffisamment de temps en matière de conception de ton appli et qu'au lieu de chercher des "rustines" tu ferais mieux de la remettre complètement à plat. Il est impératif que la conception soit pensée, en amont donc, en fonction de l'exploitation que l'on envisage de foire des données. Le contraire est une aberration.


________________________
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

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

Posez votre question
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
10 juil. 2012 à 07:46
Bonjour ucfoutu,

J'imagine que tu vas être décu mais après avoir revu la conception de mon tableau je n'y ai rien trouvé d'anormal (je veux dire par là que quand on parcours les boucles et le programme,il devrait se remplir comme prévu). Vraiment là je ne sais plus quoi faire, je ne vois rien qui n'aille pas dans ton code et le tableau semble être adapté..

Je sais que tu n'ouvres pas les classeur d'autres personne mais je te laisse quand même l'exemple pour ne pas que tu "travailles en aveugle". J'ai seulement laisser les informations nécessaire pour le code à savoir les deux feuilles et les plages qui nous importe.
Si tu veux bien regarder ça serait vraiment m'aider.

http://cjoint.com/?0GkhTaeV3DS

Merci,

Robin
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 juil. 2012 à 07:59
C'est un classeur, que contient ton lien !
Ce n'est pas le code d'un classeur, qui me fait fuir (il est toujours possible de l'inhiber) ! C'est le classeur en soi. Il peut contenir à ton insu et véhiculer des choses. Or, tu me parais en plus un habitué de tels "échanges", ce qui multiplie les risques !

________________________
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
10 juil. 2012 à 08:09
Pour ton information : tout un parc de pc d'un service pourtant bien "surveillé" s'est trouvé infecté à la suite d'échanges entre jeunes gens de simples documents Word sans la moindre macro . Et les conséquences ont été importantes : il n'a pas suffi, pour rétablir la situation, de reformater les disques. Il a fallu revenir à des sauvegardes très antérieures de tous les exe "maison".


________________________
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
10 juil. 2012 à 11:06
Re,

Si tu as un mail, je veux bien te l'envoyer comme ça. Envoie moi l'adresse en MP si ça te convient. Je ne vois pas d'autres solutions pour régler ce problème..

Merci,

Robin
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 juil. 2012 à 11:11
Ca, alors !
Qu'il soit envoyé par mail, déposé sur un site ou mis sur un support, etc ..., un classeur reste un classeur !
Tu devrais relire attentivement ce que j'ai écrit plus haut

________________________
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
10 juil. 2012 à 12:42
Je pensais que c'était le site qui pouvait poser problème je ne savais pas qu'un classeur excel pouvait engendrer tant de problème.
Je peux peut-être faire une copie d'écran alors?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 juil. 2012 à 12:52
U8ne copie d'écran ? Oui, mais alors : deux : une avec les tenants, l'autre avec les aboutissants, le tout : accompagné des commentaires nécessaires quant à la relation entre le "départ" et "l'arrivée" !


________________________
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
10 juil. 2012 à 13:33
Voici les captures d'écran :

Fichemachine1 http://cjoint.com/?0GknCoZUtoa
Fichemachine2 http://cjoint.com/?0GknDnZWoqA
Feuille2 (Maxituo) http://cjoint.com/?0GknEd4Fxg9

Je peux sinon te l'envoyer par mail

La macro qu'il y a derrière est celle ci :
Sub fichemachineuc()
Dim I As Long, J As Long, macol As New Collection, derlign1 As Byte, derlign2 As Integer, quoi

derlign1 = Sheets("Fiche_machine").Range("B" & Rows.Count).End(xlUp).Row + 3
derlign2 = Sheets("Maxituo").Range("A" & Rows.Count).End(xlUp).Row
tablo1 = Sheets("Fiche_machine").Range("A22:C" & derlign1)
tablo2 = Sheets("Maxituo").Range("A3:K" & derlign2)
   
  Application.ScreenUpdating = False
  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
               If InStr(tablo1(I, 3), vbCrLf) = 0 Then
                 tablo1(I, 3) = tablo2(J, 3)
               Else
                 tablo1(I, 3) = tablo1(I, 3) & Chr(10) & tablo2(J, 3)
                 On Error Resume Next
                 macol.add I + 21, Str(I + 21)
               End If
             End If
           End If
         End If
      End If
    Next J
Next I
Sheets("Fiche_machine").Range("A22:C" & derlign1) = tablo1
For I = macol.Count To 1 Step -1
  quoi = Split(Range("C" & macol.Item(I)), Chr(10))
  For J = UBound(quoi) To 1 Step -1
    Rows(macol.Item(I) + 1).Insert , xlShiftDown
    Range("C" & macol.Item(I) + 1).Value = quoi(J)
  Next J
  Range("C" & macol.Item(I)).Value = quoi(0)
Next I
Application.ScreenUpdating = True
End Sub
0
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 07:21
Bonjour ucfoutu,

Je voulais savoir si les captures d'écran étaient assez clair et comportées les informations nécessaire pour pouvoir faire le code. As tu remarqué quelquechose d'incohérent entre le tableau et le code actuel? De mon côté je séche.

Robin
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2012 à 07:51
Si tu poses cette question, c'est que tu as pris conscience de ce que tu n'as pas fait ce que je demandais, à savoir :
une avec les tenants, l'autre avec les aboutissants, le tout : accompagné des commentaires nécessaires quant à la relation entre le "départ" et "l'arrivée" !



________________________
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
12 juil. 2012 à 07:57
Je pensais l'avoir fait pour que ce soit compréhensible
J'y retravaille !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2012 à 08:01
Et essaye de mettre tes 3 images dans une seule (groupe-les) de sorte à ce que je puisse voir tout à la fois sans avoir besoin de sans cesse naviguer d'un dessin à l'autre :
Ta feuille machine avant traitement et ta feuille maxituo (avec leurs données)
Ta feuille machine après traitement


________________________
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
12 juil. 2012 à 08:04
Je veux voir un exemple avec tout (des données de départ et leur résultat final), si possible le tout groupé en une seule image (tes 3 images groupées, donc, en une seule, de sorte à ce que je puisse m'y retrouver sans gymnastique et sans nécessité de tout garder en mémoire pour y voir un peu clair ).


________________________
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
12 juil. 2012 à 09:13
Okay ça marche, je vais faire ça.
0
robby98800 Messages postés 64 Date d'inscription mardi 29 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 10:53
Voilà tout est sur une image.
http://cjoint.com/?0Gmk1jhAHEk
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2012 à 11:13
OK !
J'ai maintenant vu quels étaient les tenants et aboutissants.
Il est clair qu'il y a à la base une carence de conception qui vient maintenant sacrément compliquer le traitement ! (conditions forcément "croisées" entre : machine concernée, types et positions !
Ce que tu veux obtenir peut quand-même l'être, mais : sur ces bases-là, ça va forcément "ramer" !
Je te conseille donc vivement de reprendre tout à la base (la conception même, qui ne relève pas, elle, du développement, mais d'autre chose).
Si toutefois, tu restes avec ta conception actuelle, je ferai avec, mais :
1) pas avant ce soir
2) ne te plains ensuite pas de la lenteur d'exécution qui sera forcément induite
Tu dis !

________________________
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