Copie valeurs mise en forme feuille vers classeur spécifique

Bonjour le Forum,

J'aurais besoin de votre aide et mes notions de VBA ne sont pas suffisantes pour réaliser ce que je souhaite.

Voici mon problème :

J'ai un classeur nommé "fichier de préparation du budget" dans lequel se trouve une feuille nommée "Budget".

Cette feuille contient des valeurs issues de calcul venant d'autres feuilles et dispose d'une certaines mise en forme.

Je souhaiterais pouvoir copier les valeurs et la mise en forme dans un classeur dont le nom de fichier est contenu dans la feuille "Budget" en C9 et le chemin d'accès en L12.

La nouvelle feuille doit être renommé dans le nouveau classeur par un nom qui sera tapé dans une "input box".

Je dois répéter l'opération 30 fois et donc générer dans le nouveau classeur 30 nouvelles feuilles qui s’inséreront les unes à la suite des autres. Une fois l'opération terminée j'aimerais retourner sur le classeur "fichier de préparation du budget".

Je suis bien conscient que ma demande est un peu longue mais pourriez vous m'aider ?

En vous remerciant,

JBB

Bonjour,

Le plus simple en pareil cas est d'exporter la feuille ! Rien que tes connaissances en VBA ne puisse t'empêcher de réaliser...

1) Tu fais une copie de la feuille dans le classeur : syntaxe : Worksheets("xxx").Copy destination

La destination : tu la places en première position : before:= Worksheets(1) [préférable] ou en dernière : after:=Worksheets(Worksheets.Count) [c'est plus long et pour une position temporaire...]

La copie devient automatiquement la feuille active, tu la renommes : ActiveSheet.Name = "yyy"

La méthode que tu prévois : nom fourni par InputBox peut se dérouler à n'importe quel moment ; si il est opportun de la nommer à ce moment récupérer le nom dans une variable avant de copier.

Si tu dois réaliser d'autres opérations qui mettront une autre feuille en feuille active. Celle-ci reste accessible par Worksheets(1) si tu l'as placée en tête...

2) Il faut éliminer les formules, la méthode la plus simple est alors de recopier le contenu concerné sur lui-même : une ligne de code pour copier la plage concernée, une pour coller les valeurs au même endroit. exemple :

With Worksheets(1)

End With

Si la feuille a des macros évènementielles associées ou des plages nommées, ceci sera exporté avec la feuille. Si cela doit être supprimé (macro) il faudra peut-être te faire aider. Pour les plages nommées, il faudra les supprimer dans le nouveau classeur (car elles vont créer une liaison non voulue sinon). Tu fais un essai manuel pour voir s'il y a un problème de cet ordre à régler.

3) L'export, même chose que la copie : Worksheets(1).Move Workbooks("zzz").position

Préalablement, tu auras récupéré le chemin et le nom du classeur dans une variable (ou 2 selon utilisation) pour l'ouvrir s'il n'est pas ouvert, ou l'appeler. Tu peux utilement utiliser With Workbooks("zzz") pour ne pas avoir à répéter le nom du classeur dans la position à donner à la feuille.

Même chose que pour la copie, le classeur destinataire devient le classeur actif et la feuille déplacée la feuille active.

Avec ça tu devrais parvenir à circonscrire l'opération. Les noms que j'ai placé entre guillemets (cas où tu indiques les noms dans ton code) tu remplaces par des variable si tu as affecté les noms à des variables.

Cordialement

Ferrand

Bonjour,

Le plus simple en pareil cas est d'exporter la feuille ! Rien que tes connaissances en VBA ne puisse t'empêcher de réaliser...

1) Tu fais une copie de la feuille dans le classeur : syntaxe : Worksheets("xxx").Copy destination

La destination : tu la places en première position : before:= Worksheets(1) [préférable] ou en dernière : after:=Worksheets(Worksheets.Count) [c'est plus long et pour une position temporaire...]

La copie devient automatiquement la feuille active, tu la renommes : ActiveSheet.Name = "yyy"

La méthode que tu prévois : nom fourni par InputBox peut se dérouler à n'importe quel moment ; si il est opportun de la nommer à ce moment récupérer le nom dans une variable avant de copier.

Si tu dois réaliser d'autres opérations qui mettront une autre feuille en feuille active. Celle-ci reste accessible par Worksheets(1) si tu l'as placée en tête...

2) Il faut éliminer les formules, la méthode la plus simple est alors de recopier le contenu concerné sur lui-même : une ligne de code pour copier la plage concernée, une pour coller les valeurs au même endroit. exemple :

With Worksheets(1)

End With

Si la feuille a des macros évènementielles associées ou des plages nommées, ceci sera exporté avec la feuille. Si cela doit être supprimé (macro) il faudra peut-être te faire aider. Pour les plages nommées, il faudra les supprimer dans le nouveau classeur (car elles vont créer une liaison non voulue sinon). Tu fais un essai manuel pour voir s'il y a un problème de cet ordre à régler.

3) L'export, même chose que la copie : Worksheets(1).Move Workbooks("zzz").position

Préalablement, tu auras récupéré le chemin et le nom du classeur dans une variable (ou 2 selon utilisation) pour l'ouvrir s'il n'est pas ouvert, ou l'appeler. Tu peux utilement utiliser With Workbooks("zzz") pour ne pas avoir à répéter le nom du classeur dans la position à donner à la feuille.

Même chose que pour la copie, le classeur destinataire devient le classeur actif et la feuille déplacée la feuille active.

Avec ça tu devrais parvenir à circonscrire l'opération. Les noms que j'ai placé entre guillemets (cas où tu indiques les noms dans ton code) tu remplaces par des variable si tu as affecté les noms à des variables.

Cordialement

Ferrand

Bonjour

Merci beaucoup pour toutes ces explications. J'essaie cela dès que possible.

Bien cordialement

Jbb

Encore merci pour ton aide. J'ai quasiment réussi mon opération. J'ai juste une problème au niveau du positionnement de la feuille dans le nouveau classeur.

Je vais ouvrir un autre poste à ce sujet.

Pour info voici mon programme :

Sub V2export_feuil_renom()
'définition du classeur  maitre:
Classeur_maitre = ActiveWorkbook.Name
'input box nom d'onglet
Dim Nom As String
Nom = InputBox("Saisie Nom nouvel onglet: ", "Onglet")

Sheets.Add After:=Worksheets("Budget")
ActiveSheet.Name = Nom

Sheets("Budget").Select
    Range("A1:X600").Select
    Selection.Copy

    Sheets(Nom).Select
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues
    Selection.PasteSpecial Paste:=xlPasteFormats
    Selection.PasteSpecial Paste:=xlPasteColumnWidths

Sheets(Nom).Activate
Range("A1").Select

'sélectionner le classeur de destination
'affichage message
MsgBox "Sélectionner le classeur de destination"

Dim QuelFichier
  QuelFichier = Application.GetOpenFilename()

'Ouvrir le classeur de destination
Workbooks.Open QuelFichier

'définition du classeur cible

 Classeur_cible = ActiveWorkbook.Name
' Nombre de feuille dans classeur cible

   Dim nbfeuille As Integer
   'Attribution d'une valeur à la variable
   nbfeuille = ThisWorkbook.Sheets.Count

'retourner sur le classeur maitre

Workbooks(Classeur_maitre).Activate
'copier la feuille Nom vers le classeur de destination
Sheets(Nom).Select

Sheets(Nom).Copy After:=Workbooks(Classeur_cible).Sheets(2)

End Sub

Attention :

nbfeuille = ThisWorkbook.Sheets.Count

Tu affectes le nombre de feuilles du classeur qui contient la macro, pas du classeur cible.

A moins que le classeur qui contient la macro ne soit le classeur cible ?

MFerrand a écrit :

Attention :

nbfeuille = ThisWorkbook.Sheets.Count

Tu affectes le nombre de feuilles du classeur qui contient la macro, pas du classeur cible.

A moins que le classeur qui contient la macro ne soit le classeur cible ?

Re bonsoir,

C'est sans doute pour cela que la manip que j'avais écrite pour copier la feuille du classeur maitre en dernier dans le classeur cible ne fonctionne pas.

Sheets(Nom).Copy After:=Workbooks(Classeur_cible).Sheets(nbfeuille)

Comment faire alors pour affecter au classeur cible ? C'est bien le classeur maitre qui contient la macro.

Avec mes remerciements

JBB

Tu utilises Workbooks(Classeur_maître) à la place de ThisWorkbook.

Pour éviter les confusions, il est préférable d'utiliser systématiquement ThisWorkbook pour le classeur qui contient la macro.

MFerrand a écrit :

Tu utilises Workbooks(Classeur_maître) à la place de ThisWorkbook.

Pour éviter les confusions, il est préférable d'utiliser systématiquement ThisWorkbook pour le classeur qui contient la macro.

Merci beaucoup. Cela marche. Par contre j'ai utilisé Workbooks(Classeur_cible) car c'est dans ce classeur que je copie ma feuille.

JBB

Rechercher des sujets similaires à "copie valeurs mise forme feuille classeur specifique"