Excel: Plusieurs Conditions dans une boucle

Résolu
Bonjour à tous,

J'ai fais une petite macro qui est compose d'une boucle For contenant une seconde boucle For et des conditions en If.
Du coup bien que j'ai essayer des dizaine de meli melo de combinaisons je n'arrive pas a lancer la macro sans avoir d'erreur du type; "If sans end IF", "Variable incorrect pour next".. bref je ne m'y retrouve plus.
voici la partie du code qui pose probleme. J'ai mis des lettre en majuscule pour relier chaque if a son end if et chaque for a son next.:

With Range("B101:B1000")
NumLigne = 1001

    For i = 1 To 10 Step 1     '***C****
                If UserFormPlanning.Controls("TextBoxTaille" & i).Text <> "" Then           '***D****
                    Nbpak = UserFormPlanning.Controls("TextBoxNbrPaq" & i).Text
                            
                                For Each x In Range("B101:B1000")                   '***A****
                                     If IsEmpty(x) And x.Row < NumLigne Then  '***B****
                                         NumLigne = x.Row
                                     End If                                                            '***B**** end
                                Exit For                                                   '***A****end
                        
                              
                           For p = 0 To Nbpak - 1 Step 1                                      '***C****
                                x.Offset(p, 0).Value = BLABLABLA
                                x.Offset(p, 1).Value = BLABLABLA
                                x.Offset(p, 4).Value = BLABLABLA
                            Next p
                             
                              If UserFormPlanning.Controls("TextBoxRestPak" & i) <> 0 Then
                                  x.Offset(Nbpak, 0).Value = BLABLABLA
                                  x.Offset(Nbpak, 1).Value = BLABLABLA
                                  x.Offset(Nbpak, 2).Value = BLABLABLA
                              End If
                            
                End If    '***D****end
    Next i        '***C****end
End With


Si quelqu'un peut m'aider a trouver l'erreur ca serait impecable. Sinon ma question est la suivante. La presence d'une boucle for a-telle une influence sur la syntaxe d'un IF, car il me semble que parfois le end if n'est plus requis voir même rejeter.

Merci

5 réponses

  1. Bonjour
    Un [Next x] manque et pourquoi le [Exit For] ... !!

    With Range("B101:B1000")
    NumLigne = 1001
    For i = 1 To 10 Step 1     '***C****	
    	If UserFormPlanning.Controls("TextBoxTaille" & i).Text <> "" Then '***D****          
          	Nbpak = UserFormPlanning.Controls("TextBoxNbrPaq" & i).Text
    		For Each x In Range("B101:B1000")                   '***A****                        
            		If IsEmpty(x) And x.Row < NumLigne Then  '***B****
    				NumLigne = x.Row                                     
    			End If                                  '***B**** end                                                                                                     
    			Exit For  ` ****** pour quel raison                                                                                    
    Next x 						'***A****end
                            
             For p = 0 To Nbpak - 1 Step 1               '***C****
                x.Offset(p, 0).Value = BLABLABLA
                x.Offset(p, 1).Value = BLABLABLA
                x.Offset(p, 4).Value = BLABLABLA
             Next p 					`***C****end
                                 
             If UserFormPlanning.Controls("TextBoxRestPak" & i) <> 0 Then
             		x.Offset(Nbpak, 0).Value = BLABLABLA
    			x.Offset(Nbpak, 1).Value = BLABLABLA                                  
                 x.Offset(Nbpak, 2).Value = BLABLABLA
             End If
          End If    '***D****end
    Next i        '***C****end
    End With
    0
    1. Contributeur
      bonjour

      Il te manque un next x après le Exit For probablement.

      Les boucles ne changent pas la syntaxe des if

      Tu n'as pas besoin de end if si l'instruction est complète, par exemple :
      if x < y then x = x + y
      est équivalent à
      if x < y then
      x = x + y
      end if
      0
      1. Re,
        Merci pour les réponses rapides
        Mais next x à la place de exit for me donne: 'Variable objet ou variable de bloc With non définis"
        Le exit for était juste une des nombreuse manoeuvre désespérée pour essayer de résoudre l'erreur.
        juste apres next p ca me repete la meme instruction à l'infini et n'importe ou apres ca me donne "end if sans bloc if"
        Je vais tester d'autre maniere d'organiser mon codes.
        merci
        0
        1. Bonjour,
          Je n'ai pas dit de : Mais next x à la place de exit for me donne: 'Variable objet ou variable de bloc With non définis"
          Seulement il manque le [Next x].

          En plus je vous ai remis votre code corrigé et j'aimerais bien savoir s'il fonctionne ?
          Salutations
          Le Pingou
          0
      2. Bonjour,

        1) le With/End With ne sert à rien.

        2) pour le for each : il semble te trouver la ligne de la première cellule vide.
        Attention à ce qui va se passer si tu as une ligne vide dans ta liste! le reste du code va écraser tes données. Enfin, il ne va pas le faire puisqu'il ne peut pas fonctionner du fait que le x n'est plus défini (on est sorti de la boucle For Each).
        Mais quand le code sera corrigé, attention aux écrasements.
        For Each x In Range("B1:B100")
            If IsEmpty(x) And x.Row < NumLigne Then
                NumLigne = x.Row: Exit For
            End If
        Next
        

        3) Ensuite, tu viens de calculer un NumLigne et tu ne t'en sers pas.
        Il faut faire un set x= Cells(NumLigne, 2) pour utiliser ton code par la suite.
        Et là, tu vois ce qu'un écrasement peut faire...

        4) Tu vois aussi que lorsque ton code passe à i=2, ton NumLigne n'est pas réinitialisé à 1001 et donc tes conditions deviennent toutes fausses.
        Donc, mettre l'initialisation de NumLigne à l'intérieur de la boucle principale For i / Next i

        Pour conclure :
        * je supprimerais le With End With
        * je changerais le nom de la variable x utilisée dans le For Each pour différencier avec le set x qui suit. (ça fonctionne quand même si tu ne le fais pas)
        * je m'interrogerais sur la possible existence de lignes vides dans ma colonne B.

        Cordialement
        0
        1. Bonjour à tous, et merci pour vos reponses.
          J'ai suivi vos conseil et je suis parvenu au code suivant.
          NumLigne = 1001
          
              For i = 1 To 10 Step 1
              NumLigne = 1001                
                              
              
                 If UserFormPlanning.Controls("TextBoxTaille" & i).Text <> "" Then
                      Nbpak = UserFormPlanning.Controls("TextBoxNbrPaq" & i).Text
                 
                             For Each x In Range("B101:B1000")
                                  If IsEmpty(x) And x.Row < NumLigne Then
                                      x.Select
                             Exit For
                                 End If
                                       Next
                       
                 
                        For p = 0 To Nbpak - 1 Step 1
                             x.Offset(p, 0).Value = Blabla
                             x.Offset(p, 1).Value = Blabla
                             
                             If UserFormPlanning.Controls("TextBoxRestPak" & i) <> 0 Then
                                 x.Offset(p, 0).Value = Blabla
                                 x.Offset(p, 1).Value = Blabla
                             End If
                         Next p
                           
                                   
                             End If
                               
              Next i
          


          @ JVDO: j'ai supprimer les with/end with et inserer ma ligne dans la boucleje pense que ca regle le probleme. Apres plusieurs essais ça à l'air de fonctionner correctement.
          @Le Pingou, excusez moi j'avais mal compris.
          Le code que vous m'avez remis me donne L'erreur erreur "objet requis" sur la ligne
          x.Offset(p, 0).Value = BLABLABLA.

          Merci
          0
          1. Bonjour,

            Tu as déplacé ton Next p. Je pensais que ton éventelle affectation de données (x.Offset(Nbpak, 0).Value = BLABLABLA) correspondait à une sorte de total. Maintennant, tu ne l'as plus, ou, du moins, tu l'as sur toutes les lignes de 0 à Nbpak-1.
            En effet, si UserFormPlanning.Controls("TextBoxRestPak" & i) <> 0, tu écrases ce que tu viens d'écrire 3 lignes avant.
            Si mon interprétation est vraie, remonte le next p et remet ton code précédent pour la dernière ligne.

            Et si....., et si tu supprimais ton NumLigne et la condition And x.Row < NumLigne, ton code fonctionnerait aussi bienn non?
            cordialement
            0
          2. Bonjour

            En fait je cherche a inserer un nombre de ligne p pour chaque condition i qui est vrai.
            le schema devrait ressembler a ceci.

             for i = 1 to 10 step 1
                  If UserFormPlanning.Controls("TextBoxTaille" & i).Text <> ""

            admettons que ce soit vrai pour jusqu'a 3
            et que pour
            i=1 ==> nbpak = 3
            i=2 ==> nbpak = 1
            i=3 ==> nbpak = 2

            je voudrais avoir
            i1 . p1
            i1 . p2
            i1 . p3
            i2 . p1
            i3 . p1
            i3 . p2

            A quel niveau doit je remonter next p ? Car tu as raison, j'ai un probleme d'ecrasement de donné . avec mon code actuel j'aurais eu comme resultat:
            i3 . p1
            i3 . p2
            Sinon je pourrais peut etre utiliser un "endxlup" pour retrouver la premiere ligne vide a partir du bas et eviter l'ecrasement .

            cordialement
            0
          3. Et merci.
            0
          4. Re,
            Finalement le code fonctionne bien. Ct juste une erreur lors de la premiere utilisation de la macro qui sautait la 1er ligne du tableau.
            Du coup lors de la 2eme utilisation la 1ere ligne (Vide) etait reconnue par le code et les nouvelle données ecrasaient les 1ere.
            Je pense que je vais faire une recherche par le bas pour eviter ce probleme a l'avenir.
            Merci encore
            0