Code VBA excel faire une boucle pour chaque feuille
Résoluakb213 Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
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
- Code VBA excel faire une boucle pour chaque feuille
- Code ascii - Guide
- Liste déroulante excel - Guide
- Feuille de pointage excel - Télécharger - Tableur
- Déplacer une colonne excel - Guide
- Word et excel gratuit - Guide
4 réponses
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
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
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.
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
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.
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