XL 2010 Enregistrer seulement quelques feuilles d'un classeur

stich02

XLDnaute Occasionnel
Bonjour à tous,

Serait-il possible (via une macro à n'en pas douter) d'enregistrer seulement quelques feuilles d'un classeur et de créer ainsi de nouveaux fichiers ayant comme nom le nom des onglets.
J'ai bien cherché sur internet mais sans succès, alors je vous dis comme la princesse Leia (via R2D2) à Obi-Wan Kenobi : " Vous êtes mon seul espoir...".

Je joins un petit fichier afin d'étayer mon propos.

Merci d'avance.

Stich02
 

Pièces jointes

  • test.xlsm
    13.7 KB · Affichages: 30

Hieu

XLDnaute Impliqué
Re : Enregistrer seulement quelques feuilles d'un classeur

Salut,

vois, si ça te convient.
Code vba:



Code vba:
Sub mlk()
chemin = ThisWorkbook.Path & "\"
For Each c In Range("a2:a6")
Sheets(c.Value).Select
Sheets(c.Value).Copy
ActiveWorkbook.SaveAs Filename:=chemin & c.Value, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
ActiveWorkbook.Close
Next c
End Sub






++


 

Pièces jointes

  • test_v0.xlsm
    22.7 KB · Affichages: 33

Papou-net

XLDnaute Barbatruc
Re : Enregistrer seulement quelques feuilles d'un classeur

Bonsoir Stich02,

La macro suivante copie 3 feuilles dans un nouveau classeur et sauvegarde chaque nouveau fichier dans le répertoire actif sous le nom de l'onglet:

Code:
Sub ExempleCopieFeuilles()
For Each ws In Sheets(Array("Feuil1", "Feuil3", "Feuil5"))
  ws.Copy
  ch = ThisWorkbook.Path & "\" & ws.Name & ".xlsx"
  ActiveWorkbook.SaveAs ch
Next
End Su
b
A toi, bien sûr, d'adapter le nom des feuilles concernées dans le tableau Array.

A +

Cordialement.


Oups, pas rafraîchi! Salut Hieu.
 

Pièces jointes

  • Classeur Stitch02.xlsm
    18.1 KB · Affichages: 44

stich02

XLDnaute Occasionnel
Re : Enregistrer seulement quelques feuilles d'un classeur

Bonjour Hieu,

C'est peu dire que ça me convient, c'est au delà de mes espérances. Merci beaucoup.
Sinon une petite question si je veux imposer que les nouveaux fichiers arrivent dans un répertoire bien précis, par exemple : E:\Professionnel\JMDF ou dois-je l'indiquer dans ta macro.

Merci d'avance.
 

stich02

XLDnaute Occasionnel
Re : Enregistrer seulement quelques feuilles d'un classeur

Bonsoir Papou-net,

Grand merci pour ta proposition qui me donne également toute satisfaction. C'est parfait.

C'est même d'ailleurs à peine croyable que les quelques petites lignes de code de vos deux macros (certes écrites de mains de maîtres) peuvent accomplir aussi rapidement un tel travail.

Encore merci et bonne soirée à tous

Merci à Lone Wolf pour la précision
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Enregistrer seulement quelques feuilles d'un classeur

Bonjour à tous,

Une autre version avec trois constantes dont une qui permet de sauvegarder soit l'intégralité de chaque feuille soit uniquement les valeurs et les mise en formes de chaque feuille.
VB:
Sub sauvegarder()

' Noms des feuilles à sauvegarder
Const MesFeuilles = "DR 02,DR 03,DT 08,DT 05,EBR"

' chemin complet de sauvegarde -> ex: "C:\toto"
' si vide alors le dossier de sauvegarde est le dossier de ce fichier
Const MonDossier = ""

' si Tout = True, on copie chaque feuille dans son intégralité
' si Tout = False, on ne copie que les valeurs et les mises en forme
Const Tout = False

Dim TabloMesFeuilles, MonChemin, elem

  Application.DisplayAlerts = False
  Application.ScreenUpdating = False
  TabloMesFeuilles = Split(MesFeuilles, ",")
  If MonDossier = "" Then MonChemin = ThisWorkbook.Path Else MonChemin = MonDossier
  If Right(MonChemin, 1) <> "\" Then MonChemin = MonChemin & "\"
  
  For Each elem In TabloMesFeuilles
    Sheets(elem).Copy
    If Tout = False Then
      ThisWorkbook.Sheets(elem).Cells.Copy
      ActiveWorkbook.ActiveSheet.Cells.PasteSpecial xlPasteFormats
      ActiveWorkbook.ActiveSheet.Cells.PasteSpecial xlPasteValues
    End If
    ActiveWorkbook.SaveAs MonChemin & elem, xlOpenXMLWorkbookMacroEnabled
    ActiveWorkbook.Close
  Next elem

Erreur:
  Application.DisplayAlerts = True
End Sub
 

Pièces jointes

  • stich02- Test- v1.xlsm
    22.9 KB · Affichages: 34
Dernière édition:

stich02

XLDnaute Occasionnel
Re : Enregistrer seulement quelques feuilles d'un classeur

Bonjour à tous,


Merci à mapomme pour cette troisième proposition répondant là encore parfaitement à mes attentes et surtout merci pour les explications du code des options possibles, car vu mon niveau en VBA c'est indispensable...

Sinon comme les feuilles que je sauvegarde contiennent des TCD lorsque je prends l'option "false" (celle qui m'intéresse) je garde bien évidemment les valeurs mais je perds la mise en forme du TCD.
Si des fois il y avait une possibilité pour garder cette mise en forme des TCD je serais bigrement intéressé.

Je joins un petit fichier (avec votre macro appliquée sur la feuille DR 02).

Merci d'avance.
 

Pièces jointes

  • stich02- Test- v1.xlsm
    24.2 KB · Affichages: 36
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Enregistrer seulement quelques feuilles d'un classeur

Bonsoir stich02, Lone-wolf, à tous,


(...) Sinon comme les feuilles que je sauvegarde contiennent des TCD lorsque je prends l'option "false" (celle qui m'intéresse) je garde bien évidemment les valeurs mais je perds la mise en forme du TCD.
Si des fois il y avait une possibilité pour garder cette mise en forme des TCD je serais bigrement intéressé.

Je joins un petit fichier (avec votre macro appliquée sur la feuille DR 02) (...)

C'est un comportement d'Excel que je ne connaissais pas au niveau des copies de TCD. Je n'avais pas ce problème en Excel 2003. Il a dû apparaître avec la version 2007 ou 2010 d'Excel.

J'ai trouvé sur le web un code que j'ai adapté (l'astuce pour copier un TCD en valeur et en format est très "sioux" :rolleyes:) : au lieu de copier le TCD dans son intégralité, on le copie par morceau (d'abord la zone de page puis la zone restante sans sa dernière ligne et on termine par la copie de la dernière ligne).

Concernant cette v2, les trois constantes sont identiques à la version v1. Mais le code se trouve maintenant dans le module nommé mod_EnregistreFeuille.

Par rapport à la v1, rien ne change pour l'utilisateur : on modifie les valeurs des constantes et on clique sur le bouton. Ce qui suit est destiné à ceux qui sont intéressés par le code utilisé pour la copie des TCD.



Pour le code:
La procédure recopiant un TCD en valeur et avec sa mise en forme se trouve dans le module mod_CopieTCD. Cette procédure recopie un TCD (valeur + mise en forme) sur une feuille tierce exactement au même emplacement où se trouve le TCD copié (autrement dit: si le TCD à copier est en cellule F8, le TCD recopié en valeur + mise en forme sera aussi en F8)

Cette procédure a deux arguments : le premier est le TCD à copier, le second la feuille sur laquelle copier le TCD.


VB:
Sub Copie_TCD_ValForm_Vers_Feuil(xTCD, yFeuilCible As Worksheet)

'----------------------------------------------------------------------------------------
' Copie du TCD "xTCD" vers la feuille "yFeuilCible"
' On ne copie que les valeurs et les formats du TCD
' Le TCD copié est au même emplacement que le TCD source "xTCD"
'
' Basé sur le code déniché sur le site: [url=http://www.contextures.com/]Contextures Website - Excel Tips, Excel Tutorials and Excel Examples[/url]
' à la page: [url=http://www.contextures.com/excel-vba-pivot-table-paste-format.html#PasteCode]Excel VBA Pivot Table Paste Format and Values[/url]
'----------------------------------------------------------------------------------------

Dim xrgZonepDePage As Range, xrgZoneData1 As Range, NligZoneData1 As Long

Application.ScreenUpdating = False
'------ recherche de la zone de page du TCD et copie ------
On Error Resume Next    ' si pas de champ page, on passe...
Set xrgZonepDePage = xTCD.PageRange
If Err = 0 Then
  ' si pas d'erreur -> on copie la zone de page du TCD
  Err.Clear: On Error GoTo FIN_ERREUR
  ' on copie la zone de page du TCD
  xrgZonepDePage.Copy yFeuilCible.Range(xrgZonepDePage.Address)
Else
  On Error GoTo FIN_ERREUR
End If

'------ copie du TCD sans la zone de page ------
Set xrgZoneData1 = xTCD.TableRange1     'la zone
NligZoneData1 = xrgZoneData1.Rows.Count ' le nombre de ligne de cette zone

'copie de la zone sans la dernière ligne
xrgZoneData1.Resize(NligZoneData1 - 1).Copy yFeuilCible.Range(xrgZoneData1.Address)

'copie de la zone (uniquement la dernière ligne)
xrgZoneData1.Resize(1).Offset(NligZoneData1 - 1).Copy _
    yFeuilCible.Range(xrgZoneData1.Resize(1).Offset(NligZoneData1 - 1).Address)

'copie des largeurs de colonnes
xrgZoneData1.EntireColumn.Copy
yFeuilCible.Range(xrgZoneData1.Address).EntireColumn.PasteSpecial xlPasteColumnWidths
Application.CutCopyMode = False
Exit Sub

FIN_ERREUR:
  MsgBox "Erreur n° " & Err.Number & " : " & Err.Description, vbCritical
  MsgBox "Echec de la copie du TCD : " & xTCD.Name, vbCritical
End Sub
 

Pièces jointes

  • stich02- Test- v2.xlsm
    38.3 KB · Affichages: 45
Dernière édition:

stich02

XLDnaute Occasionnel
Re : Enregistrer seulement quelques feuilles d'un classeur

Bonjour à tous,

mapomme, je viens d'intégrer vos macros dans le fichier définitif et ça marche du feu de Dieu.

Décidemment, et je m'en rends compte une fois de plus, dans Excel, sans la maîtrise du VBA, point de salut…

Aussi merci à vous, à Hieu, à Paou-net, à Lone Wolf qui m'ont apporté leur concours sur ce projet et plus généralement merci à tous ceux qui sur le forum aident ceux qui, comme moi, verront toujours le VBA comme un langage cabalistique...

A bientôt…

Stich02
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal