Créer nouveau fichier excel par vba Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 15 avril 2019, 08:48

Bonjour,

Je voulais savoir si il était possible de "séparer" des feuilles d'un fichier excel, pour créer un autre fichier excel contenant ces feuilles.
Capture.PNG
Voici le contenu d'une feuille, et j'aimerais que toute les feuilles en bleu en bas soit dans un fichier séparé. Je veut un fichier avec toute les feuilles et pas un fichier par feuille.

J'ai cherché sur les forum et je n'ai pas trouver quelque chose qui ressemble a ma question.

Ce tableau est obtenue par vba, mais il n'y a plus de traitement par vba après, que des traitement main. Le but est de pouvoir stocker ces tableaux, avec comme nom de fichier ""PLANNING " + date_du_jour" dans un dossier prévu a cet effet.

Je vous remercie par avance du temps que vous m'accorderez.
b
boss_68
Membre fidèle
Membre fidèle
Messages : 238
Appréciations reçues : 19
Inscrit le : 17 décembre 2018
Version d'Excel : 2003

Message par boss_68 » 15 avril 2019, 09:57

Bonjour,

Un truc tout simple, tu fais une copie de ton fichier que tu renommes, et tu supprimes tous les onglets inutiles pour toi, et tu gardes que les onglets en bleu et le tour est joué
En tous les cas c'est de cette façon que je procéderais, à moins que je n'ai rien pigé à ta demande

Slts
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 15 avril 2019, 10:51

Sur le principe c'est cela, mais j'aimerais pouvoir le faire par une macro.

Du genre un clic sur bouton et hop on obtient un fichier jumeau. Sur l'original on supprime les bleu et sur le nouveau on supprime tout sauf les bleu.

Sauf que j'ai commencer en vba il n'y a pas longtemps et que je ne sait pas comment faire. :mrgreen:
G
GNIN
Membre habitué
Membre habitué
Messages : 74
Appréciations reçues : 6
Inscrit le : 6 février 2019
Version d'Excel : 2003
Version de Calc : 4.3

Message par GNIN » 15 avril 2019, 16:58

Bonjour,

Effectivement comme l'écrit boss_68, le mieux est de dupliquer le fichier d'origine et ensuite de supprimer les onglets inutiles.

Pour le faire par macro, je te communique un exemple avec deux variables objet (Source et Dest) qui pointent respectivement sur le fichier courant et le fichier dupliqué. Dans l'exemple j'ai nommé le fichier dupliqué "ZZZ.XLS" qui est crée dans le même dossier que le fichier Source. Avant duplication, la procédure vérifie que le fichier ZZZ.XLS existe (fonction FichierExiste, fournie ci-dessous ) et si oui, il le supprime (Fonction Kill, là c'est du VBA).

A adapter à ta situation avec suppression par le nom. Il peut être intéressant d'avoir des règles de nommages des onglets pour effectuer les suppressions en boucle (Pratique s'il faut supprimer 50 onglets ou plus :) ). Dans mon exemple, j'ai nommé mes onglets "COMPTA1" à "COMPTA3".
Sub DupliqueFichier()
    Dim Source As Workbook
    Dim Dest As Workbook
    Set Source = ActiveWorkbook
    
    'Supprime fichier pour duplication si EXISTE
    
    If ExisteFichier(Source.Path & "\ZZZ.XLS") Then
        Kill Source.Path & "\ZZZ.XLS"
    End If
    
    'Enregistre le fichier à dupliquer sous...
    Source.SaveCopyAs Source.Path & "\ZZZ.XLS"
    
    'Ouvre le fichier qui vient d'être dupliqué
    Set Dest = Workbooks.Open(Source.Path & "\ZZZ.XLS")
    
    'Désactive les messages d'alerte avant suppression
    'd'un onglet
    Application.DisplayAlerts = False
    
    'Suppression d'un onglet sur le fichier dupliqué
    Dest.Sheets("COMPTA3").Delete
    ' ajouter les autres ici
    
    
    'Suppression d'un onglet sur le fichier source
    Dest.Sheets("COMPTA1").Delete
    'ajouter les autres ici
        
    'Réctivation des alertes (pas obligatoire dans cet exemple)
    Application.DisplayAlerts = True
    
    'Sauvegarde et fermeture de "ZZZ.XLS"
    Dest.Save
    Dest.Close
    
End Sub

Function ExisteFichier(Nomfic As String) As Boolean
On Error GoTo ExisteFichier_suite
    Dim N As String
    Dim R As Variant
    ExisteFichier = False
    N = Dir(Nomfic)
    If N <> "" Then ExisteFichier = True
ExisteFichier_fin:
    Exit Function
ExisteFichier_suite:
    R = MsgBox("Problème de lecture !", 48, "Erreur !!!")
    Resume ExisteFichier_fin
End Function
Il ne reste plus qu'à créer un bouton sur le fichier source pour déclencher l'action. Un conseil, prévoit une confirmation par l'utilisateur, Ex: Reponse=Msgbox(.....

Bon courage,
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 17 avril 2019, 09:43

C'est effectivement ce que je souhaite faire, je n'ai pas encore testé je voulais quelques précision avant.

Dans le fichier dupliqué je ne souhaite garder que UNE sheet car c'est elle qui est la sheet maître contenant toute les donnée brute.
Je souhaite donc dupliquer uniquement celle ci et créer un nouveau fichier, et ensuite par macro créer les sheets avec tableaux vu précédemment.
Je pense que ça sera plus simple que de supprimer toute les autres sheet par que il n'y a pas de règle de nommage.

Est ce que on peut remplacer le Dim Source As Workbook en Dim Source As WorkSheet et partir sur source = ActiveWorkSheet ?
Je ne sais pas si les macros créée dans le fichier source se transmettent dans le fichier destination.
Si oui, dans mon fichier, la sheet que je souhaite "isoler", comporte des boutons, seront ils transmis et fonctionnels?
G
GNIN
Membre habitué
Membre habitué
Messages : 74
Appréciations reçues : 6
Inscrit le : 6 février 2019
Version d'Excel : 2003
Version de Calc : 4.3

Message par GNIN » 17 avril 2019, 10:09

Bonjour,

Dans l'exemple que je te donne , il s'agit d'une copie à l'identique du fichier courant, donc tout est conservé (onglets, boutons, macros,...).

Une fois la copie effectuée, tu peux agir sur celle-ci et supprimer tous les onglets que tu veux en les énumérant un par un.
Exemple:
Dest.Sheets("COMPTA3").Delete
Dest.Sheets("COMPTA5").Delete
Dest.Sheets("COMPTA5").Delete
....

Tu peux également supprimer tous les onglets en excluant l'onglet que tu veux conserver au travers d'une boucle FOR..NEXT.
Procédure modifiée avec un onglet nommé "MAITRE" qui sera conservé. Tous les autres son supprimés
Sub DupliqueClasseur()
    Dim Source As Workbook
    Dim Dest As Workbook
    Dim F As Worksheet
    Set Source = ActiveWorkbook
    
    'Supprime fichier pour duplication si EXISTE
    If ExisteFichier(Source.Path & "\ZZZ.XLS") Then
        Kill Source.Path & "\ZZZ.XLS"
    End If
    
    'Enregistre le fichier à dupliquer sous...
    Source.SaveCopyAs Source.Path & "\ZZZ.XLS"
    
    'Ouvre le fichier qui vient d'être dupliqué
    Set Dest = Workbooks.Open(Source.Path & "\ZZZ.XLS")
    
    'Désactive les messages d'alerte avant suppression
    'd'un onglet
    Application.DisplayAlerts = False
    
    'Suppression des onglets sauf onglet principal (nommé MAITRE dans l'exemple)
    For Each F In Dest.Sheets
        If F.Name <> "MAITRE" Then
            Dest.Sheets(F.Name).Delete
        End If
    Next
    
    Application.DisplayAlerts = True
    
    'Sélection la feuille "MAITRE"
    Dest.Sheets("MAITRE").Select
    
    'Ecrit sur la cellule A1 de l'onglet "MAITRE"
    Dest.ActiveSheet.Range("A1").Value = "Gérard"
    
    'Sauvegarde et fermeture de "ZZZ.XLS"
    Dest.Save
    Dest.Close
    
End Sub
Voir fichier joint (Réalisé sous EXCEL 2003 ::)
Dupliquer Fichier Excel.xls
(28.5 Kio) Téléchargé 19 fois
)
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 17 avril 2019, 10:54

Merci beaucoup, je viens de voir ta réponse.

J'ai travaillé de mon coté, j'ai fait une boucle if, comme toi, donc ça va.
Application.DisplayAlerts = False
For Each Worksheet In Worksheets
    If Worksheet.Name <> "PLANNING" Then Worksheet.Delete
Next
Application.DisplayAlerts = True
Du coup j'ai pu voir que les macro se transmettait, j'avais peur vu que le nom était .xls et pas .xlsm
Je te remercie tu m'as bien aider. :)

Sur ce je vais clore le sujet.

Bonne journée.
G
GNIN
Membre habitué
Membre habitué
Messages : 74
Appréciations reçues : 6
Inscrit le : 6 février 2019
Version d'Excel : 2003
Version de Calc : 4.3

Message par GNIN » 17 avril 2019, 11:58

Oui effectivement, j'ai oublié de te préciser qu'il fallait prendre l'extension qui correspond à ta version d'Excel (XlsM).

Nous sommes toujours en version 2003 au travail (c'est triste :( )
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 17 avril 2019, 13:49

Je comprend et partage ta tristesse.

J'ai passé quelque temps sur openoffice ou libreoffice (je me souviens plus) pour mes études avant d'avoir excel.
Heureusement que je n'y faisait que des trucs rapide, ça aurait été une horreur pour faire autre chose que des rapports et présentation. :mrgreen:
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message