Macro copie de données de différents dossiers

Dim83 Messages postés 19 Statut Membre -  
Syzygy Messages postés 404 Statut Membre -
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. Syzygy Messages postés 404 Statut Membre 147
     
    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
  2. Dim83 Messages postés 19 Statut Membre
     
    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
  3. Syzygy Messages postés 404 Statut Membre 147
     
    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
  4. Dim83 Messages postés 19 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Syzygy Messages postés 404 Statut Membre 147
     
    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
  7. Dim83 Messages postés 19 Statut Membre
     
    bonjour,
    j'ai essayé mais ça ne marche pas.
    Merci quand même.
    0
    1. Syzygy Messages postés 404 Statut Membre 147
       
      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. Dim83 Messages postés 19 Statut Membre
       
      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
  8. Syzygy Messages postés 404 Statut Membre 147
     
    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. Dim83 Messages postés 19 Statut Membre
       
      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. Syzygy Messages postés 404 Statut Membre 147
       
      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