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 SubBonjour 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 WithCe 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 WithQuand 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) <> "" ThenSais-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 Withconcerne 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) <> "" Thenen 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 FunctionMerci BEAUCOUP Theze !!
Cela fonctionne.
Top Top Top !!
Content de t’avoir aidé