Excel: Plusieurs Conditions dans une boucle
Résolu
tictac847
Messages postés
26
Date d'inscription
Statut
Membre
Dernière intervention
-
tictac847 Messages postés 26 Date d'inscription Statut Membre Dernière intervention -
tictac847 Messages postés 26 Date d'inscription Statut Membre Dernière intervention -
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.:
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
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:
- Excel: Plusieurs Conditions dans une boucle
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
- Excel moyenne - Guide
5 réponses
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
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
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
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
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
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
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
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