Ouvrir les fichier d'une liste et copier une partie d'un onglet

Bonjour à tous,

J'ai un certain nombre de fichier excel (un par client) qui sont tous conçus de la même manière (même onglets).

Ils ne se trouvent pas dans le même répertoire, mais chacun dans un répertoire au nom du client.

Passation CLIENT1.xlsxx

Passation CLIENT2.xlsxx

Passation CLIENT3.xlsxx

etc...

Sur ces différents fichiers, je souhaite copier/coller les données de l'onglet appeler "Actions en cours", a partir de la cellule A2, jusqu'à la dernière ligne non vide. Sur ces onglets, la dernière colonne non vide est la colonne E.

Ces données doivent être collées à la suite l'unes de l'autres dans un fichier appelé Suivi Actions.xlsm, sur l'oinglet "Actions en cours" a partir de la cellule A2.

Sur ce fichier, les noms des clients sont en colonne A, et en B on trouve le chemin complet d'accès, sur l'onglet client

La liste débute sur la ligne 4 de ce fichier.

"C:\Users\prenom.nom\Documents\10 - Clients\CLIENT1.xlsx"

"C:\Users\prenom.nom\Documents\10 - Clients\CLIENT2.xlsx"

Etc

Cette liste est évolutive. D’où le fait que je recherche à faire une boucle...

Est-ce la description de mon besoin est assez précise ?

Merci bcp à toutes et tous de votre aide !

Thomas.

Bonjour,

A adapter et faire tout d'abords un test sur une copie du classeur devant recevoir les différentes valeurs (les classeurs où sont récupérées les valeurs ne risquent rien) :

Sub Test()

    Dim Cl As Workbook
    Dim Fe As Worksheet
    Dim PlgChemin As Range
    Dim PlgValeur As Range
    Dim Cel As Range
    Dim Lig As Long

    'défini la plage sur la colonne B à partir de B4 contenant les chemins des dossiers avec noms des classeurs, adapter le nom de la feuille, ne le connaissant pas, j'ai mis "Feuil1" !
    With ThisWorkbook.Worksheets("Feuil1"): Set PlgChemin = .Range(.Cells(4, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

    'feuille du classeur où se trouve la macro devant recevoir les valeurs
    Set Fe = ThisWorkbook.Worksheets("Actions en cours")

    'gèle
    Application.ScreenUpdating = False

    'parcours la plage des chemins
    For Each Cel In PlgChemin

        'contrôle si valide
        If Dir(Cel.Value) <> "" Then

            'ouvre le classeur
            Set Cl = Workbooks.Open(Cel.Value)

            'défini la plage de A1 à Ex
            With Cl.Worksheets("Actions en cours"): Set PlgValeur = .Range(.Cells(1, 1), .Cells(.Rows.Count, 5).End(xlUp)): End With

            'si pas vide...
            If Not PlgValeur Is Nothing Then

                '...inscrit les valeurs les unes à la suite des autres...
                With Fe

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

                End With

            End If

            '...puis referme le classeur
            Cl.Close False

        End If

    Next Cel

    'rafraîchi
    Application.ScreenUpdating = True

End Sub

Bonjour Theze,

Tout d'abord, merci pour le coup de main.

J'ai intégré la macro au classeur devant recevoir les valeurs.

J'ai modifié le nom de la feuilles des classeurs où sont récupérées les données. Sur chaque classeur "client", les données à récupérer se trouvent dans l'onglet "Actions en cours".

'défini la plage sur la colonne B à partir de B4 contenant les chemins des dossiers avec noms des classeurs, adapter le nom de la feuille, ne le connaissant pas, j'ai mis "Feuil1" !
    With ThisWorkbook.Worksheets("Feuil1"): Set PlgChemin = .Range(.Cells(4, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

Ce qui devient :

  'défini la plage sur la colonne B à partir de B4 contenant les chemins des dossiers avec noms des classeurs, adapter le nom de la feuille, ne le connaissant pas, j'ai mis "Feuil1" !
    With ThisWorkbook.Worksheets("Action en cours"): Set PlgChemin = .Range(.Cells(4, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

Quand je lance la macro, j'ai le message suivant "Erreur d'éxécution ' 13': Incompatibilité de type".

Ce message apparait à cet endroit de la macro :

        'contrôle si valide
        If Dir(Cel.Value) <> "" Then

Sais-tu pourquoi ?

Encore merci pour ton aide.

Thomas.

L'instruction :

    'défini la plage sur la colonne B à partir de B4 contenant les chemins des dossiers avec noms des classeurs, adapter le nom de la feuille, ne le connaissant pas, j'ai mis "Feuil1" !
    With ThisWorkbook.Worksheets("Feuil1"): Set PlgChemin = .Range(.Cells(4, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

concerne le classeur qui contient la macro (ThisWorkbook) et une de ses feuilles (que j'ai nommé "Feuil1") contient en colonne B à partir de B4 les chemins et noms des classeurs où doivent être récupérées les valeurs donc, si je comprend ta manip, la feuille où se trouve les chemins et noms se nomme "Action en cours" mais je ne pense pas que ce soit ça !

Quand le compilateur s'arrête sur la ligne :

If Dir(Cel.Value) <> "" Then

en survolant "Cel.Value", qu'indique l'infobulle ? Normalement ce doit être du genre :

"C:\Users\prenom.nom\Documents\10 - Clients\CLIENT1.xlsx"

Si ce n'est pas le cas et c'est ce que je pense, il y a un soucis sur la feuille cible.

Sinon, postes une copie anonymisée de ton classeur maître (celui devant récupérer toutes les valeurs des autres) et un classeur source lui aussi anonymisé

Re Theze,

Voici le fichier (PORTEFEUILLE_actions_COPIE) qui va récupérer les données et qui contient les chemins d'accès des classeurs ou la macro doit aller chercher les données. Ces données vont être copié sur l'onglet "Actions en cours" de ce fichier.

Et j'ai mis pour exemple 2 classeurs "clients". Ou on trouve aussi l'onglet "Actions en cours" dont les données sont a récupérer et coller sur le fichier PORTEFEUILLE.

Merci bcp

J'ai modifié le code car des colonnes sont vides dans tes fichiers clients, j'ai rajouté une fonction pour être sûr de tout récupérer.

Comme je le pensais, le nom de la feuille où se trouve les chemins et noms ne se nomme pas "Actions en cours" mais "Clients" donc, j'ai adapté dans le code.

Les extensions Excel sont .xlsm ou .xlsx mais pas .xlsxm donc, corrige dans tes formules sinon, la fonction "Dir()" retournera toujours "" :

Sub Test()

    Dim Cl As Workbook
    Dim Fe As Worksheet
    Dim PlgChemin As Range
    Dim PlgValeur As Range
    Dim Cel As Range
    Dim Lig As Long

    'défini la plage sur la colonne B à partir de B4 contenant les chemins des dossiers avec noms des classeurs dans la feuille "Clients"
    With ThisWorkbook.Worksheets("Clients"): Set PlgChemin = .Range(.Cells(4, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

    'feuille du classeur où se trouve la macro devant recevoir les valeurs
    Set Fe = ThisWorkbook.Worksheets("Actions en cours")

    'gèle
    Application.ScreenUpdating = False

    'parcours la plage des chemins
    For Each Cel In PlgChemin

        'contrôle si valide
        If Dir(Cel.Value) <> "" Then

            'ouvre le classeur
            Set Cl = Workbooks.Open(Cel.Value)

            'défini la plage de A1 à Ex
            Set PlgValeur = DefPlage(Cl.Worksheets("Actions en cours"), 2)
            'With Cl.Worksheets("Actions en cours"): Set PlgValeur = .Range(.Cells(1, 1), .Cells(.Rows.Count, 5).End(xlUp)): End With

            'si pas vide...
            If Not PlgValeur Is Nothing Then

                '...inscrit les valeurs les unes à la suite des autres...
                With Fe

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

                End With

            End If

            '...puis referme le classeur
            Cl.Close False

        End If

    Next Cel

    'rafraîchi
    Application.ScreenUpdating = True

End Sub

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

Merci BEAUCOUP Theze !!

Cela fonctionne.

Top Top Top !!

Content de t’avoir aidé

Rechercher des sujets similaires à "ouvrir fichier liste copier partie onglet"