[VBA] Problème de boucle ?
Résolu/Fermé
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
-
9 juin 2008 à 15:08
Doudou95 Messages postés 1561 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 30 avril 2019 - 10 juin 2008 à 15:58
Doudou95 Messages postés 1561 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 30 avril 2019 - 10 juin 2008 à 15:58
A voir également:
- [VBA] Problème de boucle ?
- Erreur 1004 vba ✓ - Forum VB / VBA
- Redmi note 10 redemarre en boucle - Forum Xiaomi
- Vba ouvrir un fichier excel avec chemin ✓ - Forum VB / VBA
- Find vba - Astuces et Solutions
- Vba attendre 1 seconde ✓ - Forum VB / VBA
14 réponses
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
9 juin 2008 à 15:22
9 juin 2008 à 15:22
help :(
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
9 juin 2008 à 15:29
9 juin 2008 à 15:29
Range("A2").Select
Set cel2 = Range("A1")
Do While cel2.Offset(i, 1).Value <> ""
If (cel2.Offset(i, 15).Value + pal) < 16500 Then
pal = cel2.Offset(i, 15).Value + pal
Else
Selection.EntireRow.Insert
Selection.Offset(1, 0).Select
End If
Selection.Offset(1, 0).Select
Loop
Set cel2 = Range("A1")
Do While cel2.Offset(i, 1).Value <> ""
If (cel2.Offset(i, 15).Value + pal) < 16500 Then
pal = cel2.Offset(i, 15).Value + pal
Else
Selection.EntireRow.Insert
Selection.Offset(1, 0).Select
End If
Selection.Offset(1, 0).Select
Loop
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
9 juin 2008 à 15:48
9 juin 2008 à 15:48
faut que ça test jusqu'à la dernière case sachant que le fichier avec le nombre de cellules change
donc cell["1","1"] pas bon
j'ai supprimé mais j'avais initialisé a 0 pal
Range("A2").Select 'Se positionne en A2, première valeur de la colonne 1
Set cel2 = Range("A1")
pal = 0
Do While cel2.Offset(i, 1).Value <> "" 'Tant que cellule non vide faire
If (cel2.Offset(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors
pal = cel2.Offset(i, 15).Value + pal ' pal = valeur cellule + pal
Else ' Sinon
Selection.EntireRow.Insert ' Insérer colonne
Selection.Offset(1, 0).Select ' Passer à la ligne suivante
pal = 0 ' Initialisation de pal
End If ' Fin Si
Selection.Offset(1, 0).Select ' Passer à la ligne suivante
Loop 'Fin tant que
donc cell["1","1"] pas bon
j'ai supprimé mais j'avais initialisé a 0 pal
Range("A2").Select 'Se positionne en A2, première valeur de la colonne 1
Set cel2 = Range("A1")
pal = 0
Do While cel2.Offset(i, 1).Value <> "" 'Tant que cellule non vide faire
If (cel2.Offset(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors
pal = cel2.Offset(i, 15).Value + pal ' pal = valeur cellule + pal
Else ' Sinon
Selection.EntireRow.Insert ' Insérer colonne
Selection.Offset(1, 0).Select ' Passer à la ligne suivante
pal = 0 ' Initialisation de pal
End If ' Fin Si
Selection.Offset(1, 0).Select ' Passer à la ligne suivante
Loop 'Fin tant que
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
9 juin 2008 à 16:03
9 juin 2008 à 16:03
je pense que c'est clair où ne comprenez vous pas ma question?
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
9 juin 2008 à 16:31
9 juin 2008 à 16:31
Non, c'est pas très clair, mais essaies ca :
pal = 0 i = 1 Do While Cells(i, 1).Value <> "" 'Tant que cellule non vide faire If (cel2.Offset(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors pal = Cells(1, 15).Value + pal ' pal = valeur cellule + pal Else ' Sinon Cells(i, 1).EntireRow.Insert ' Insérer colonne i = i + 1 pal = 0 ' Initialisation de pal End If ' Fin Si i = i + 1 Loop 'Fin tant que
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
9 juin 2008 à 16:39
9 juin 2008 à 16:39
ca arrive en début de colonne puis erreur => Objet requis
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
9 juin 2008 à 16:52
9 juin 2008 à 16:52
J'ai oublié de modifier dans le test :
Et tu veux insérer une colonne ou une ligne Cells(i,1).EntireRow.Insert c'est pour insérer une ligne contrairement à ce que tu mets dans ton commentaire
pal = 0 i = 1 Do While Cells(i, 1).Value <> "" 'Tant que cellule non vide faire If (Cells(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors pal = Cells(1, 15).Value + pal ' pal = valeur cellule + pal Else ' Sinon Cells(i, 1).EntireRow.Insert ' Insérer colonne i = i + 1 pal = 0 ' Initialisation de pal End If ' Fin Si i = i + 1 Loop 'Fin tant que
Et tu veux insérer une colonne ou une ligne Cells(i,1).EntireRow.Insert c'est pour insérer une ligne contrairement à ce que tu mets dans ton commentaire
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
>
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
10 juin 2008 à 09:02
10 juin 2008 à 09:02
Comment définir pal? parce qu'il y a incompatibilité de type en erreur
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
>
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
10 juin 2008 à 09:05
10 juin 2008 à 09:05
T'as quoi en colonne O ?
pal = Cells(i, 15).Value + pal
pal = Cells(i, 15).Value + pal
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 09:08
10 juin 2008 à 09:08
ben un entier vu que l'on l'additionne et que l'on vérifie qu'il est inférieur a 16500
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
10 juin 2008 à 09:13
10 juin 2008 à 09:13
T'as essayé le mode débuggage Pas à Pas avec un espion sur Cells(i, 15) ?
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 09:20
10 juin 2008 à 09:20
L'erreur se fait ici :
If (Cells(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors
If (Cells(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
10 juin 2008 à 09:37
10 juin 2008 à 09:37
Dès le premier passage ?
Qu'y a t'il et dans Cells(i,15).Value et dans pal au moment de l'erreur ?
Qu'y a t'il et dans Cells(i,15).Value et dans pal au moment de l'erreur ?
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 09:36
10 juin 2008 à 09:36
tu trouves :S ?
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 09:40
10 juin 2008 à 09:40
Cells(i;15) = Qté ca a pris la ligne 1 faut que ca commence à la seconde !) et pal c'est bon c'est 0
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
10 juin 2008 à 09:41
10 juin 2008 à 09:41
Alors initialise ton i à 2
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 09:46
10 juin 2008 à 09:46
pal = 0
i = 1
Do While Cells(i, 1).Value <> "" 'Tant que cellule non vide faire
If (Cells(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors
pal = Cells(1, 15).Value + pal ' pal = valeur cellule + pal
Else ' Sinon
Cells(i, 1).EntireRow.Insert ' Insérer colonne
i = i + 1
pal = 0 ' Initialisation de pal
End If ' Fin Si
i = i + 2
Loop 'Fin tant que
Si je remplace le 1 par ça marche pour le premier saut de ligne après ça saute une ligne mais pas avant 16500 :(
Si je laisse 1 = > incompatibilité de type
Si je mets 2 = > Sauts de lignes apparemment aléatoires
i = 1
Do While Cells(i, 1).Value <> "" 'Tant que cellule non vide faire
If (Cells(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors
pal = Cells(1, 15).Value + pal ' pal = valeur cellule + pal
Else ' Sinon
Cells(i, 1).EntireRow.Insert ' Insérer colonne
i = i + 1
pal = 0 ' Initialisation de pal
End If ' Fin Si
i = i + 2
Loop 'Fin tant que
Si je remplace le 1 par ça marche pour le premier saut de ligne après ça saute une ligne mais pas avant 16500 :(
Si je laisse 1 = > incompatibilité de type
Si je mets 2 = > Sauts de lignes apparemment aléatoires
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
10 juin 2008 à 09:47
10 juin 2008 à 09:47
C'est pas Cells(1,15).value, mais Cells(i,15).value
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
>
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
10 juin 2008 à 09:50
10 juin 2008 à 09:50
Récapitulatif :
pal = 0 i = 2 ' On commence à la ligne 2 Do While Cells(i, 1).Value <> "" 'Tant que cellule non vide faire If (Cells(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors pal = Cells(i, 15).Value + pal ' pal = valeur cellule + pal Else ' Sinon Cells(i, 1).EntireRow.Insert ' Insérer colonne i = i + 1 ' Incrémentation de i car ajout de ligne pal = 0 ' Initialisation de pal End If ' Fin Si i = i + 1 ' Incrémentation de i pour passer à la ligne suivante Loop 'Fin tant que
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 09:49
10 juin 2008 à 09:49
Si je remplace le 1 par i ça marche pour le premier saut de ligne après ça saute une ligne mais pas avant 16500 :(
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 09:56
10 juin 2008 à 09:56
Qté
4600
8000
4000
7200
5600
5100
7500
9300
10300
Voila tu vois que ca marche que pour le début après ca ne fonctionne plus correctement
4600
8000
4000
7200
5600
5100
7500
9300
10300
Voila tu vois que ca marche que pour le début après ca ne fonctionne plus correctement
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
10 juin 2008 à 10:03
10 juin 2008 à 10:03
Enlèves le i = i + 1 après l'insertion de ligne
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
>
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
10 juin 2008 à 10:06
10 juin 2008 à 10:06
ca commence d'en bas le calcul faut le commencer en partant du début de la colonne (calculant en partant du bas ca me crée un bug au niveau de la première ligne qui est une chaine de caractères en créant à l'infini des nouvelles lignes)
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
>
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
10 juin 2008 à 10:08
10 juin 2008 à 10:08
En mettant ce code ci :
J'obtient :
Qté
4600
8000
4000
7200
5600
5100
7500
9300
10300
pal = 0 i = 2 Do While Cells(i, 1).Value <> "" 'Tant que cellule non vide faire If (Cells(i, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors pal = Cells(i, 15).Value + pal ' pal = valeur cellule + pal Else ' Sinon Cells(i, 1).EntireRow.Insert ' Insérer colonne ' i = i + 1 pal = 0 ' Initialisation de pal End If ' Fin Si i = i + 1 Loop 'Fin tant que
J'obtient :
Qté
4600
8000
4000
7200
5600
5100
7500
9300
10300
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
>
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
10 juin 2008 à 10:19
10 juin 2008 à 10:19
envoi un site pour héberger le fichier je tenvoi la macro complémentaire et le fichier tu vera :'(
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 10:31
10 juin 2008 à 10:31
parce que ca marche pas comme toi
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 10:42
10 juin 2008 à 10:42
[url]http://uploading.com/files/61H0Z3WF/Inter_Macro.xls.html[/url]
[url]http://uploading.com/files/G42CBQ71/FormatCarton.xla.html[/url]
Tiens et test tu veras
[url]http://uploading.com/files/G42CBQ71/FormatCarton.xla.html[/url]
Tiens et test tu veras
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
10 juin 2008 à 11:16
10 juin 2008 à 11:16
help
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
10 juin 2008 à 11:48
10 juin 2008 à 11:48
La macro ne part pas "du bas" comme tu le penses, c'est la dernière cellule sélectionnée suite à l'execution de ton code précédent,
Elle boucle bien à partir de la cellule qui a comme référence la ligne i (donc 2 au départ) et la colonne 1 :
i = 2
Do While Cells(i,1).Value<>""
...
Le fait d'accéder directement à la référence de la cellule sans la sélectionner fait gagner en temps d'execution, mais en débuggage il est vrai qu'on est un peu perdu.
Ceci étant le problème venait d'ailleurs : quand le total était supérieur à 16500, la ligne s'ajoutait sans problème, mais si par malheur la cellule suivante dans la colonne O avait une valeur supérieure à 16500 également, les lignes s'inséraient à l'infini ...
Le code suivant devrait fonctionner :
Elle boucle bien à partir de la cellule qui a comme référence la ligne i (donc 2 au départ) et la colonne 1 :
i = 2
Do While Cells(i,1).Value<>""
...
Le fait d'accéder directement à la référence de la cellule sans la sélectionner fait gagner en temps d'execution, mais en débuggage il est vrai qu'on est un peu perdu.
Ceci étant le problème venait d'ailleurs : quand le total était supérieur à 16500, la ligne s'ajoutait sans problème, mais si par malheur la cellule suivante dans la colonne O avait une valeur supérieure à 16500 également, les lignes s'inséraient à l'infini ...
Le code suivant devrait fonctionner :
Pal = 0 i = 2 Do While Cells(i, 1).Value <> "" If Pal + Cells(i, 15).Value < 16500 Then Pal = Pal + Cells(i, 15).Value Else If Pal = 0 Then ' Si on venait d'insérer une ligne, alors insérer la suivante en ligne + 1 Cells(i + 1, 15).EntireRow.Insert Pal = Cells(i, 15).Value i = i + 1 Else Cells(i, 15).EntireRow.Insert End If ' Met le sous-total dans la cellule Cells(i, 15).Value = Pal Cells(i, 15).Font.Bold = True Pal = 0 End If i = i + 1 Loop
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
>
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
10 juin 2008 à 13:37
10 juin 2008 à 13:37
:D marche pas plus ^^
Mais j'avais une couille déja dans mon code...
Ca reprend plus l'idée suivante :
[code]pal = 0
i = 2
Do While Cells(i, 1).Value <> "" 'Tant que cellule non vide faire
If (Cells(i + 1, 15).Value + Cells(i + 1, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors
pal = Cells(i, 15).Value + pal ' pal = valeur cellule + pal
Else ' Sinon
Cells(i, 1).EntireRow.Insert ' Insérer colonne
i = i + 1
pal = 0 ' Initialisation de pal
End If ' Fin
i = i + 1
Loop 'Fin tant que[/code]
Autrement ditpour tester la cellule suivante il faut bien additionner d'abord pal et la cellule sur laquelle on se trouve après ton code marche pas mieu :S
Mais j'avais une couille déja dans mon code...
Ca reprend plus l'idée suivante :
[code]pal = 0
i = 2
Do While Cells(i, 1).Value <> "" 'Tant que cellule non vide faire
If (Cells(i + 1, 15).Value + Cells(i + 1, 15).Value + pal) < 16500 Then ' Si valeur de la cellule + pal < 16500 alors
pal = Cells(i, 15).Value + pal ' pal = valeur cellule + pal
Else ' Sinon
Cells(i, 1).EntireRow.Insert ' Insérer colonne
i = i + 1
pal = 0 ' Initialisation de pal
End If ' Fin
i = i + 1
Loop 'Fin tant que[/code]
Autrement ditpour tester la cellule suivante il faut bien additionner d'abord pal et la cellule sur laquelle on se trouve après ton code marche pas mieu :S
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
120
>
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
10 juin 2008 à 13:52
10 juin 2008 à 13:52
Le code que je t'ai envoyé fonctionne pour moi, qu'est ce qui te gênait ?
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
>
onesdf
Messages postés
375
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
17 octobre 2008
10 juin 2008 à 14:22
10 juin 2008 à 14:22
marche pas pour moi je sais pas pourquoi :(
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
275
>
Doudou95
Messages postés
1561
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
10 juin 2008 à 15:58
10 juin 2008 à 15:58
C'est bon j'ai réussi en farfouillant...
Le code attendu et que j'ai enfin fini par trouver est :
Le code attendu et que j'ai enfin fini par trouver est :
pal = 0 i = 2 Do While Cells(i, 1).Value <> "" 'Tant que cellule non vide faire If (Cells(i + 1, 15).Value + Cells(i, 15).Value + pal) <= 16500 Then ' Si valeur de la cellule + pal < 16500 alors pal = Cells(i, 15).Value + pal ' pal = valeur cellule + pal Else ' Sinon i = i + 1 Cells(i, 1).EntireRow.Insert ' Insérer colonne pal = 0 ' Initialisation de pal End If ' Fin i = i + 1 Loop 'Fin tant que
9 juin 2008 à 15:28
Mets nous ton code histoire que l'on comprenne mieux ton souci
David