Regrouper plusieurs lignes de fichiers différents dans une feuille unique

Bonjour les experts !

J'ai un petit grand souci dans le traitement de plusieurs fichiers.

Je souhaite une solution me permettant de regrouper les lignes non vides de plusieurs feuilles Excel dans une feuille unique nouvelle.

Par exemple, j'ai 20 fichiers Excel nommés de A à T et dans chaque feuille il y a un nombre de lignes déterminés non égaux mais au nombre de colonnes égaux.

Je désire une solution pour créer un nouveau fichier et y copier automatiquement et respectivement toutes les lignes de A, de B jusqu'à T

J'attends avec impatience vos lumières.

Bonjour,

Une piste !

Les valeurs seront inscrites dans la feuille nommée "Feuil1" (à adapter si différent) et dans le classeur qui contiendra cette macro. Attention, ne pas mettre le classeur dans le même dossier que les autres classeurs où seront récupérées les valeurs.

Au lancement du code, une boite de dialogue demande de choisir le dossier où se trouvent les classeurs :

Sub Test()

    Dim Cls As Workbook
    Dim Fe As Worksheet
    Dim Plage As Range
    Dim Tbl() As String
    Dim I As Integer
    Dim Chemin As String
    Dim Lig As Long

    With Application.FileDialog(4)
        If .Show = -1 Then Chemin = .SelectedItems(1) & "\"
    End With

    If Chemin = "" Then Exit Sub

    'récupère les noms des classeurs
    Tbl = EnumFichiers(Chemin, ".xls*") 'astérisque pour tous les fichiers Excel (.xls, .xlsx, .xlsm, etc...)

    'si initialisé...
    If Not (Not Tbl) Then

        Application.ScreenUpdating = False

        'boucle sur le tableau
        For I = 1 To UBound(Tbl)

            'ouvre le classeur
            Set Cls = Workbooks.Open(Chemin & Tbl(I))

            For Each Fe In Cls.Worksheets

                Set Plage = DefPlage(Fe, 1, 1)

                With ThisWorkbook.Worksheets("Feuil1")

                    Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'sur colonne A
                    .Range(.Cells(Lig, 1), .Cells(Lig - 1 + Plage.Rows.Count, Plage.Columns.Count)).Value = Plage.Value

                End With

            Next Fe

            'referme
            Cls.Close False

        Next I

    End If

    Application.ScreenUpdating = False

End Sub

Function EnumFichiers(Chemin As String, Extension As String) As String()

    Dim TableauFichiers() As String
    Dim Fichier As String
    Dim I As Integer

    'complète le chemin le cas échéant
    If Right(Chemin, 1) <> "\" Then Chemin = Chemin & "\"

    'récupère seulement les fichiers Excel
    Fichier = Dir(Chemin & "*" & Extension)

    'boucle sur les fichiers du dossier
    Do While (Len(Fichier) > 0)

        I = I + 1

        ReDim Preserve TableauFichiers(1 To I)

        TableauFichiers(I) = Fichier

        Fichier = Dir()

    Loop

    'retourne le tableau des noms de fichiers
    EnumFichiers = TableauFichiers()

End Function

Function DefPlage(Fe As Worksheet, Optional L As Long = 1, Optional C As Long = 1) As Range

    On Error GoTo Fin

    With Fe

        Set DefPlage = .Range(.Cells(L, C), _
                       .Cells(.Cells.Find("*", .[A1], -4123, , _
                       1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
                       2, 2).Column))

    End With

    Exit Function

Fin:

    Set DefPlage = Nothing

End Function

Bonjour !

Merci infiniment pour cette contribution. Je l'ai testé mais seules les valeurs du premier fichier sont affichées dans le classeur avec macro. Auparavant ce message apparaît. "variable objet ou variable de bloc with non définie"

autre chose, la macro ouvre aussi en même temps le fichier dont les données sont récupérées. S'il en y a plusieurs cela peut être gênant. Est-il possible qu'elle ne les ouvre pas ?

Merci

Bonjour,

Le message d'erreur est probablement dû au fait qu'une ou plusieurs feuilles du classeur ouvert est totalement vide donc, la variable Plage est Nothing. J'ai corrigé le code de la Sub "Test" :

Sub Test()

    Dim Cls As Workbook
    Dim Fe As Worksheet
    Dim Plage As Range
    Dim Tbl() As String
    Dim I As Integer
    Dim Chemin As String
    Dim Lig As Long

    With Application.FileDialog(4)
        If .Show = -1 Then Chemin = .SelectedItems(1) & "\"
    End With

    If Chemin = "" Then Exit Sub

    'récupère les noms des classeurs
    Tbl = EnumFichiers(Chemin, ".xls*") 'astérisque pour tous les fichiers Excel (.xls, .xlsx, .xlsm, etc...)

    'si initialisé...
    If Not (Not Tbl) Then

        Application.ScreenUpdating = False

        'boucle sur le tableau
        For I = 1 To UBound(Tbl)

            'ouvre le classeur
            Set Cls = Workbooks.Open(Chemin & Tbl(I))

            For Each Fe In Cls.Worksheets

                Set Plage = DefPlage(Fe, 1, 1)

                If Not Plage Is Nothing Then

                    With ThisWorkbook.Worksheets("Feuil1")

                        Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'sur colonne A
                        .Range(.Cells(Lig, 1), .Cells(Lig - 1 + Plage.Rows.Count, Plage.Columns.Count)).Value = Plage.Value

                    End With

                End If

            Next Fe

            'referme
            Cls.Close False

        Next I

    End If

    Application.ScreenUpdating = True

End Sub

autre chose, la macro ouvre aussi en même temps le fichier dont les données sont récupérées. S'il en y a plusieurs cela peut être gênant. Est-il possible qu'elle ne les ouvre pas ?

La Sub ouvre et referme le classeur une fois les valeurs récupérées, c'est plus compliqué de récupérer les valeur avec les classeurs fermés, il faut utiliser ADO et dans ton cas, ce n'est pas vraiment nécéssaire

Formidable ! vous êtes ingénieux. Merci beaucoup

J'ai conservé la première macro en supprimant les feuilles vides de chaque fichier et ça marche comme sur des roulettes.

Pour la seconde, Excel me signale un problème de Sub (test) et met en surbrillance la ligne Tbl = Enumfichiers

Bonjour,

Le second code posté doit venir en remplacement de la Sub "Test" du premier post mais les autres fonctions doivent être conservées car utilisées aussi dans le second code

Bonjour Theze

Puis avoir la macro définitive complète svp ? Il me semble que j'ai confondu les choses

Bonjour,

Voici le code complet :

Sub Test()

    Dim Cls As Workbook
    Dim Fe As Worksheet
    Dim Plage As Range
    Dim Tbl() As String
    Dim I As Integer
    Dim Chemin As String
    Dim Lig As Long

    With Application.FileDialog(4)
        If .Show = -1 Then Chemin = .SelectedItems(1) & "\"
    End With

    If Chemin = "" Then Exit Sub

    'récupère les noms des classeurs
    Tbl = EnumFichiers(Chemin, ".xls*") 'astérisque pour tous les fichiers Excel (.xls, .xlsx, .xlsm, etc...)

    'si initialisé...
    If Not (Not Tbl) Then

        Application.ScreenUpdating = False

        'boucle sur le tableau
        For I = 1 To UBound(Tbl)

            'ouvre le classeur
            Set Cls = Workbooks.Open(Chemin & Tbl(I))

            For Each Fe In Cls.Worksheets

                Set Plage = DefPlage(Fe, 1, 1)

                If Not Plage Is Nothing Then

                    With ThisWorkbook.Worksheets("Feuil1")

                        Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'sur colonne A
                        .Range(.Cells(Lig, 1), .Cells(Lig - 1 + Plage.Rows.Count, Plage.Columns.Count)).Value = Plage.Value

                    End With

                End If

            Next Fe

            'referme
            Cls.Close False

        Next I

    End If

    Application.ScreenUpdating = True

End Sub

Function EnumFichiers(Chemin As String, Extension As String) As String()

    Dim TableauFichiers() As String
    Dim Fichier As String
    Dim I As Integer

    'complète le chemin le cas échéant
    If Right(Chemin, 1) <> "\" Then Chemin = Chemin & "\"

    'récupère seulement les fichiers Excel
    Fichier = Dir(Chemin & "*" & Extension)

    'boucle sur les fichiers du dossier
    Do While (Len(Fichier) > 0)

        I = I + 1

        ReDim Preserve TableauFichiers(1 To I)

        TableauFichiers(I) = Fichier

        Fichier = Dir()

    Loop

    'retourne le tableau des noms de fichiers
    EnumFichiers = TableauFichiers()

End Function

Function DefPlage(Fe As Worksheet, Optional L As Long = 1, Optional C As Long = 1) As Range

    On Error GoTo Fin

    With Fe

        Set DefPlage = .Range(.Cells(L, C), _
                       .Cells(.Cells.Find("*", .[A1], -4123, , _
                       1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
                       2, 2).Column))

    End With

    Exit Function

Fin:

    Set DefPlage = Nothing

End Function

impeccable. Merci beaucoup

Rechercher des sujets similaires à "regrouper lignes fichiers differents feuille unique"