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
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:


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

7 réponses

Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
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
0
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
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...
0
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
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,
0
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
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
0

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 142
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,
0
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
bonjour,
j'ai essayé mais ça ne marche pas.
Merci quand même.
0
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
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.
0
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
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
0
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
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,
0
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
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.
0
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
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
0