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
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
A voir également:
- Excel: Plusieurs Conditions dans une boucle
- Liste déroulante excel - Guide
- Si et excel - Guide
- Aller à la ligne excel - Guide
- Word et excel gratuit - Guide
- Mise en forme conditionnelle excel - Guide
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
20 janv. 2012 à 23:37
Bonjour
Un [Next x] manque et pourquoi le [Exit For] ... !!
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
22 janv. 2012 à 00:46
Bonjour à tous, et merci pour vos reponses.
J'ai suivi vos conseil et je suis parvenu au code suivant.
@ 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
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
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
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
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
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
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.
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
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
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
22 janv. 2012 à 14:54
Et merci.
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
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
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