Macro copie de données de différents dossiers
Fermé
Dim83
Messages postés
18
Date d'inscription
samedi 21 mai 2011
Statut
Membre
Dernière intervention
28 mai 2011
-
Modifié par Dim83 le 24/05/2011 à 00:31
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 - 28 mai 2011 à 12:48
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 - 28 mai 2011 à 12:48
A voir également:
- Macro copie de données de différents dossiers
- Copie cachée - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Copie écran samsung - Guide
- Macro word - Guide
- Reinstaller windows sans perte de données - Guide
7 réponses
Syzygy
Messages postés
378
Date d'inscription
vendredi 29 avril 2011
Statut
Membre
Dernière intervention
31 décembre 2011
143
24 mai 2011 à 00:04
24 mai 2011 à 00:04
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
Dim83
Messages postés
18
Date d'inscription
samedi 21 mai 2011
Statut
Membre
Dernière intervention
28 mai 2011
24 mai 2011 à 00:50
24 mai 2011 à 00:50
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...
Syzygy
Messages postés
378
Date d'inscription
vendredi 29 avril 2011
Statut
Membre
Dernière intervention
31 décembre 2011
143
24 mai 2011 à 07:41
24 mai 2011 à 07:41
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,
Dim83
Messages postés
18
Date d'inscription
samedi 21 mai 2011
Statut
Membre
Dernière intervention
28 mai 2011
25 mai 2011 à 18:37
25 mai 2011 à 18:37
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
Syzygy
Messages postés
378
Date d'inscription
vendredi 29 avril 2011
Statut
Membre
Dernière intervention
31 décembre 2011
143
25 mai 2011 à 23:08
25 mai 2011 à 23:08
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,
Dim83
Messages postés
18
Date d'inscription
samedi 21 mai 2011
Statut
Membre
Dernière intervention
28 mai 2011
26 mai 2011 à 03:19
26 mai 2011 à 03:19
bonjour,
j'ai essayé mais ça ne marche pas.
Merci quand même.
j'ai essayé mais ça ne marche pas.
Merci quand même.
Syzygy
Messages postés
378
Date d'inscription
vendredi 29 avril 2011
Statut
Membre
Dernière intervention
31 décembre 2011
143
26 mai 2011 à 22:24
26 mai 2011 à 22:24
Bonjour,
Qu'est-ce qui ne marche pas? La copie où est-ce le format qui se perd ? Si vous pouviez me transmettre le fichier sur cijoint, cela serait plus simple pour vous aider.
Qu'est-ce qui ne marche pas? La copie où est-ce le format qui se perd ? Si vous pouviez me transmettre le fichier sur cijoint, cela serait plus simple pour vous aider.
Dim83
Messages postés
18
Date d'inscription
samedi 21 mai 2011
Statut
Membre
Dernière intervention
28 mai 2011
27 mai 2011 à 10:35
27 mai 2011 à 10:35
bonjour, c'est la copie qui ne marche pas. J'ai mis le fichier ici :http://www.cijoint.fr/cjlink.php?file=cj201105/cijLXXiE7H.xlsm
Merci
Merci
Syzygy
Messages postés
378
Date d'inscription
vendredi 29 avril 2011
Statut
Membre
Dernière intervention
31 décembre 2011
143
27 mai 2011 à 23:54
27 mai 2011 à 23:54
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,
Dim83
Messages postés
18
Date d'inscription
samedi 21 mai 2011
Statut
Membre
Dernière intervention
28 mai 2011
28 mai 2011 à 11:15
28 mai 2011 à 11:15
Merci, pour ce qui est des tableaux croisés dynamiques, je n'ai jamais appris à m'en servir et je ne sais pas comment ça marche. Mais peut-être est-ce effectivement la solution, je vais essayer de me documenter dessus. Merci encore.
Syzygy
Messages postés
378
Date d'inscription
vendredi 29 avril 2011
Statut
Membre
Dernière intervention
31 décembre 2011
143
28 mai 2011 à 12:48
28 mai 2011 à 12:48
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