'**************************************************************
'fonction récursive pour lister les fichiers d'un disque ou dossier
'Utilisation de filesystemobject(FSO)
'auteur: Dudu2 sur exceldownload
'Date:07/02/2021
'Modifiée par patricktoulon le 08/02/2021
'accélération du processus
'en ajoutant du test dir non bloquant pour zapper les dossiers
'ne contenant pas de fichier avec l'extension ou la partie du nom demandée
'mise en place du principe (Part name) valable aussi pour (si juste extension demandée:ex;[*.XXX])
'suppression du stockage des erreurs et des msgbox d'erreur
'suppression commentaires
'utilisation d'une fonction de transposition de l'array simplifiée (horizontal(1 dim) To vertical(2 dim))
'****************************************************************
Option Explicit
Option Compare Text
Sub TestListFichierFso()
Dim Table As Variant, tim#: Const Répertoire = "c:\": tim = Timer
ActiveSheet.Range("A1:A" & Rows.Count).ClearContents
Table = FSO_List_FICHIERS(Répertoire, "*.txt")
If IsArray(Table) Then
Table = TransposeArray(Table)
MsgBox UBound(Table) & " fichier(s) trouvé(s) dans le répertoire <" & Répertoire & "> en " & Timer - tim & " s/"
ActiveSheet.Range("A1").Resize(UBound(Table)).Value = Table
Else
MsgBox "Aucun fichier dans le répertoire <" & Répertoire & ">"
End If
End Sub
Function FSO_List_FICHIERS(ByVal NomRépertoire As Variant, Optional PartName As String = "") As Variant
'Tableau résultat static pour être indépendant des appels récursifs
Static TabNomsFichiers() As String: Static NbFichiers As Long: Static oFSO As Object
Dim oDir As Object, oSubDir As Object, oFile As Object, InitialCall As Boolean, TakeIT As Boolean
If TypeOf NomRépertoire Is Object Then
InitialCall = False
Set oDir = NomRépertoire 'Valorise l'objet Folder
Else 'si Appel initial
InitialCall = True
Erase TabNomsFichiers 'Table résultat
NbFichiers = 0
Set oFSO = CreateObject("Scripting.FileSystemObject") 'File System Object
If Right(NomRépertoire, 1) <> "\" Then NomRépertoire = NomRépertoire & "\" 'Complémente éventuellement le nom du répertoire avec '\'
Set oDir = oFSO.GetFolder(NomRépertoire) 'Valorise l'objet Folder
End If
'Si op répertoire poubelle on ne traite pas\\\\
'pour une liste complete :16 secondes perdues sur C avec 234000 ////4 secondes perdues sur h avec 4593 fichiers
'If oDir.Name = "$RECYCLE.BIN" Or oDir.Name = "System Volume Information" Then Exit Function
'Vérifie si le répertoire contient au moins un fichier contenat lePartName dans son nom
'On Error Resume Next
If Len(PartName) = 0 Then TakeIT = True Else TakeIT = True: TakeIT = Len(Dir(oDir.Path & "\" & PartName)) > 0
If Err.Number <> 0 Then TakeIT = True: On Error GoTo 0
'On n'examine les fichiers du répertoire que s'il contient des fichiers avec le PartName donc TakeIt =true
If TakeIT Then
On Error Resume Next
For Each oFile In oDir.Files
If Err.Number = 0 Then
If Len(PartName) = 0 Then TakeIT = True Else If oFile.Name Like PartName Then TakeIT = True Else TakeIT = False
If TakeIT Then NbFichiers = NbFichiers + 1: ReDim Preserve TabNomsFichiers(1 To NbFichiers): TabNomsFichiers(NbFichiers) = oFile.Path 'Stocke le nom complet du fichier en table
Err.Clear 'Fichier en erreur ou examen du dossierinterdit
End If
Next oFile
End If
'Parcours des sous-répertoires du répertoire en cours
'On Error Resume Next
For Each oSubDir In oDir.subfolders
If Err.Number = 0 Then
Call FSO_List_FICHIERS(oSubDir, PartName) 'Appels recursifs identifiés par le type Object de l'argument OsubDir
Err.Clear 'dossier en erreur ou examen du dossier interdit
End If
Next oSubDir
On Error GoTo 0
'Return value
If InitialCall Then
FSO_List_FICHIERS = False
If NbFichiers > 0 Then FSO_List_FICHIERS = TabNomsFichiers
End If
End Function
Function TransposeArray(arr)
Dim tbl(), I&: ReDim tbl(LBound(arr) To UBound(arr), 1 To 1)
For I = LBound(arr) To UBound(arr): tbl(I, 1) = arr(I): Next
TransposeArray = tbl
End Function