Rechercher des fichiers dans les sous repertoires
Bonjour,
J'espère que tout le monde va bien.
Je rencontre un problème pour récupérer des fichiers dans les sous-répertoires avec VBA. D'après mes recherches, il semble qu'il faille utiliser FileSystemObject, mais je ne vois pas vraiment comment m'y prendre.
Si quelqu'un avait une astuce ou un exemple de code, je lui serais éternellement reconnaissant !
Bonne journée et merci d'avance pour votre aide.
François
Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim F As String 'déclare la variable F (Fichier)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI(LIgne)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Worksheets("Base de donnée") 'définit l'onglet destination OD
Set TS = OD.ListObjects("Tableau4") 'définit le tableau structuré TS
CA = CD.Path & "\" 'définit le chemin d'accès CA
F = Dir(CA & "*.xls?") 'définit le premier fichier F ayant CA comme chemin d'accès
Do While F <> "" 'exécute tant qu'il existe des fichiers F
If F <> ThisWorkbook.Name Then 'condition : si F n'est pas le fichier destination
Set CS = Application.Workbooks.Open(CA & F) 'définit le classeur source CS en l'ouvrant
Set OS = CS.Worksheets(1) 'définit l'onglet source (ici le premier, à adapter à ton cas)
Set R = TS.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 de TS)
If R Is Nothing Or TS.ListRows.Count = 0 Then 'condition : si aucune accurrence n'est trouvée
TS.ListRows.Add 'ajoute une ligne à TS
LI = TS.ListRows.Count 'définit la ligne LI (dernière ligne de TS)
Else 'sinon
LI = R.Row - TS.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne des entête)
End If 'fin de la condition
'récupération des données de la fiche
TS.DataBodyRange(LI, 1).Value = OS.Range("B8:P9")(1, 1).Value
TS.DataBodyRange(LI, 2).Value = OS.Range("AA5:AG5")(1, 1).Value
TS.DataBodyRange(LI, 3).Value = OS.Range("AA4:AG4")(1, 1).Value
CS.Close False 'ferme la classeur source sans enregistrer
End If 'fin de la condition
F = Dir 'définit le prochain fichier F ayant CA comme chemin d'accès
Loop 'boucle
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
MsgBox "Données traitées !" 'message
End Subbonjour,
voici un exemple
Sub aargh()
Dim fs As Object, wsh As Object
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Set fs = CreateObject("scripting.filesystemobject")
Set wsh = ActiveSheet
chemin = wsh.Range("B1") & "\" 'prendre chemin en B1 sur la feuille active
i = 5 'mettre données à partir de la ligne 5
traiterepertoire wsh, fs, chemin, i ' traiter les fichiers du répertoire
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
Sub traiterepertoire(wsh_result As Object, fs As Object, chemin, ByRef i)
Set rep = fs.getfolder(chemin)
For Each Fichier In rep.Files 'on traite les fichiers du répertoire
If Fichier Like "*.xls*" Then ' fichier excel
Set wkb_source = Workbooks.Open(Fichier)
wsh_result.Cells(i, 1) = ActiveWorkbook.Name
wsh_result.Cells(i, 2) = wkb_source.Sheets("feuil1").[K4]
wsh_result.Cells(i, 3) = wkb_source.Sheets("feuil2").[K5]
wsh_result.Cells(i, 4) = wkb_source.Sheets("feuil3").[D38]
i = i + 1
wkb_source.Close
End If
Next
For Each sousrep In rep.subFolders 'on traite chacun des sous-répertoires trouvés dans ce répertoire
traiterepertoire wsh_result, fs, sousrep, i
Next
End SubMerci pour la réponse !!
malheureusement permission refusée comme résultat :(
malheureusement permission refusée comme résultat :(
Quel est le chemin (répertoire de départ) que tu as indiqué ? tu peux recevoir ce message si la macro essaie d'accéder à un fichier qui est déjà ouvert (par exemple le fichier qui contient la macro).
tu peux essayer de modifier cette instruction
Set wkb_source = Workbooks.Open(Fichier)ainsi
Set wkb_source = Workbooks.Open(Fichier, ReadOnly:=True)Merci pour les conseils je vais regarder.
En faites, l'idée c'était justement de ne pas indiquer de chemin de départ, pour partir de l'emplacement du fichier
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Je pense qu'il faut exclure dans la recherche, les répertoires système.
Essayer ce code :
Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim FSO As Object
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CD = ThisWorkbook 'définit le classeur destination CD
Set TS = [Tableau4].ListObject 'définit le tableau structuré TS
Set FSO = CreateObject("Scripting.FileSystemObject") 'Liaison tardive de la classe FileSystemObject
CA = CD.Path & "\" 'définit le chemin d'accès CA
rech_fichiers FSO, FSO.GetFolder(CA), TS
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
MsgBox "Données traitées !" 'message
End Sub
Sub rech_fichiers(ByVal FSO As Object, ByVal dossier As Object, ByVal TS As ListObject)
Dim sous_dossier As Object, fichier As Object
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI(LIgne)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
'récupération fichier
For Each fichier In dossier.Files
If Not fichier.Name Like "*" & ThisWorkbook.Name _
And FSO.GetExtensionName(fichier.Path) Like "*xls*" Then 'condition : si fichier n'est pas le fichier destination et est un classeur Excel
Set CS = Application.Workbooks.Open(fichier.Path) 'définit le classeur source CS en l'ouvrant
Set OS = CS.Worksheets(1) 'définit l'onglet source (ici le premier, à adapter à ton cas)
Set R = TS.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 de TS)
If R Is Nothing Or TS.ListRows.Count = 0 Then 'condition : si aucune occurrence n'est trouvée
TS.ListRows.Add 'ajoute une ligne à TS
LI = TS.ListRows.Count 'définit la ligne LI (dernière ligne de TS)
Else 'sinon
LI = R.Row - TS.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne des entête)
End If 'fin de la condition
'récupération des données de la fiche
TS.DataBodyRange(LI, 1).Value = OS.Range("B8:P9")(1, 1).Value
TS.DataBodyRange(LI, 2).Value = OS.Range("AA5:AG5")(1, 1).Value
TS.DataBodyRange(LI, 3).Value = OS.Range("AA4:AG4")(1, 1).Value
CS.Close False 'ferme la classeur source sans enregistrer
End If 'fin de la condition
Next
'boucle récursive pour sous-dossiers
For Each sous_dossier In dossier.SubFolders
IF sous_dossier.Attributes <> vbDirectory + vbSystem + vbHidden Then rech_fichiers FSO, sous_dossier, TS
Next
End Sub