Macro copie de données de différents dossiers
Dim83
Messages postés
18
Date d'inscription
Statut
Membre
Dernière intervention
-
Syzygy Messages postés 378 Date d'inscription Statut Membre Dernière intervention -
Syzygy Messages postés 378 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je souhaite automatiser la récupération de données de différents fichiers xlsx des différent sous répertoire :
- résultats:
...............- condition 2 :
.....................................- cl : -1.xlsx
............................................ - 2.xlsx ...
.............. - condition 3 :
.....................................- cl : - 11.xlsx
.............................................- 21.xlsx ...
...............- condition 3 :
.....................................- cl : - 12.xlsx
.............................................- 22.xlsx ...
pour les copier dans une feuille excel tel que :
expl:
donnée1,,donnée2,,donnée3,,...
233525. ,,.365351.,,.354561.,,...
325468. ,,.125468.,,.325457.,,...
j'ai écrit ce code à partir d'un autre code que "Syzygy" m'a gentiment écrit, mais ça ne marche pas. Quelqu'un peut m'expliquer pourquoi et m'aider faire que ça marche ?
Le code:
______________________________________________________________
Merci
je souhaite automatiser la récupération de données de différents fichiers xlsx des différent sous répertoire :
- résultats:
...............- condition 2 :
.....................................- cl : -1.xlsx
............................................ - 2.xlsx ...
.............. - condition 3 :
.....................................- cl : - 11.xlsx
.............................................- 21.xlsx ...
...............- condition 3 :
.....................................- cl : - 12.xlsx
.............................................- 22.xlsx ...
pour les copier dans une feuille excel tel que :
expl:
donnée1,,donnée2,,donnée3,,...
233525. ,,.365351.,,.354561.,,...
325468. ,,.125468.,,.325457.,,...
j'ai écrit ce code à partir d'un autre code que "Syzygy" m'a gentiment écrit, mais ça ne marche pas. Quelqu'un peut m'expliquer pourquoi et m'aider faire que ça marche ?
Le code:
Public FeuilleDestination As Worksheet 'Activer la référence "Microsoft scripting runtime" pour que la macro foncitonne 'Parcours les sous-dossiers inclus dans le répertoire "résultats" Sub ListeDossiersResultats() 'Adapté de Ole P Erlandsen Application.ScreenUpdating = False Dim Fso As Object, SourceFolder As Object Dim SubFolder As Object Dim NomRep As String Dim NomSousRepComplet As String NomRep = "D:\Mes documents\Cours master 1\mémoire2\résultats" 'Nom du répertoire parent Set Fso = CreateObject("Scripting.FileSystemObject") Set SourceFolder = Fso.GetFolder(NomRep) For Each SubFolder In SourceFolder.SubFolders NomSousRepComplet = SubFolder.Path SelectionDonneesVariables (NomSousRepComplet) Next SubFolder Application.ScreenUpdating = True MsgBox ("Liste terminée") End Sub Sub SelectionDonneesVariables(NomSousRepComplet As String) Dim fs, F, f1, s, sf Dim i As Long, Fin As Long Set FeuilleDestination = ThisWorkbook.Sheets("Traitement") Set fs = CreateObject("Scripting.FileSystemObject") Set F = fs.GetFolder(NomSousRepComplet) Set sf = F.Files For Each f1 In sf If LCase(Right(f1.Name, 3)) = "xlsx" Then Fichier = NomSousRepComplet & "\" & f1.Name Workbooks.Open Filename:=Fichier Range("B3:C3").Select Selection.Copy Destination:=FeuilleDestination.Range("A2:B2") Range("E6").Select Selection.Copy Destination:=FeuilleDestination.Range("C2") Range("K7").Select Selection.Copy Destination:=FeuilleDestination.Range("D2") Range("K4").Select Selection.Copy Destination:=FeuilleDestination.Range("E2") Range("K6").Select Selection.Copy Destination:=FeuilleDestination.Range("F2") Range("K5").Select Selection.Copy Destination:=FeuilleDestination.Range("G2") ActiveWindow.Close SaveChanges:=False 'Appel la procédure d'enregistrement Sauv_traitement (Fichier) End If Next End Sub Sub Sauv_traitement(Fichier) ' ' Sauv_traitement Macro ' Windows("Résumé résultats vérification respect des conditions.xlsm:2").Activate Windows("Résumé résultats vérification respect des conditions.xlsm:1").Activate Selection.Copy Windows("Résumé résultats vérification respect des conditions.xlsm:2").Activate ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste End Sub
______________________________________________________________
Merci
A voir également:
- Macro copie de données de différents dossiers
- Fuite données maif - Guide
- Copie cachée - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Supprimer les données de navigation - Guide
- Super copie - Télécharger - Gestion de fichiers
7 réponses
Bonsoir,
Quel plaisir de vous revoir ici ;-). Au niveau de la macro, il y a un problème lorsque vous parcourez les répertoire. En effet la procédure "ListeDossiersRésultats" entre dans chacun des sous-répertoire contenu dans le dossier Résultats mais ne descend pas plus en profondeur.
Le reste de votre procédure va donc chercher les fichiers Excel dans le répertoire "Résultats\Condition 2" puis "Resultats\Condition 3"... Sans jamais atteindre les sous répertoire contenu à l'intérieur. Il faut que vous ajoutiez un degré de récurence.
Essayez le code suivant (à mettez à jour la procédure "ListeDossiersCondition2" et ajoutez la procédure "ParcourtSousRep"):
'Parcours les sous-dossiers inclus dans le répertoire "résultats"
Sub ListeDossiersCondition2()
'Adapté de Ole P Erlandsen
Application.ScreenUpdating = False
Dim Fso As Object, SourceFolder As Object
Dim SubFolder As Object
Dim NomRep As String
Dim NomSousRepComplet As String
NomRep = "D:\Mes documents\Cours master 1\mémoire2\résultats" 'Nom du répertoire parent
Set Fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = Fso.GetFolder(NomRep)
For Each SubFolder In SourceFolder.SubFolders
NomSousRepComplet = SubFolder.path
ParcourtSousRep (NomSousRepComplet) 'Appel la procédure de récursivité pour parcourir les sous répertoire contenu dans le dossier
Next SubFolder
Application.ScreenUpdating = True
MsgBox ("Liste terminée")
End Sub
Sub ParcourtSousRep(NomSousRepComplet As String)
Dim Fso As Object, SourceFolder As Object
Dim SubFolder As Object
Set Fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = Fso.GetFolder(NomSousRepComplet)
For Each SubFolder In SourceFolder.SubFolders
NomSousRepComplet = SubFolder.path
SelectionDonneesVariables (NomSousRepComplet)
Next SubFolder
End Sub
Excel parcourera ainsi chaque sous répertoire contenu dans chacune des conditions... (Pour info au passage, s'il y avait un niveau d'arborescence supplémentaire, il me semble qu'il suffirait de faire boucler la procédure ParcourtSousRep sur elle même.)
Je n'ai pas regardé la suite du code donc tenez moi informé si cela ne fonctionne pas... (ou si çà marche aussi d'ailleurs)
Bonne soirée,
PS: Pouvez-vous supprimer l'adresse mail dans votre précédent post, çà m'évitera de recevoir trop de spam. Merci
Quel plaisir de vous revoir ici ;-). Au niveau de la macro, il y a un problème lorsque vous parcourez les répertoire. En effet la procédure "ListeDossiersRésultats" entre dans chacun des sous-répertoire contenu dans le dossier Résultats mais ne descend pas plus en profondeur.
Le reste de votre procédure va donc chercher les fichiers Excel dans le répertoire "Résultats\Condition 2" puis "Resultats\Condition 3"... Sans jamais atteindre les sous répertoire contenu à l'intérieur. Il faut que vous ajoutiez un degré de récurence.
Essayez le code suivant (à mettez à jour la procédure "ListeDossiersCondition2" et ajoutez la procédure "ParcourtSousRep"):
'Parcours les sous-dossiers inclus dans le répertoire "résultats"
Sub ListeDossiersCondition2()
'Adapté de Ole P Erlandsen
Application.ScreenUpdating = False
Dim Fso As Object, SourceFolder As Object
Dim SubFolder As Object
Dim NomRep As String
Dim NomSousRepComplet As String
NomRep = "D:\Mes documents\Cours master 1\mémoire2\résultats" 'Nom du répertoire parent
Set Fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = Fso.GetFolder(NomRep)
For Each SubFolder In SourceFolder.SubFolders
NomSousRepComplet = SubFolder.path
ParcourtSousRep (NomSousRepComplet) 'Appel la procédure de récursivité pour parcourir les sous répertoire contenu dans le dossier
Next SubFolder
Application.ScreenUpdating = True
MsgBox ("Liste terminée")
End Sub
Sub ParcourtSousRep(NomSousRepComplet As String)
Dim Fso As Object, SourceFolder As Object
Dim SubFolder As Object
Set Fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = Fso.GetFolder(NomSousRepComplet)
For Each SubFolder In SourceFolder.SubFolders
NomSousRepComplet = SubFolder.path
SelectionDonneesVariables (NomSousRepComplet)
Next SubFolder
End Sub
Excel parcourera ainsi chaque sous répertoire contenu dans chacune des conditions... (Pour info au passage, s'il y avait un niveau d'arborescence supplémentaire, il me semble qu'il suffirait de faire boucler la procédure ParcourtSousRep sur elle même.)
Je n'ai pas regardé la suite du code donc tenez moi informé si cela ne fonctionne pas... (ou si çà marche aussi d'ailleurs)
Bonne soirée,
PS: Pouvez-vous supprimer l'adresse mail dans votre précédent post, çà m'évitera de recevoir trop de spam. Merci
désolé pour l'adresse mail j'ai fait un bête copier-coller mais c'est réparé.
La macro, quant à elle, ne tourne tjs pas. Le problème c'est que je ne comprends pas exactement toutes les instructions de la macro, et elle ne me montre pas ce qu'elle fait élément par élément donc je ne peux pas essayer de corriger en conséquence. Je nage un peu en eau trouble...
La macro, quant à elle, ne tourne tjs pas. Le problème c'est que je ne comprends pas exactement toutes les instructions de la macro, et elle ne me montre pas ce qu'elle fait élément par élément donc je ne peux pas essayer de corriger en conséquence. Je nage un peu en eau trouble...
Bonjour,
Quand vous dites que la macro ne tourne pas, que voulez-vous dire ? Elle ne produit aucun résultat ou avez vous une erreur d'exécution?
J'ai retrouvé une petite erreur sur la ligne d'instruction suivante :
If LCase(Right(f1.Name, 3)) = "xlsx" Then
La partie gauche extrait les 3 derniers caractères du nom du fichier, et la partie droite contient 4 caractères. Dans notre cas, vous demandez à Excel de déterminer si "lsx" est égal à "xlsx" ce qui n'est évidemment jamais le cas.
Modifiez l'instruction de la façon suivante pour reprendre les 4 derniers caractères :
If LCase(Right(f1.Name, 4)) = "xlsx" Then
Il devrait ainsi trouver des fichiers lors de son balayage.
Si vous pouviez mettre votre fichier sur cijoint, cela faciliterait mes recherches.
Bonne journée,
Quand vous dites que la macro ne tourne pas, que voulez-vous dire ? Elle ne produit aucun résultat ou avez vous une erreur d'exécution?
J'ai retrouvé une petite erreur sur la ligne d'instruction suivante :
If LCase(Right(f1.Name, 3)) = "xlsx" Then
La partie gauche extrait les 3 derniers caractères du nom du fichier, et la partie droite contient 4 caractères. Dans notre cas, vous demandez à Excel de déterminer si "lsx" est égal à "xlsx" ce qui n'est évidemment jamais le cas.
Modifiez l'instruction de la façon suivante pour reprendre les 4 derniers caractères :
If LCase(Right(f1.Name, 4)) = "xlsx" Then
Il devrait ainsi trouver des fichiers lors de son balayage.
Si vous pouviez mettre votre fichier sur cijoint, cela faciliterait mes recherches.
Bonne journée,
Bonjour,
encore une fois vous m'enlevez une épine du pied, maintenant ça tourne impec. Est-il possible de ne copier que les valeurs des cellules dans la procédure SelectionDonneesVariables ?
Ça me permettrais de garder ma mise en page dans la feuille de destination.
Merci
encore une fois vous m'enlevez une épine du pied, maintenant ça tourne impec. Est-il possible de ne copier que les valeurs des cellules dans la procédure SelectionDonneesVariables ?
Ça me permettrais de garder ma mise en page dans la feuille de destination.
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonsoir,
Oui cela est possible en faisant un collage spécial. Je n'ai pas testé le code mais ceci devrait fonctionner :
Pour chacune des copies, à la place du code suivant :
Range("B3:C3").Select
Selection.Copy Destination:=FeuilleDestination.Range("A2:B2")
Utilisez plutôt celui-ci
Range("B3:C3").Select
Selection.Copy
FeuilleDestination.Range("A2:B2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Répetez l'opération pour chacune de vos sélections.
Bonne soirée,
Oui cela est possible en faisant un collage spécial. Je n'ai pas testé le code mais ceci devrait fonctionner :
Pour chacune des copies, à la place du code suivant :
Range("B3:C3").Select
Selection.Copy Destination:=FeuilleDestination.Range("A2:B2")
Utilisez plutôt celui-ci
Range("B3:C3").Select
Selection.Copy
FeuilleDestination.Range("A2:B2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Répetez l'opération pour chacune de vos sélections.
Bonne soirée,
Bonjour,
Il y avait effectivement une erreur dans le code que je vous ai transmis plus tôt (Excel ne retournait pas dans le classeur source pour récupérer les données à copier. J'ai corrigé ce problème, le code suivant est fonctionnel.
Sub SelectionDonneesVariables(NomSousRepComplet As String)
Dim fs, F, f1, s, sf
Dim i As Long, Fin As Long
Set FeuilleDestination = ThisWorkbook.Sheets("Traitement")
Set fs = CreateObject("Scripting.FileSystemObject")
Set F = fs.GetFolder(NomSousRepComplet)
Set sf = F.Files
For Each f1 In sf
If LCase(Right(f1.Name, 4)) = "xlsx" Then
Fichier = NomSousRepComplet & "\" & f1.Name
Workbooks.Open Filename:=Fichier
FichierSource = ActiveWorkbook.Name
Range("B3:C3").Select
Selection.Copy
FeuilleDestination.Activate
Range("A2:B2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("E6").Select
Selection.Copy
FeuilleDestination.Activate
Range("C2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("K7").Select
Selection.Copy
FeuilleDestination.Activate
Range("D2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("K4").Select
Selection.Copy
FeuilleDestination.Activate
Range("E2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("K6").Select
Selection.Copy
FeuilleDestination.Activate
Range("F2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("K5").Select
Selection.Copy
FeuilleDestination.Activate
Range("G2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
ActiveWindow.Close SaveChanges:=False
'Appel la procédure d'enregistrement
Sauv_traitement (Fichier)
End If
Next
End Sub
En revanche, n'avez vous pas un problème au niveau de la recopie des données dans vos tableaux de synthèse contenu dans l'onglet "Liste des résultats" ?
En passant, ne pourriez vous pas synthétiser vos données à l'aide d'un tableau croisé dynamique ? Celà faciliterait leur exploitation.
Bonne soirée,
Il y avait effectivement une erreur dans le code que je vous ai transmis plus tôt (Excel ne retournait pas dans le classeur source pour récupérer les données à copier. J'ai corrigé ce problème, le code suivant est fonctionnel.
Sub SelectionDonneesVariables(NomSousRepComplet As String)
Dim fs, F, f1, s, sf
Dim i As Long, Fin As Long
Set FeuilleDestination = ThisWorkbook.Sheets("Traitement")
Set fs = CreateObject("Scripting.FileSystemObject")
Set F = fs.GetFolder(NomSousRepComplet)
Set sf = F.Files
For Each f1 In sf
If LCase(Right(f1.Name, 4)) = "xlsx" Then
Fichier = NomSousRepComplet & "\" & f1.Name
Workbooks.Open Filename:=Fichier
FichierSource = ActiveWorkbook.Name
Range("B3:C3").Select
Selection.Copy
FeuilleDestination.Activate
Range("A2:B2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("E6").Select
Selection.Copy
FeuilleDestination.Activate
Range("C2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("K7").Select
Selection.Copy
FeuilleDestination.Activate
Range("D2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("K4").Select
Selection.Copy
FeuilleDestination.Activate
Range("E2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("K6").Select
Selection.Copy
FeuilleDestination.Activate
Range("F2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
Range("K5").Select
Selection.Copy
FeuilleDestination.Activate
Range("G2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Workbooks(FichierSource).Activate
ActiveWindow.Close SaveChanges:=False
'Appel la procédure d'enregistrement
Sauv_traitement (Fichier)
End If
Next
End Sub
En revanche, n'avez vous pas un problème au niveau de la recopie des données dans vos tableaux de synthèse contenu dans l'onglet "Liste des résultats" ?
En passant, ne pourriez vous pas synthétiser vos données à l'aide d'un tableau croisé dynamique ? Celà faciliterait leur exploitation.
Bonne soirée,
De rien. En ce qui concerne les tableaux croisés, leur utilisation et conception n'est pas trop compliquée (beaucoup moins que ce que nous avons fait jusqu'à présent en tout cas ;-)).
Le tout sera d'avoir une source de données "propre", c'est à dire bien ordonnée et sans "trou".
Vous pouvez y arriver à l'aide de la macro précédente légèrement réaménagé et en nommant vos plages de données.
En cas de besoin, n'hésitez pas.
Bonne journée
Le tout sera d'avoir une source de données "propre", c'est à dire bien ordonnée et sans "trou".
Vous pouvez y arriver à l'aide de la macro précédente légèrement réaménagé et en nommant vos plages de données.
En cas de besoin, n'hésitez pas.
Bonne journée