Copie de feuilles sur autre classeur que celui lançant la macro

[Résolu/Fermé]
Signaler
Messages postés
20
Date d'inscription
dimanche 11 août 2013
Statut
Membre
Dernière intervention
18 septembre 2015
-
Messages postés
20
Date d'inscription
dimanche 11 août 2013
Statut
Membre
Dernière intervention
18 septembre 2015
-
Bonjour à toutes et tous,

Avec l'aide des internautes et des forums j'ai pu écrire la procédure ci après qui fonctionne bien.

Ce code fusionne plusieurs classeurs xlsb en un seul (les feuilles de chacun des fichiers sources sont copiées dans autant de feuilles dans le fichier compilé final, les feuilles sont nommées avec le non du fichier original sans son extension plus un numéro de compteur dans le cas ou il y'aurait plusieurs feuilles).

Je voudrais encore améliorer ce code en faisant en sorte que les feuilles soient copiées non pas sur le classeur (le nommé maitre dans le code) d'ou est lancée la macro mais sur un nouveau classeur vierge (j'ai essayé sans succès en utilisant plusieurs syntaxe d'insérer l'instruction Wookbooks.Add).

Je sollicite donc votre aide.

Merci
Cordialement
Hugues

ps : Même question également présente sur un autre FORUM sans résolution au moment ou j'écris ce post.




Sub Fusion()
Dim Maitre As Workbook
Dim Compteur As Integer
Dim Nf As String
Dim K As Integer

Application.ScreenUpdating = False
ChDir ActiveWorkbook.Path
Set Maitre = ActiveWorkbook

Nf = Dir("*.xlsb")
Do While Nf <> ""
If Nf <> Maitre.Name Then
With Workbooks.Open(Filename:=Nf)
For K = 1 To .Sheets.Count
.Sheets(K).Copy after:=Maitre.Sheets(Maitre.Sheets.Count)
ActiveSheet.Name = Replace(Nf, ".xlsb", "") & " " & K
Next K
.Close False
End With
End If
Nf = Dir
Loop
End Sub

3 réponses

Messages postés
393
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
7 mars 2019
25
Bonjour,

Petite recherche google : "vba créé un fichier excel"

Petit lien de 2007 comme premier résultat
https://forums.commentcamarche.net/forum/affich-4314289-vba-creation-d-un-nouveau-classeur-excel

Bonne lecture.

(Plutôt que l'approprier du code que je n'ai pas écrit, je donne le lien. On trouve toujours presque tout avec Google, il suffit de mettre les bons mots clés généralement avec VBA au début)
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
623
Ce code devrait fonctionner :


Sub Fusion()
Dim Maitre As Workbook
Dim Second As Workbook
Dim Compteur As Integer
Dim Nf As String
Dim chemin As string
Dim K As Integer

Application.ScreenUpdating = False
ChDir ActiveWorkbook.Path
chemin = ActiveWorkbook.Path & "\"
Set Maitre = ActiveWorkbook
Workbooks.Add
Set Second = ActiveWorkbook

Nf = Dir("*.xlsb")
Do While Nf <> ""
If Nf <> Maitre.Name Then
With Workbooks.Open(Filename:=Nf)
For K = 1 To .Sheets.Count
.Sheets(K).Copy after:=Second.Sheets(Second.Sheets.Count)
ActiveSheet.Name = Replace(Nf, ".xlsb", "") & " " & K
Next K
.Close False
End With
End If
Nf = Dir
Loop

Second.Saveas (chemin & "nom_classeur" & ".xlsx")

End Sub




--
Messages postés
20
Date d'inscription
dimanche 11 août 2013
Statut
Membre
Dernière intervention
18 septembre 2015

Bonjour Thev,

Merci de ta proposition d'amélioration de code.
Et même si ton écriture de code avait du sens j'ai une erreur dans son exécution :

Erreur d'exécution '1004':
Excel ne parvient pas à insérer les feuilles dans le classeur de destination car il contient moins de lignes et colonnes que le classeur source. Pour déplacer ou copier les données vers le classeur de destination, vous pouvez les sélectionner, puis utiliser les commandes Copier et Coller pour les insérer dans les feuilles d'un autre classeur.

Le débogueur met en surbrillance cette partie du code :
.Sheets(K).Copy after:=Second.Sheets(Second.Sheets.Count)

Cordialement
Hugues
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
623 >
Messages postés
20
Date d'inscription
dimanche 11 août 2013
Statut
Membre
Dernière intervention
18 septembre 2015

Le problème vient du type de classeur .xlsb. Par défaut, workbook.add ne crée pas ce type de classeur .Il existe un paramètre de l'objet application permettant de spécifier l'extension par défaut. Je le recherche.
Messages postés
20
Date d'inscription
dimanche 11 août 2013
Statut
Membre
Dernière intervention
18 septembre 2015
>
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020

Re bonsoir thev,

Tu m'as très largement éclairé, j'ai modifié comme ci après cela fonctionne :
SaveFormat déclaré en Long
Puis avant création du classeur je demande Application.DefaultSaveFormat=50
Et je remet aux paramètres par défaut en fin de procédure.
Cela fonctionne.
Quel est ton avis, c'est à un truc comme cela que tu pensais ou peut être plus simple ?
En tous cas merci à toi le mérite te revient, je n'ai fait que suivre tes conseils et utiliser google pour mes recherches de cette syntaxe.

Cordialement
Hugues


Sub Fusion2()
Dim Maitre As Workbook
Dim Second As Workbook
Dim Compteur As Integer
Dim Nf As String
Dim chemin As String
Dim K As Integer
Dim SaveFormat As Long

Application.ScreenUpdating = False
ChDir ActiveWorkbook.Path
chemin = ActiveWorkbook.Path & "\"
Set Maitre = ActiveWorkbook

Application.DefaultSaveFormat = 50

Workbooks.Add
Set Second = ActiveWorkbook

Nf = Dir("*.xlsb")
Do While Nf <> ""
If Nf <> Maitre.Name Then
With Workbooks.Open(Filename:=Nf)
For K = 1 To .Sheets.Count
.Sheets(K).Copy after:=Second.Sheets(Second.Sheets.Count)
ActiveSheet.Name = Replace(Nf, ".xlsb", "") & " " & K
Next K
.Close False
End With
End If
Nf = Dir
Loop

Second.SaveAs (chemin & "nom_classeur" & ".xlsx")

Application.DefaultSaveFormat = SaveFormat

End Sub
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
623 >
Messages postés
20
Date d'inscription
dimanche 11 août 2013
Statut
Membre
Dernière intervention
18 septembre 2015

Oui, il s'agissait bien de la propriété DefaultSaveFormat et tu as trouvé toi-même la bonne valeur à appliquer.
J'ai eu plaisir à t'aider car j'ai trouvé dans ton code une bonne logique d'utilisation des objets et propriétés VBA . Ce que je vois le plus souvent, c'est du code très proche de celui généré par l'enregistreur de macros et fastidieux à décortiquer.
Messages postés
20
Date d'inscription
dimanche 11 août 2013
Statut
Membre
Dernière intervention
18 septembre 2015
>
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020

Bonsoir,

Je n'ai fait qu'adapter un code en prenant des infos auprès d'experts sur ce forum ou autres internautes qualifiés.
Merci à toi "l'éclaireur".

Bonne soirée
Je marque ce post comme résolu.

Cordialement
Hugues
Messages postés
20
Date d'inscription
dimanche 11 août 2013
Statut
Membre
Dernière intervention
18 septembre 2015

Bonjour PlacageGranby, Bonjour Thev,

Merci à vous 2 d'avoir pris le temps de lire mon message et d'essayer de m'apporter une solution.

Thev je commente directement ta réponse ci aprés

Cordialement
Hugues