Gros soucis avec les boucles! [Résolu]

Signaler
Messages postés
27
Date d'inscription
samedi 30 novembre 2013
Statut
Membre
Dernière intervention
10 décembre 2013
-
Messages postés
27
Date d'inscription
samedi 30 novembre 2013
Statut
Membre
Dernière intervention
10 décembre 2013
-
Bonjour,
j'ai une macro qui fonctionne bien avec uniquement "Do While....Loop".
Entre ce "Do" et ce "Loop" il faudrait que je mette des boucles "If" (ou autres) pour écrire dans différentes "Feuil" en fonction de la valeur d'une cellule "B13" appartenant à un "DossierFactures".
Mais dès que je met une deuxième boucle "If" j'ai un message d'erreur "boucle sans DO". Et là je suis perdu!!
(je joins la macro, ce sera peut-être plus clair).
SVP aidez-moi! Merci.

Sub Test1()
ChDir "M:\MARC\Facture-Gab\Fact-Synth\"
DossierFactures = Dir("M:\MARC\Facture-Gab\Fact-Synth\*.xlsx")
'Début boucle trim1
  Dim j As Integer
  j = 12
  
Do While Len(DossierFactures) > 0

'ouverture dossier facture
    Workbooks.Open "M:\MARC\Facture-Gab\Fact-Synth\" & DossierFactures
 If Range("B13") < 4 = True Then
'traitement data
 Dim plage As Range, desti As Range, i As Integer
 Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("B" & j)
 Set plage = Range("G6, H33,I34, J35")
 For i = 1 To plage.Areas.Count
 desti.Offset(0, i - 1).Value = plage.Areas(i).Value
 Next
 Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("A" & j) = DossierFactures

'fermeture classeur xlsx
 Workbooks(DossierFactures).Saved = True
 Workbooks(DossierFactures).Close

 DossierFactures = Dir
 j = j + 1
Else:

'boucle trim2
  If Range("B13") < 7 = True Then
'traitement data
  Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("B" & j)
  Set plage = Range("G6, H33,I34, J35")
  For i = 1 To plage.Areas.Count
  desti.Offset(0, i - 1).Value = plage.Areas(i).Value
  Next
  Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("A" & j) = DossierFactures

'fermeture classeur xlsx
  Workbooks(DossierFactures).Saved = True
  Workbooks(DossierFactures).Close

  DossierFactures = Dir
  j = j + 1
  Else: End If
Loop
    Columns("A:A").Replace ".xlsx", ""

End Sub

28 réponses

Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021
155
Message remis en forme avec les balises de codes.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Une simple indentation (ce n'est pas du luxe) du code ===>>
Sub Test1()
ChDir "M:\MARC\Facture-Gab\Fact-Synth\"
DossierFactures = Dir("M:\MARC\Facture-Gab\Fact-Synth\*.xlsx")
'Début boucle trim1
Dim j As Integer
j = 12
Do While Len(DossierFactures) > 0
'ouverture dossier facture
Workbooks.Open "M:\MARC\Facture-Gab\Fact-Synth\" & DossierFactures
If Range("B13") < 4 = True Then
'traitement data
Dim plage As Range, desti As Range, i As Integer
Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("B" & j)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("A" & j) = DossierFactures
'fermeture classeur xlsx
Workbooks(DossierFactures).Saved = True
Workbooks(DossierFactures).Close
DossierFactures = Dir
j = j + 1
Else:
'boucle trim2
If Range("B13") < 7 = True Then
'traitement data
Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("B" & j)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("A" & j) = DossierFactures
'fermeture classeur xlsx
Workbooks(DossierFactures).Saved = True
Workbooks(DossierFactures).Close
DossierFactures = Dir
j = j + 1
Else: End If
Loop
Columns("A:A").Replace ".xlsx", ""
End Sub

Met DEJA en évidence une condition If sans End If !

Je n'ai pas regardé le reste et ne le regarderai pas tant que cette faute grossière n'aura pas été corrigée.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Lorsque tu auras su (c'est vraiment là un minimum) corriger cette faute bien trop élémentaire, je te montrerai comment réécrire tout cela de manière plus claire (en définissant tes objets) et concise (en évitant notamment toutes tes répétitions)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Et qu'as-tu en cellule B13 ? je jurerais que tu y as des N°s de mois (me trompe-je) ? (car alors on peut tout simplifier, sans la moindre expression conditionnelle !)
Par ailleurs (et là, ce n'est qu'une question de logique) : je vois que tu incrémentes ton j de manière univalente, quelle que soit la feuille de destination). Tu ne vois pas comme un petit problème de logique, là, toi ? Moi oui.
Messages postés
3
Date d'inscription
dimanche 8 décembre 2013
Statut
Membre
Dernière intervention
8 décembre 2013

que veux tu|????
Messages postés
3
Date d'inscription
dimanche 8 décembre 2013
Statut
Membre
Dernière intervention
8 décembre 2013

je croi pas qu'il soit besoin de mon aide!!!!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Mais bien sûr que oui, qu'il a besoin d'aide, layla olga !
Allez ! commence par le plus simple : répare (sans rien toucher d'autre) l'erreur sommaire dénoncée...
Messages postés
27
Date d'inscription
samedi 30 novembre 2013
Statut
Membre
Dernière intervention
10 décembre 2013

Bonjour,
merci d'essayer de m'aider!
J'ai beau essayer, j'ai toujours "boucle sans DO" et je comprend pas!

Sub Test1()
ChDir "M:\MARC\Facture-Gab\Fact-Synth\"
DossierFactures = Dir("M:\MARC\Facture-Gab\Fact-Synth\*.xlsx")
Dim j As Integer
j = 12
'Début boucle principale
Do While Len(DossierFactures) > 0

'ouverture dossier facture
Workbooks.Open "M:\MARC\Facture-Gab\Fact-Synth\" & DossierFactures

'boucle trim1
If Range("B13") < 4 = True Then
'traitement data
Dim plage As Range, desti As Range, i As Integer
Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("B" & j)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("A" & j) = DossierFactures

'fermeture classeur xlsx
Workbooks(DossierFactures).Saved = True
Workbooks(DossierFactures).Close

DossierFactures = Dir
j = j + 1
Else:

'boucle trim2
If Range("B13") < 7 = True Then
'traitement data
Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("B" & j)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("A" & j) = DossierFactures

'fermeture classeur xlsx
Workbooks(DossierFactures).Saved = True
Workbooks(DossierFactures).Close

DossierFactures = Dir
j = j + 1
Else:
Loop
Columns("A:A").Replace ".xlsx", ""

End Sub
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Ton code est à nouveau non indenté ( et l'indentation t'aiderait beaucoup) et non présenté entre balises code !
Ce n'est pas sérieux.
Quant à : "je ne comprends pas" : tu ne comprends pas quoi ? L'utilisation d'une chose aussi simple que la syntaxe d'une expression conditionnelle ? (If... then...Else... End If) ??

PS : par ailleurs (rmais moins important) ; Quelle serait selon toi la différence entre si "toto < 10 alors .." et "si toto < 10 est vrai, alors ..." ?
Cela non plus, ti ne le "comprends pas" ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
27
Date d'inscription
samedi 30 novembre 2013
Statut
Membre
Dernière intervention
10 décembre 2013

Sub Test1()
ChDir "M:\MARC\Facture-Gab\Fact-Synth\"
DossierFactures = Dir("M:\MARC\Facture-Gab\Fact-Synth\*.xlsx")
Dim j As Integer, k As Integer
j = 12
'Début boucle principale
Do While Len(DossierFactures) > 0

'ouverture dossier facture
Workbooks.Open "M:\MARC\Facture-Gab\Fact-Synth\" & DossierFactures
k = Range("B13").Value

'boucle trim1
If k <= 3 = True Then
'traitement data
Dim plage As Range, desti As Range, i As Integer
Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("B" & j)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("A" & j) = DossierFactures

'fermeture classeur xlsx
Workbooks(DossierFactures).Saved = True
Workbooks(DossierFactures).Close

DossierFactures = Dir
j = j + 1
ElseIf k > 3 = True Then
'boucle trim2
'traitement data
Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("B" & j)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("A" & j) = DossierFactures

'fermeture classeur xlsx
Workbooks(DossierFactures).Saved = True
Workbooks(DossierFactures).Close

DossierFactures = Dir
j = j + 1
Columns("A:A").Replace ".xlsx", ""
Loop
End Sub

Pour moi, c'est pareil avec "vrai" ou sans.
Quand à If...Then...Else...End If je comprends la structure, ce que je ne comprend pas c'est "Boucle sans Do"!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Le message que tu reçois es dû au fait que ton code arrive à un loop alors que des expressions conditionnelles sont encore "ouvertes", pardi !
J'insiste : il te faut apprendre la base elle-même (les expressions conditionnelles). C'est indispensable et c'est le B.A.BA de tout langage de développement.
Et puisque tu dis : "Quand à If...Then...Else...End If je comprends la structure" ==>> montre-le donc ===>> corrige au moins cette partie !...
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Tiens ===>> je vais te le prouver ===>> Lance donc ce code
toto = 12
titi = 1
Do While toto > -1
If titi = 1 Then
tata = 2
Else
If titi = 2 Then
tata = 3
toto = toto - tata
MsgBox toto
Loop
Tu le vois, ton fameux message d'erreur ? Oui, n'est-ce-pas ? Il est dû dans ce tout petit exemple à une mauvaise syntaxe (incomplète) des expressions conditionnelles qui y figurent.
Efforce-toi de "corriger" ce petit exemple ===>> cela t'ouvrira les yeux.

Enfin, quoi ! On arrive à un Loop alors que l'on est pas dans le Do, mais dans un If ! Ce loop est donc sans Do !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
27
Date d'inscription
samedi 30 novembre 2013
Statut
Membre
Dernière intervention
10 décembre 2013

Bon j'y comprend rien!
Quand je lance ça, ça fonctionne correctement (bien sur, dès que k=4 ça plante mais c'est normal) quand j'esaye un deuxième if, ça marche plus...et je trouve pas..

Sub Test1()
ChDir "M:\MARC\Facture-Gab\Fact-Synth\"
DossierFactures = Dir("M:\MARC\Facture-Gab\Fact-Synth\*.xlsx")
Dim j As Integer, k As Integer
j = 12
'Début boucle principale
Do While Len(DossierFactures) > 0

'ouverture dossier facture
Workbooks.Open "M:\MARC\Facture-Gab\Fact-Synth\" & DossierFactures
k = Range("B13").Value

'boucle trim1
If k <= 3 Then
'traitement data
Dim plage As Range, desti As Range, i As Integer
Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("B" & j)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("A" & j) = DossierFactures

'fermeture classeur xlsx
Workbooks(DossierFactures).Saved = True
Workbooks(DossierFactures).Close

DossierFactures = Dir
j = j + 1
Else: End If
Columns("A:A").Replace ".xlsx", ""
Loop
End Sub

Et pour ton petit code, j'ai beau chercher dans l'aide et faire des modifs, j'y arrive pas non plus. Trop vieux pour comprendre peut-être!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
" Trop vieux pour comprendre peut-être"
Je ne vois vraiment pas ce que l'âge pourrait avoir à faire là-dedans !!!.
Il est vrai que je suis encore particulièrement jeune, hein ... Je rajeunis même tous les jours ...
Voilà la correction du test :
toto = 12
titi = 1
Do While toto > -1
If titi = 1 Then
tata = 2
Else
If titi = 2 Then
tata = 3
End If
End If
toto = toto - tata
MsgBox toto
Loop
que l'on pourrait également écrire ainsi :
toto = 12
titi = 1
Do While toto > -1
If titi = 1 Then
tata = 2
ElseIf titi = 2 Then
tata = 3
End If
toto = toto - tata
MsgBox toto
Loop
Lis, analyse, comprends et applique à ton "cas".
Si tu n'en es pas capable à ce "niveau", que sera-ce du reste ?
Messages postés
27
Date d'inscription
samedi 30 novembre 2013
Statut
Membre
Dernière intervention
10 décembre 2013

Il y a des fois où je me sens très bête!!!!
En tous cas merci infiniment....
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Bon...
Maintenant applique à ton cas et montre...
Je reviendrai, après avoir constaté, avec du nettement mieux...

Messages postés
27
Date d'inscription
samedi 30 novembre 2013
Statut
Membre
Dernière intervention
10 décembre 2013

bon voila, pour l'instant ça marche plutot bien. Mais je vais devoir rajouter 2 boucles et là je verrai...!

Sub Test1()
ChDir "M:\MARC\Facture-Gab\Fact-Synth\"
DossierFactures = Dir("M:\MARC\Facture-Gab\Fact-Synth\*.xlsx")
Dim j As Integer, k As Integer, l As Integer
j = 12
l = 12


'Début boucle principale
Do While Len(DossierFactures) > 0

'ouverture dossier facture
Workbooks.Open "M:\MARC\Facture-Gab\Fact-Synth\" & DossierFactures
k = Range("B13").Value

'boucle trim1
If k <= 3 Then
'traitement data
Dim plage As Range, desti As Range, i As Integer
Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("B" & j)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
Workbooks("Synth-Test.xlsm").Worksheets("Feuil1").Range("A" & j) = DossierFactures

'fermeture classeur xlsx
Workbooks(DossierFactures).Saved = True
Workbooks(DossierFactures).Close

DossierFactures = Dir
j = j + 1

ElseIf k > 3 Then
'boucle trim2
'traitement data

Set desti = Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("B" & l)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
Workbooks("Synth-Test.xlsm").Worksheets("Feuil2").Range("A" & l) = DossierFactures

'fermeture classeur xlsx
Workbooks(DossierFactures).Saved = True
Workbooks(DossierFactures).Close

DossierFactures = Dir
l = l + 1


End If

Loop

End Sub
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Bon... (gastro et je dois me reposer...)
Je n'ai pas ton classeur et n'ai que des "indices" et peux donc me tromper.
Regarde quand-même ce que ferait ceci :
Sub Test1()
Dim plage As Range, desti As Range, i As Integer, dossier As String, classeurs As String
Dim cldesti As Workbook, plage As Range, desti As Range, lafeuille As String, derlig As Long
dossier = "M:\MARC\Facture-Gab\Fact-Synth\"
classeurs = Dir(dossier & "*.xlsx")
Set cldesti = Workbooks("Synth-Test.xlsm")
Do While Len(classeurs) > 0
Workbooks.Open classeurs
lafeuille = "Feuil" & Int((Range("B13").Value + 2) / 3)
derlig = Worksheets(lafeuille).Range("B12:B" & Rows.Count).SpecialCells(xlCellTypeBlanks).Row
Set desti = cldesti.Worksheets(lafeuille).Range("B" & derlig)
Set plage = Range("G6, H33,I34, J35")
For i = 1 To plage.Areas.Count
desti.Offset(0, i - 1).Value = plage.Areas(i).Value
Next
cldesti.Worksheets(lafeuille).Range("A" & derlig) = classeurs
Workbooks(classeurs).Saved = True
Workbooks(classeurs).Close
classeurs = Dir
Loop
End Sub

Il se peut que j'au une ou deux erreurs (peux pas tester). Si oui: dis lesquelles.
Tu constateras : aucune expression conditionnelle (marchera si mon petit doigt a été suffisamment "malin" et que tu traites 4 trimestres en fonction de 12 N°s de mois).
Buenas noches.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
27
Date d'inscription
samedi 30 novembre 2013
Statut
Membre
Dernière intervention
10 décembre 2013

Bonjour, désolé pour la gastro!
J'ai testé ta macro et pour l'instant j'ai eu:
[Workbooks.Open Classeurs] = fichier a.xlsx n'existe pas, remplacé par:
[Workbooks.Open "M:\MARC\Facture-Gab\Fact-Synth\" & classeurs] = ça marche.
et ensuite, une fois arrivé à:
[derlig = Worksheets(lafeuille).Range("B12:B" & Rows.Count).SpecialCells(xlCellTypeBlanks).Row] = Erreur d'éxécution '9':, l'indice n'appartient pas à la sélection.
Et là, je bloque.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Bien vu pour la 1ère erreur, que tu peux également corriger par :
Workbooks.Open dossier & classeurs
La seconde est plus gênante car elle laisse supposer une feuille d'un nom inexistant, probablement Feuil0.
Est-le cas ? Car si tel était le cas, cela voudrait dire que tu as en B13 une valeur autre que de 1 à 12 ou rien du tout !

Mais j'y pense : pourrait également être Feuil4 alors que, par défaut, tu n'as que Feuil1, Feuil2 et Feuil3
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
27
Date d'inscription
samedi 30 novembre 2013
Statut
Membre
Dernière intervention
10 décembre 2013

ben, je n'ai pas de "Feuil0". Dans le classeur "Fact-Synth" il y a "Feuil1", "Feuil2", "Feuil3", "Feuil4" et une dernière, "Recap-An" qui servira plus tard.
En tous cas merci de ton intérêt!!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Ce que je veux savoir n'est pas si tu as une Feuil0 dans ton classeur, mais si la variable lafeuille contient "Feuil0" au moment du plantage !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Tiens ! on va le savoir facilement :
intercale ces deux lignes sous la ligne Workbooks.Open ...
toto = Int((Range("B13").Value + 2) / 3)
If toto = 0 Or toto > 4 Then MsgBox "B13 avec donnée incompatible dans classeur " & classeurs

Lance à nouveau ===>> si quelque-chose s'affiche, recopie-le avec soin et rapporte
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend