Code VBA excel faire une boucle pour chaque feuille

Résolu
akb213 Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   -  
akb213 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



4 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     

    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
  2. akb213 Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
     

    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
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       

      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
      1. akb213 Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         

        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
      2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > akb213 Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
         

        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
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         

        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
      4. akb213 Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         

        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
  3. Tessel75
     

    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
  4. akb213 Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
     

    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