Macro copie de données de différents dossiers

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

  1. 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
    1. 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
      1. 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
        1. 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
          1. 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
            1. bonjour,
              j'ai essayé mais ça ne marche pas.
              Merci quand même.
              0
              1. 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
              2. 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
            2. 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
              1. 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
              2. 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