Copier plusieurs onglets vers un autre classeur
Bonjour
Tous les mois je reçois un classeur qui doit alimenter un fichier de travail.
Ces deux classeurs comportent 20 onglets. Les données doivent être rapatriées à la suite des données du mois précédent.
Pour éviter d'écrire 20 fois la même action, je cherche à faire une boucle : copier les données de l'onglet "Bordeaux" (classeur source) vers l'onglet "Bordeaux" du classeur destination. Idem pour Clermont, Dijon, .....
Voici ce que j'ai écris (je m'excuse par avance d'agresser vos yeux) :
Sub Importation_tous_ctxt()
Application.ScreenUpdating = False
Workbooks.Open Filename:= _
"N:\DNMAC\Pole Pilotage\Pilotage controle\25_Analyse PCC\Stats\Requêtes\1_Caisses\2019\Nouveau format\STATS_QUALITE_PCC_ATT DP_MENSUEL_Caisses.xlsx" _
, Notify:=False
Sheets("Bordeaux").Select
Range("C6:L6").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows("test_toutes_caisses.xlsm").Activate
Sheets("Bordeaux").Select
Range("A65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Windows("STATS_QUALITE_PCC_ATT DP_MENSUEL_Caisses.xlsx").Activate
Sheets("Clermont").Select
Range("C6:L6").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows("test_toutes_caisses.xlsm").Activate
Sheets("Clermont").Select
Range("A65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
'....... ainsi de suite pour les 20 villes
Windows("STATS_QUALITE_PCC_ATT DP_MENSUEL_Caisses.xlsx").Activate
ActiveWindow.Close
Application.ScreenUpdating = True
End Sub
Je vous remercie pour votre aide, car j'en ai grandement besoin.
Bonjour Adlsn, bonjour le forum,
Peut-être comme ça :
Sub Importation_tous_ctxt_2()
Dim CS As Workbook
Dim CD As Workbook
Dim OS As Worksheet
Dim OD As Worksheet
Dim PL As Range
Application.ScreenUpdating = False
Set CD = ThisWorkbook
Workbooks.Open Filename:= _
"N:\DNMAC\Pole Pilotage\Pilotage controle\25_Analyse PCC\Stats\Requêtes\1_Caisses\2019\Nouveau format\STATS_QUALITE_PCC_ATT DP_MENSUEL_Caisses.xlsx" _
, Notify:=False
Set CS = ActiveWorkbook
For Each OS In CS.Worksheets
Set OD = CD.Worksheets(OS.Name)
OS.Range(OS.Range("C6:L6"), OS.Range("C6:L6").End(xlDown)).Copy OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0)
Next OS
CS.Close False
Application.ScreenUpdating = True
End SubBonjour ThauTheme,
Merci pour cette réponse rapide.
Il y un blocage au niveau de la ligne : Set OD = CD.Worksheets(OS.name)
Dois-je définir le "name" quelque part ?
Il faut peut être préciser le nom des onglets.
Merci
A.
Re,
En fait le code dit :
For Each OS In CS.Worksheets 'boucle sur tous les onglets OS du classeur source
Set OD = CD.Worksheets(OS.Name) 'définit l'onglet destination (onglet portant le même nom dans le classeur destination)Si ça plante là, cela signifie que le nom des onglets n'est pas strictement identique dans les deux classeurs...
D'accord
En effet j'ai des onglets non utiles à la fin. Ils ne se retrouvent pas dans le classeur de destination.
C'est parfait, tout fonctionne !!
Je peux poursuivre le développement.
Un grand merci,
Bonne fin de journée
Re,
Un code avec gestion des erreurs :
Sub Importation_tous_ctxt_2()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim PL As Range
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CD = ThisWorkbook 'définit le classeur destination CD
'ouvre le fichier
Workbooks.Open Filename:= _
"N:\DNMAC\Pole Pilotage\Pilotage controle\25_Analyse PCC\Stats\Requêtes\1_Caisses\2019\Nouveau format\STATS_QUALITE_PCC_ATT DP_MENSUEL_Caisses.xlsx" _
, Notify:=False
Set CS = ActiveWorkbook 'définit le classeur source CS
For Each OS In CS.Worksheets 'boucle sur tous les onglet OS du classeur source CS
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set OD = CD.Worksheets(OS.Name) 'définit l'onglet destination OD (génère une erreur si cet onglet n'existe pas)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'supprime l'erreur
GoTo suite 'va à l'étiquette suite
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
'copier/coller
OS.Range(OS.Range("C6:L6"), OS.Range("C6:L6").End(xlDown)).Copy OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0)
suite: 'étiquette
On Error GoTo 0 'annule la gestion des erreurs
Next OS 'prochain onglet de la boucle
CS.Close False 'ferme le classeur source sans enregistrer
Application.ScreenUpdating = True 'afficheles rafraîchissements d'écran
End Sub