Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Séparer un classeur en plusieurs classeurs

caloumaya

XLDnaute Nouveau
Bonjour tout le monde

J'ai récupéré ici quelques lignes de code pour arriver à mes fins : un classeur plein de feuilles que je veux diviser en autant de classeurs qu'il y a de feuilles


VB:
Sub Bouton1_Cliquer()
CoupeFichier "Préparation budgétaire CAGV 2023.xlsm", "X:\Groupe DRH\GROUPE DRH MUTUALISEE\BUDGETS\CAGV\2023"
End Sub

Sub CoupeFichier(NomFiche As String, Chemin As String)
'Sauvegarde chaque onglets dans un fichier du même nom que l'onglet

Dim Onglet As Worksheet
  'Parcours l'ensemble des onglets du classeur NomFiche
  For Each Onglet In Workbooks(NomFiche).Worksheets
    Workbooks(NomFiche).Worksheets(Onglet.Name).Copy
    'Supprime les messages : Fichier déjà existant
    Application.DisplayAlerts = False
      ActiveWorkbook.SaveAs Filename:=Chemin & Onglet.Name & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
     Application.DisplayAlerts = True
    ActiveWorkbook.Close False
  Next
End Sub

Le code marche parfaitement mais les classeurs ne s'enregistre pas au bon endroit

X:\Groupe DRH\GROUPE DRH MUTUALISEE\BUDGETS\CAGV au lieu de X:\Groupe DRH\GROUPE DRH MUTUALISEE\BUDGETS\CAGV\2023

De plus le nom des fichiers créés commence par 2023 au lieu de porter le nom de l'onglet.
Bref je sèche.

Il m'est difficile de joindre un fichier (je manipule des données RH)

Merci
 
Solution
Re,

Et je suppose qu'il n'y aura pas que l'année 2023 ?

S'il n'y a que 2023 le simple ajout d"un antislash avant le nom de fichier devrait être suffisant :
Chemin & "\" & Onglet.Name & ".xlsx"
Sans vérification des caractères autorisés dans un chemin et nom de fichier, ni même de l'existence du dossier.


La macro ci-dessous a été testée avec pour chemin : ThisWorkBook.Path & "\2023"

Le dossier doit être préalablement existant

le slash est ajouté à la sauvegarde du fichier mais pourrait être ajouté au chemin lui-même.
Du moment où il est présent, tout va bien

Code:
Sub CoupeFichier(Classeur As Workbook, Chemin As String)
'Sauvegarde chaque onglets dans un fichier du même nom que l'onglet
    Dim Onglets As Sheets   '...

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Vous avez tout dans votre macro pour vous permettre de l'adapter pour peu que vous fassiez l'effort de la comprendre.

Il m'est difficile de joindre un fichier (je manipule des données RH)

Beaucoup ici manipule des données RH et pourtant cela ne les empêchent pas de faire des fichiers exemples, anonymisés et sans données confidentielles.

Bonne suite
 

caloumaya

XLDnaute Nouveau
Bonjour Hasco

J'ai décortiqué la macro (en général je n'utilise une macro que quand je la comprends) mais je n'arrive pas à m'expliquer pourquoi il ajoute 2023 devant le nom de l'onglet ni pourquoi il ne place pas les nouveaux classeur dans le dossier 2023.

cordialement
 

Pièces jointes

  • Préparation budgétaire CAGV 2023 2.xlsm
    219.2 KB · Affichages: 2

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Et je suppose qu'il n'y aura pas que l'année 2023 ?

S'il n'y a que 2023 le simple ajout d"un antislash avant le nom de fichier devrait être suffisant :
Chemin & "\" & Onglet.Name & ".xlsx"
Sans vérification des caractères autorisés dans un chemin et nom de fichier, ni même de l'existence du dossier.


La macro ci-dessous a été testée avec pour chemin : ThisWorkBook.Path & "\2023"

Le dossier doit être préalablement existant

le slash est ajouté à la sauvegarde du fichier mais pourrait être ajouté au chemin lui-même.
Du moment où il est présent, tout va bien

Code:
Sub CoupeFichier(Classeur As Workbook, Chemin As String)
'Sauvegarde chaque onglets dans un fichier du même nom que l'onglet
    Dim Onglets As Sheets   ' Collection des onglets
    Dim Onglet As Worksheet ' un onglet dans la collection
    '
    ' initialiser les onglets pour que vba n'est pas à la réinitialiser
    ' à chaque tour de boucle (gain de rapidité et mémoire)
    '
    Set Onglets = Classeur.Worksheets
'    '
'    'Parcours l'ensemble des onglets du classeur NomFiche
    For Each Onglet In Onglets
        Onglet.Copy
        'Supprime les messages : Fichier déjà existant
        Application.DisplayAlerts = False
        ActiveWorkbook.SaveAs Filename:=Chemin & "\" & Onglet.Name & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        Application.DisplayAlerts = True
        ActiveWorkbook.Close False
    Next
End Sub


Je doute que vous compreniez votre macro, sinon vous auriez vu qu'il manquait un slash dans le nom du répertoire et que si le répertoire n'existe pas l'enregistrement est voué à l'échec.

Cordialement
 

Pièces jointes

  • Préparation budgétaire CAGV 2023 2.xlsm
    230.4 KB · Affichages: 4

Deadpool_CC

XLDnaute Accro
Bonjour,

Je ne pense pas qu'il y avait un coté donneur de leçon mais il est vrai qu'avec 10 secondes de réflexion vu les noms de fichier avec 2023 devant au lieu d'être dans le dossier 2023 ... vous auriez du voir de suite qu'il manquait un "\" lors de la concaténation qui sert à créer votre nom de fichier ...

C'est juste que parfois les gens par simplicité font appel à des forums car ils n'ont pas cherché par eux même ou qu'ils n'ont pas essayé par eux même. Certains arrivent même sans avoir rien fait en disant il me faut un fichier pour faire cela ... sans fournir même le début d'un fichier avec leur données ...

Après tu en pense ce que tu veux mais on est tous là bénévolement et aider sur des problèmes qui n'en sont pas n'est pas forcement l'objectif de tous

Bonne fin de journée tout de même
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
si le côté donneur de leçons me laisse un peu perplexe.
Vous dites que vous n'utilisez que des macros que vous comprenez, je vous montre que non.

Je pensais être sur un forum d'entraide.....
Une autre leçon serait de dire que l'entraide commence par s'aider soi-même.

Pour le slash, une autre façon de faire et de tester son existence en entrée de macro

If Right(Chemin,1) <> Application.PathSeparator Then Chemin = Chemin & Application.PathSeparator
Plus besoin de l'ajouter dans la boucle de sauvegarde

cordialement

P.S. je suis très grognon, mais ne suis pas méchant et plus le forum ressemble à une société de service et plus je suis grognon.

Tiens, je vais mettre ça en signature.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…