Option Explicit
'patricktoulon dir fichier fonction récursive
Sub testDIR()
Dim tim#, t
tim = Timer
t = DirList("h:\")
If IsArray(t) Then
MsgBox Timer - tim & " secondes pour " & UBound(t) & " fichier(s)"
[A1].Resize(UBound(t)) = Application.Transpose(t)
Else
MsgBox "pas de fichier"
End If
End Sub
Function DirList(Dossier As String, Optional recall As Boolean = False) As Variant
Dim ItemVu As String, SubFolderCollection As New Collection, i As Long, a As Long, q As Long, criteres, arr1, arr2, subdossier
Static tbl$() 'tbl est désormais statique il ne se balade plus dans les appels récursifs
arr1 = Array("a~", "a`", "a^", "a¨", "e`", "e^", "e¨", "i`", "i^", "i¨", "o~", "o`", "o^", "o¨", "u`", "u^", "u¨") 'array caracteres séparés
arr2 = Array("ã", "à", "â", "ä", "è", "ê", "ë", "ì", "î", "ï", "õ", "ò", "ô", "ö", "ù", "û", "ü") 'array caracteres regroupés
If recall = False Then ReDim tbl(1 To 1) ' si recall on redim un tableau de zero item (pour la creation du tableau)
criteres = vbDirectory Or vbSystem Or vbHidden ' Or vbArchive Or ReadOnly Or vbNormal
On Error Resume Next 'gestion des fichiers dossiers system et interdit ou generant une erreur(PerLog,recycle,etc..)
ItemVu = Dir(Dossier, criteres)
If Error.Number = 0 Then ' si pas d'erreur on examine le contenu
'examen du dossier courrant
Do While ItemVu <> vbNullString 'boucle tant que DIR renvoie une chaine
If ItemVu <> "." And ItemVu <> ".." Then
On Error Resume Next
If (GetAttr(Dossier & ItemVu) And vbDirectory) = vbDirectory Then 'test Dossier
If Err.Number > 0 Then 'si erreur c'est un fichier(particulier ou caractères particulier)
For q = 0 To UBound(arr1): ItemVu = Replace(Replace(ItemVu, arr1(q), arr2(q)), UCase(arr1(q)), UCase(arr2(q))): Next 'replace caracteres
ReDim Preserve tbl(1 To a): tbl(a) = Dossier & ItemVu: a = UBound(tbl) + 1 'ajout dans la liste
Else: SubFolderCollection.Add Dossier & ItemVu: Err.Clear 'sinon ajout dans la collection de dossier
End If
Else'sinon c'est un fichier et pas un concombre:)
a = UBound(tbl) + 1: ReDim Preserve tbl(1 To a): tbl(a) = Dossier & ItemVu 'ajout fichier dans la liste
End If
End If
ItemVu = Dir()
Loop
Else
Err.Clear
End If
'examen des sub dossier appel récursif
For Each subdossier In SubFolderCollection
DirList subdossier & "\", True
Next subdossier
DirList = False
If SubFolderCollection.Count > 0 Then DirList = tbl ' return du tableau (après le dernier appel récursif )'économie de 0.3000 secondes
End Function