XL 2016 Fusionner 3 classeurs Excel en un seul.

ReneDav14000

XLDnaute Occasionnel
Bonjour à tous,
J'ai trouvé ce code réalisé par Job75 le 18 juin 2019. D'après le titre de la discussion il doit permettre de fusionner plusieurs classeurs Excel en un seul.
Est-ce qu'il fonctionnera avec des classeurs contenant du code Vba, donc avec une extension ".xlsm" ?
Pour mon cas mes trois classeurs sont :
Agenda.xlsm
Personnels.xlsm
Réservations.xlsm
Merci par avance pour votre participation

VB:
Private Sub CommandButton1_Click()
Dim a(), s As Object, fichier, i%
ReDim a(1 To 2) 'dimension à adapter
a(1) = ThisWorkbook.Path & "\Classeur1.xlsx" 'à adapter
a(2) = ThisWorkbook.Path & "\Classeur2.xlsx" 'à adapter
'etc...
'---supression des feuilles---
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each s In Sheets
    If s.Name <> Me.Name Then s.Delete
Next s
'---copie des feuilles des fichiers---
For Each fichier In a
    With Workbooks.Open(fichier)
        For i = 1 To .Sheets.Count
            .Sheets(i).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
            ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = Left(.Name, 31 - Len(CStr(i)) - 2) & "(" & i & ")"
        Next i
        .Close
    End With
Next fichier
Me.Activate
End Sub
 
Solution
Bonjour à tous,

Pardon de décevoir, mais à la lecture du code on voit que ça ne marchera pas pour les xlsm.
Et espérons qu'un tel outil pour xlsm n'existera jamais.

En effet, un xlsm est constitué de feuilles et aussi (potentiellement) de modules, de userform, de modules de classe, de déclaration d'API, de constantes publiques, de variables publiques, d'options, et j'en oublie probablement.

Ok alors il serait nécessaire de renommer tout ça?

Pas si simple, si, par exemple, le Useform_Saisie est renommé en Userform1 il faudra reprendre dans le code tous les appels à cet usf
Si dans un module il est déclaré Option base 0 et dans un autre Option base 1, que faire? On en choisit un des 2 et on reprend dans le code...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour ReneDAv,
Pourquoi ne pas avoir essayé ?
Vous remplacez :
VB:
ReDim a(1 To 2) 'dimension à adapter
a(1) = ThisWorkbook.Path & "\Classeur1.xlsx" 'à adapter
a(2) = ThisWorkbook.Path & "\Classeur2.xlsx" 'à adapter
par
Code:
ReDim a(1 To 3)
a(1) = ThisWorkbook.Path & "\Agenda.xlsm"
a(2) = ThisWorkbook.Path & "\Personnels.xlsm"
a(3) = ThisWorkbook.Path & "\Réservations.xlsm"
 

p56

XLDnaute Occasionnel
Bonjour à tous,

Pardon de décevoir, mais à la lecture du code on voit que ça ne marchera pas pour les xlsm.
Et espérons qu'un tel outil pour xlsm n'existera jamais.

En effet, un xlsm est constitué de feuilles et aussi (potentiellement) de modules, de userform, de modules de classe, de déclaration d'API, de constantes publiques, de variables publiques, d'options, et j'en oublie probablement.

Ok alors il serait nécessaire de renommer tout ça?

Pas si simple, si, par exemple, le Useform_Saisie est renommé en Userform1 il faudra reprendre dans le code tous les appels à cet usf
Si dans un module il est déclaré Option base 0 et dans un autre Option base 1, que faire? On en choisit un des 2 et on reprend dans le code tous les indices pour la gestion des tableaux impactés?
Et si les modules de classe sont renommés, il sera impératif de reprendre toutes les instanciations
Pour les API, si on a plusieurs fois un truc genre Public Declare ... l'un pourrait avoir une clause de compilation conditionnelle, l'autre sans, laquelle garder?
Etc, etc ...

Bon admettons qu'un codeur soit assez fou pour concevoir un tel outil, quel en serait le résultat?
Un fichier dans lequel tout serait renommé avec des noms génériques du genre Module1, Module2, usf1, usf2, ... Et là bon courage au gars qui pourra s'y retrouver pour modifier ou corriger une seule ligne!

Bref, désolé mais pour les xlsm ça n'existera jamais.
P.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour P56,
Pardon de décevoir, mais à la lecture du code on voit que ça ne marchera pas pour les xlsm.
Le code de Job évoqué au post #1 copie les feuilles et les compile dans un seul fichier.
Avec des xlsm, ça marchera et fera exactement la même chose.
Il n'est pas demandé de copier autre chose que les feuilles, ou alors la demande est érronée.
 

ReneDav14000

XLDnaute Occasionnel
Re,
Si le but est de fusionner les trois fichiers y compris macros, usf .... vous aurez le même souci qu'évoqué par P56. Si des macros ou autre objet portent le même nom il vous faudra bidouiller pour tout remettre carré.
Si le but est de fusionner uniquement les feuilles alors la macro de job fonctionne.
Normalement je ne devrais pas rencontrer ce genre de problème, dans ce cas je modifierai.
Merci pour vos précisions
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Avec des fichiers .xlsm la macro copie les feuilles avec leurs codes VBA.

Si ces codes utilisent d'autres modules c'est évidemment autre chose.

Notez qu'avec des fichiers .xlsx il peut y avoir aussi des problèmes s'il y a des formules avec liaisons.

A+
 

ReneDav14000

XLDnaute Occasionnel
Bonjour à tous,

Avec des fichiers .xlsm la macro copie les feuilles avec leurs codes VBA.

Si ces codes utilisent d'autres modules c'est évidemment autre chose.

Notez qu'avec des fichiers .xlsx il peut y avoir aussi des problèmes s'il y a des formules avec liaisons.

A+
Bonjour,
Je vais faire des essais et si ça plante, alors je me débrouillerai avec des copier/coller.
Merci et bon dimanche
 

Discussions similaires

Réponses
2
Affichages
203
Réponses
12
Affichages
242

Statistiques des forums

Discussions
312 111
Messages
2 085 396
Membres
102 882
dernier inscrit
Sultan94