'**************************************************************
'fonction récursive pour lister les fichiers d'un disque ou dossier
'Utilisation de filesystemobject(FSO)
'sur la base de la version de Dudu2 sur exceldownload
'Modifiée par patricktoulon
''version 1.5
'Date:08/02/2021
'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))
'Date: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
'Date:13/02/2021
'remplacement du test if takeit par un jumping (etiquette "ScanFolder")
'pour jumper directement sur la boucle des dossiers on zappe directement la partie du code boucle ofile
'****************************************************************
Option Explicit
Option Compare Text
Dim Appelcount
Dim countdoss
'
Sub listeFSO0x()
Dim Table As Variant, tim
ActiveSheet.Range("A1:A" & Rows.Count).ClearContents
Const Répertoire = "c:\": tim = Timer
Const Ext$ = "*.txt"
Appelcount = 0 '
countdoss = 0
Table = FSO_List_FICHIERS2(Répertoire, Ext)
If IsArray(Table) Then
Table = TransposeArray(Table)
tim = Format(Timer - tim, "#0.000 S")
MsgBox UBound(Table) & " fichier(s)<""" & Ext & """> trouvé(s) dans le répertoire <" & Répertoire & "> en " & tim & " s/" & _
vbCrLf & "pour " & Appelcount & " appels de la fonction sur dossier et " & countdoss & " dossiers seulement en contiennent "
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_FICHIERS2(ByVal NomRépertoire As Variant, Optional PartName As String = "") As Variant
Static tbl() As String: Static NbFichiers As Long: Static oFSO As Object
Appelcount = Appelcount + 1
countdoss = countdoss + 1
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
Else
InitialCall = True
Erase tbl
NbFichiers = 0
Set oFSO = CreateObject("Scripting.FileSystemObject")
If Right(NomRépertoire, 1) <> "\" Then NomRépertoire = NomRépertoire & "\"
Set oDir = oFSO.getfolder(NomRépertoire)
End If
TakeIT = True
On Error Resume Next
TakeIT = Len(Dir(oDir.Path & "\" & PartName)) > 0
If Err.Number <> 0 Or TakeIT = False Then Err.Clear: countdoss = countdoss - 1: GoSub Scanfolder
For Each oFile In oDir.Files
If Err.Number = 0 Then
If Len(PartName) = 0 Then
NbFichiers = NbFichiers + 1: ReDim Preserve tbl(1 To NbFichiers): tbl(NbFichiers) = oFile.Path
Else
If oFile.Name Like PartName Then NbFichiers = NbFichiers + 1: ReDim Preserve tbl(1 To NbFichiers): tbl(NbFichiers) = oFile.Path 'Stocke le nom complet du fichier en table
End If
End If
Err.Clear
Next oFile
On Error GoTo 0
Scanfolder:
For Each oSubDir In oDir.subfolders
If Err.Number = 0 Then
FSO_List_FICHIERS2 oSubDir, PartName
Else: Err.Clear
End If
Next oSubDir
On Error GoTo 0
If InitialCall Then
FSO_List_FICHIERS2 = False
If NbFichiers > 0 Then FSO_List_FICHIERS2 = tbl
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