Fusionner plusieurs classeurs d'un répertoire

Bonjour le forum,

J'ai dans un répertoire bien défini, un ensemble de classeur à la structure identique.

J'aimerai, à l'aide d'une macro, récupérer les données de ces classeurs (dans l'onglet "synthèse") pour les synthétiser dans un classeur unique.

J'ai trouvé le code suivant, que j'ai essayé d'adapter :

Sub Compilation()

Dim Fichier As String
Dim Chemin As String
Dim ClasseurSource As Workbook
Dim DL As Integer

Application.DisplayAlerts = False 'Evite les messages d'Excel
Application.EnableEvents = False 'Evite l'exécution éventuelle de macros liées aux fichiers ouverts

Chemin = "C:\Users\utilisateur\Desktop\Fichiers\" 'Chemin du répertoire contenant les fichiers
Fichier = Dir(Chemin & "*.xlsm")
DL = Cells(Application.Rows.Count, 1).End(xlUp).Row 'Je définis la dernière ligne dont la colonne A n'est pas vide

Do While Fichier <> ""
    Set ClasseurSource = Workbooks.Open(Chemin & Fichier)
    CompteurClasseur = CompteurClasseur + 1
    ClasseurSource.Sheets("Synthèse").Select 'nom de la feuille source (commune à tous les fichiers sources)
    Range("A3:AC" & DL).Copy 'copie les données de la plage A3:AC jusqu'à la dernière remplie
    ThisWorkbook.Activate
    ThisWorkbook.Sheets("Extraction").Select
    Cells(65535, 1).End(xlUp)(2).Select 'recherche de la première ligne vide de mon fichier maitre
    ActiveSheet.Paste
    ClasseurSource.Close
    Fichier = Dir
Loop
 MsgBox "fusion de " & CompteurClasseur & " classeurs Excel.", vbInformation, "Import réussi"
Application.EnableEvents = True
Application.DisplayAlerts = True

End Sub

C'est un bon début, mais j'ai dû faire une erreur : toutes les données de mes classeurs sources ne sont pas copiées, il me manque certaines lignes et parfois il me copie également les en-têtes de chaque classeur.

Quelqu'un peut-il me mettre sur une piste ?

Merci d'avance,

Bonjour lucas54000,

Voici un exemple,

Avant d’exécuter la macro, n’oublie pas de modifier les lignes qui ont un commentaire « à adapter »

Option Explicit
'nécessite d'activer la référence: Microsoft ActiveX Data Objects xx Library

Sub RequeteClasseurFerme()
Dim Feuille As String, Repertoire As String, Ligne As Long
Dim fso, sfofolder, oFile
Dim Cnn, texte_SQL As String, Rst As ADODB.Recordset

Repertoire = "C:\Users\isabelle\Documents\Test3"  'à adapter
Feuille = "Feuil1"      'à adapter
Ligne = 2
Sheets.Add After:=Sheets(Sheets.Count)

Set fso = CreateObject("Scripting.FileSystemObject")
Set sfofolder = fso.GetFolder(Repertoire)

For Each oFile In sfofolder.Files
    If Right(oFile, 5) = ".xlsx" Then  'à adapter

        Set Cnn = New ADODB.Connection
        '--- Connexion ---
        With Cnn
            .Provider = "Microsoft.Jet.OLEDB.12.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                        & oFile & ";Extended Properties=""Excel 12.0;HDR=NO;"""
            .Open
        End With

        'Définit la requête.
        texte_SQL = "SELECT * FROM [" & Feuille & "$]"

        Set Rst = New ADODB.Recordset
        Set Rst = Cnn.Execute(texte_SQL)

        'Ecrit le résultat de la requête dans la cellule A2
        Range("A" & Ligne).CopyFromRecordset Rst
        Rst.Close
        Ligne = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row + 1
    End If
Next
'--- Fermeture connexion ---
Cnn.Close
Set Rst = Nothing
Set Cnn = Nothing
End Sub

Merci infiniment i20100 et WOW je suis bluffé par la rapidité de cette requête... 1 clic et paf tout apparaît

Juste un tout petit problème, dans le résultat de la requête les entêtes de chaque fichiers sont copiées également à chaque fois.

ça donne :

Entêtes

Données fichier 1

Entêtes

Données fichier 2

Entêtes

Données fichiers 3

etc..

C'est possible d'y remédier ?

Encore merci à toi

Lucas

J'ai trouvé, j'ai modifié la ligne

"SELECT * FROM [" & Feuille & "$]"

par

texte_SQL = "SELECT * FROM [" & Feuille & "$A3:AC" & "]"

soit ma plage de données à importer.

Encore merci !

Bonjour Lucas,

à tester, enlève HDR=NO de la chaine de connection

        '--- Connexion ---
        With Cnn
            .Provider = "Microsoft.Jet.OLEDB.12.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                        & oFile & ";Extended Properties=""Excel 12.0;;"""
            .Open
        End With

ça marche super bien également, merci encore à toi pour ton aide

Super, Merci pour ce retour, au plaisir!

Rechercher des sujets similaires à "fusionner classeurs repertoire"