Excel: Plusieurs Conditions dans une boucle

Résolu
tictac847 Messages postés 26 Statut Membre -  
tictac847 Messages postés 26 Statut Membre -
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. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
  3. tictac847 Messages postés 26 Statut Membre
     
    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. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
       
      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
  4. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tictac847 Messages postés 26 Statut Membre
     
    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. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
       
      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. tictac847 Messages postés 26 Statut Membre
       
      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. tictac847 Messages postés 26 Statut Membre
       
      Et merci.
      0
    4. tictac847 Messages postés 26 Statut Membre
       
      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