Copier un onglet d'un fichier dans un autre avec un nom différent

Bonjour

Je n’arrive pas à copier un onglet d’un fichier dans un autre avec un nom différent en le remplaçant s’il existe déjà dans le deuxième fichier.

Je m’explique. Dans le fichier « test1 » je voudrais que l’onglet « Données » soit copié dans le fichier « test2 » en prenant le nom « Importation ». Si l’onglet « Importation » existe déjà dans le fichier « test2 » il faut qu’il soit remplacé par le nouvel onglet.

Quelqu'un peut me donner une solution ? Merci.

4test1.xlsx (11.62 Ko)
3test2.xlsx (12.56 Ko)

Bonjour Philippe, bonjour le forum,

J'ai placé le code dans le fichier destination qui, par conséquent, change d’extension et devient .xlsm. Ouvre ce fichier et lance la macro Macro1. Si les deux fichiers se trouvent dans le même dossier inutile d'ouvrir le fichier test1.xlsx, le code s'en charge...

Le code :

Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CD = ThisWorkbook 'définit le classeur destination CD
CA = CD.Path & "\" 'définit le chemin d'accès CA
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set OD = CD.Worksheets("Importation") '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
Else 'sinon (pas d'erreur générée donc l'onglet OD "Impolrtation" existe)
    Application.DisplayAlerts = False 'masque les messages d'Excel
    OD.Delete 'supprime l'onglet OD
    Application.DisplayAlerts = True 'affiche les messages d'Excel
End If 'fin de la condition
Set CS = Worksheets("test1.xlsx") 'définit le classeur source CS (génère une erreur si le classeur n'est pas ouvert)
If Err <> 0 Then 'condition : si une erreur a été générée
    Err.Clear 'supprime l'erreur
    Set CS = Workbooks.Open(CA & "test1.xlsx") 'définit le classeur source CS en l'ouvrant
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
'copie l'onglet "Données" du classeur source et le colle en première position dans le claseur destination
CS.Worksheets("Données").Copy before:=CD.Sheets(1)
ActiveSheet.Name = "Importation" 'renome l'onglet actif
CS.Close False 'ferme le classeur source sans enregistrer
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub

Le fichier :

10test2.xlsm (17.57 Ko)

Merci pour ta réponse rapide.

Il y a un bug à 3e ligne en partant du bas "CS.Worksheets("Données").Copy before:=CD.Sheets(1)".

Le msg box dit "erreur d'exécution 91. Variable objet ou variable de bloc With non définie".

Cordialement.

Re,

Oui pardon, essaie avec :

CS.Worksheets("Données").Copy before:=CD.Sheets(Sheets(1))

[Édition]

Heu non ! C'est bizarre chez moi la première version fonctionne et la modif que je te donne plante. Du coup je suis perdu là...

Re,

Je confirme, la première version proposée est la bonne chez moi...

Oui finalement la macro marche bien. J'avais juste mal adapté cette dernière dans mon fichier de travail. Merci.

Juste une question, j'ai réalisé que de copier l'onglet me copier également toutes les macro associées à ce derniers ainsi que les noms et MFC qu'il comporte et il y en a pas mal . Du coup je me pose la question est-ce qu'on peut adapter la macro pour qu'elle copie et colle uniquement les valeurs (Selection.PasteSpecial Paste:=xlPasteValues) de cet onglet. En clair au-lieu de copier un onglet il faudrait coller toutes les valeurs de cet onglet.

Quoi qu'il en soit je mets le sujet en résolu car la macro donne bien le travail demandé en objet. Merci encore et si tu ne peux pas adapter cette dernière à ma dernière question je ferais à l'ancienne à savoir ouvrir le fichier 1 faire un CTRL A puis ouvrir le fichier 2 supprimer tous les enregistrements de l'onglet "importation" pour faire en suite en A1 un coller les valeurs (Selection.PasteSpecial Paste:=xlPasteValues). C'est plus long mais sa donne le résultat attendu.

Merci encore pour ta macro.

Re,

Le code modifié et adapté :

Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CD = ThisWorkbook 'définit le classeur destination CD
CA = CD.Path & "\" 'définit le chemin d'accès CA
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set OD = CD.Worksheets("Importation") '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
    CD.Worksheets(1).Name = "Importation" 'renomme le premier onglet du classeur Destination
    Set OD = CD.Worksheets(1) 'définit l'onglet destination OD
End If
OD.Cells.Clear 'vide le contenu de l'onglet OD
Set CS = Worksheets("test1.xlsx") 'définit le classeur source CS (génère une erreur si le classeur n'est pas ouvert)
If Err <> 0 Then 'condition : si une erreur a été générée
    Err.Clear 'supprime l'erreur
    Set CS = Workbooks.Open(CA & "test1.xlsx") 'définit le classeur source CS en l'ouvrant
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
CS.Worksheets("Données").UsedRange.Copy 'copie les données de l'onglet source
OD.Range("A1").PasteSpecial (xlPasteValuesAndNumberFormats) 'colle les valeurs dans la cellule A1 de l'onglet destination
OD.Range("A1").PasteSpecial (xlPasteColumnWidths) 'colle la largeur des colonnes
OD.Range("A1").PasteSpecial (xlPasteFormats) 'colle les formats
Application.DisplayAlerts = False 'masque les messages d'Excel
CS.Close False 'ferme le classeur source sans enregistrer
Application.DisplayAlerts = True 'affiche les messages d'Excel
End Sub

Super, merci pour l'adaptation.

Rechercher des sujets similaires à "copier onglet fichier nom different"