Excel: Plusieurs Conditions dans une boucle

Résolu/Fermé
tictac847 Messages postés 26 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 24 décembre 2013 - 20 janv. 2012 à 23:10
tictac847 Messages postés 26 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 24 décembre 2013 - 22 janv. 2012 à 15:10
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

A voir également:

5 réponses

Le Pingou Messages postés 12222 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 3 décembre 2024 1 452
20 janv. 2012 à 23:37
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 711
20 janv. 2012 à 23:39
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
tictac847 Messages postés 26 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 24 décembre 2013
21 janv. 2012 à 00:47
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
Le Pingou Messages postés 12222 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 3 décembre 2024 1 452
21 janv. 2012 à 10:00
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
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 858
21 janv. 2012 à 09:57
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

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

Posez votre question
tictac847 Messages postés 26 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 24 décembre 2013
22 janv. 2012 à 00:46
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
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 858
22 janv. 2012 à 10:31
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
tictac847 Messages postés 26 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 24 décembre 2013
22 janv. 2012 à 14:53
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
tictac847 Messages postés 26 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 24 décembre 2013
22 janv. 2012 à 14:54
Et merci.
0
tictac847 Messages postés 26 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 24 décembre 2013
22 janv. 2012 à 15:10
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