Code VBA excel faire une boucle pour chaque feuille

Résolu/Fermé
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023 - 20 nov. 2022 à 23:33
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023 - 23 nov. 2022 à 21:51

Salut à tous,

je débute en code VBA je voulais faire une macro pour copier des données de fichiers excel et les regrouper dans un fichier. Je construis la macro étape par étape.

Pour le moment je bloque sur le fait d'appliquer la boucle (for (if end if ) next) pour chaque feuille du classeur source.

J'ai essayé avec une boucle dans la boucle en remplaçant le numéro de feuille par une lettre (wb1.worksheets(a) pour une boucle for a = 1 to 12), mais ça ne fonctionne pas.  J'ai tenté avec For each Ws in Worksheet mais j'ai l'impression que quelque chose m'échappe, je ne sais pas comme faire les itérations dans chaque feuille.

Merci de votre aide si vous avez des idées

Bonne soirée
 

Sub CopyData()
'WB1 source
'WB2 destination

Dim WB1 As Workbook
Dim WB2 As Workbook

 'Dont update the screen - makes it work faster
Application.ScreenUpdating = False

'Open the other workbook
'Input the FULL path to the file, including its extension

Set WB2 = ActiveWorkbook
Set WB1 = Workbooks.Open("C:\Users\user\Documents\Dossier Source.xlsx")
'derniere ligne
Dim LastRow As Long
Dim LastRow2 As Long

LastRow = WB1.Worksheet(1).Cells(Rows.Count, 2).End(xlUp).Row
LastRow2 = WB2.Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Row
For i = 6 To LastRow
If WB1.Worksheet(1).Cells(i, 2).Value = "ASQ1" Then
WB1.Worksheet(1).Cells(i, 3).Copy _
WB2.Worksheet(1).Celles(LastRow2 + 1, 5)


Application.CutCopyMode = False

End If
Next



'Close the workbook from which we just got some data and make sure not to save it in case accidental changes were made to it.

WB1.Close SaveChanges:=False

'Turn on screen updating again - makes Excel usable
Application.ScreenUpdating = True

End Sub



A voir également:

4 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
21 nov. 2022 à 00:10

Bonjour

Dans le code que tu nous montres, je ne vois aucune boucle sur les feuilles... Impossible donc de te dire où tu as fait une erreur


0
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023
21 nov. 2022 à 00:22

Ah j'ai pas mis le code car il fonctionne pas le voilà , merci :)

Sub CopyData()
'WB1 source
'WB2 destination

Dim WB1 As Workbook
Dim WB2 As Workbook

 'Dont update the screen - makes it work faster
Application.ScreenUpdating = False

'Open the other workbook
'Input the FULL path to the file, including its extension

Set WB2 = ActiveWorkbook
Set WB1 = Workbooks.Open("C:\Users\user\Documents\Dossier Source.xlsx")
'derniere ligne
Dim LastRow As Long
Dim LastRow2 As Long

LastRow = WB1.Worksheet(1).Cells(Rows.Count, 2).End(xlUp).Row
LastRow2 = WB2.Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Row
For a = 1 to 11
'a le numéro de la feuille du classeur 
For i = 6 To LastRow
If WB1.Worksheet(a).Cells(i, 2).Value = "ASQ1" Then
WB1.Worksheet(a).Cells(i, 3).Copy _
WB2.Worksheet(a).Celles(LastRow2 + 1, 5)


Application.CutCopyMode = False

End If
Next
Next



'Close the workbook from which we just got some data and make sure not to save it in case accidental changes were made to it.

WB1.Close SaveChanges:=False

'Turn on screen updating again - makes Excel usable
Application.ScreenUpdating = True

End Sub
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
21 nov. 2022 à 06:24

Tu veux copier les données dans une seule feuille où tu veux que le classeur de destination est autant de feuilles que le classeur d'origine (ce que tu sembles vouloir faire avec le code que tu nous montres)

0
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
21 nov. 2022 à 20:00

Le but est de copier pour chaque feuille du classeur source des données dans une feuille du classeur destination
feuille (1) dans feuille (1) etc.

 

0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023
21 nov. 2022 à 20:36

Donc, la feuille à utiliser pour le WB2 doit être fixe ... 

WB2.Worksheet(1)

Tu dois également recalculer le numéro de la dernière ligne DANS la boucle

For a = 1 to 11

LastRow = WB1.Worksheet(a).Cells(Rows.Count, 2).End(xlUp).Row
LastRow2 = WB2.Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Row
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
21 nov. 2022 à 21:34

préférable, probablement:

LastRow = WB1.Worksheet(a).Cells(WB1.Worksheet(a).Rows.Count, 2).End(xlUp).Row
LastRow2 = WB2.Worksheets(1).Cells(WB2.Worksheets(1).Rows.Count, 5).End(xlUp).Row

Si on ne précise pas de quelle feuille il s'agit, Rows.Count travaille sur la feuille active.  Qui est rarement celle imaginée par le programmeur.

0
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
22 nov. 2022 à 10:53

Bonjour
Merci pour la réponse, c'est vrai faut mettre les lastrow dans la boucle pour updater sinon ça fait qu'écraser MERCI!

Par contre je souhaite que la feuille (1) source soit copiée dans feuille (1) destination et feuille (2) source soit copiée dans feuille (2) destination et feuille (3) source soit copiée dans feuille (3) destination ainsi de suite. 
Je crois que si je fixe 

WB2.Worksheet(1) ça me copiera tout dedans non ?

Merci encore
0

De toutes les faons, quand on teste un code, et à moins d'être assez sûr de soi, la première chose à  faire est de le faire tourner "en pas à pas". Ainsi tu peux vérifier que ce que tu demandes est bien fait et correspond à ce que tu attends; alors tu peux voir à quelle ligne ça coince et où ton écriture est incorrecte.

Après, si tu ne parviens pas à trouver la réponse à la ligne fautive, alors on peut te répondre et chercher comment en sortir.

Bon courage.

0
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023
23 nov. 2022 à 21:51

Bonjour,
j'ai crée un nouveau fichier  j'ai retapé le code en étant concentré, ça fonctionne la boucle dans la boucle. 
Merci pour votre aide

For a = 1 To 10

For i = 14 To LastRow

LastRowDist = WB2.Worksheets(a).Cells(Rows.Count, 3).End(xlUp).Row
If WB1.Worksheets(a).Cells(i, 3).Value = "CQ-300" Then

WB1.Worksheets(a).Cells(i, 11).Copy _
WB2.Worksheets(a).Cells(LastRowDist + 1, 3)

Application.CutCopyMode = False

End If
Next

Next
0