'Option Explicit
Sub TestFichiersRépertoireFSO()
Dim Table As Variant, tim#
Const Répertoire = "c:" ' "H:\Téléchargements"
tim = Timer
'Table = FichiersRépertoireFSO(Répertoire, , "txt")
Table = FichiersRépertoireFSO(Répertoire, , "txt")
'If not VarType(Table) = vbBoolean Then
If IsArray(Table) Then
Table = TransposeExcel(Table)
MsgBox UBound(Table) & " fichier(s) trouvé(s) dans le répertoire <" & Répertoire & "> en " & Timer - tim & " s/"
ActiveSheet.Range("A1:A" & Rows.Count).ClearContents
ActiveSheet.Range("A1").Resize(UBound(Table)).Value = Table
Else
MsgBox "Aucun fichier dans le répertoire <" & Répertoire & ">"
End If
End Sub
'---------------------------------------------------------------
'Liste des fichiers de l'arborescence complète d'un répertoire
'par la "méthode FileSystemObject"
'
'- NomRépertoire: chaine du nom du répertoire concerné
' (avec ou sans '\' final)
'- NoRecycle: True (valeur par défaut) pour ne pas avoir les
' fichiers de la poubelle dans la liste résultat
' si NomRépertoire est une lettre de lecteur (drive)
'- Extension: "Pattern" / modèle de l'extension des fichiers à
' sélectionner ("txt", "xls*" ou "" pour tous)
'- Return: table à 1 dimension des noms complets des fichiers
' ou False si aucun fichier dans le répertoire
'---------------------------------------------------------------
Function FichiersRépertoireFSO(ByVal NomRépertoire As Variant, _
Optional NoRecycle As Boolean = True, _
Optional Extension As String = "") As Variant
'Tableau résultat static pour être indépendant des appels récursifs
Static TabNomsFichiers() As String
Static NbFichiers As Long
'Variable du FileSystemObject commune à toutes les instances de la fonction
Static oFSO As Object
'Variable spécifiques à une instance de la fonction
Dim oDir As Object
Dim oSubDir As Object
Dim oFile As Object
Dim InitialCall As Boolean
Dim TakeIt As Boolean
Dim NomObjetEnErreur As String
Dim x As Variant
'Appel recursif de cette fonction (par elle-même ci-dessous)
If TypeOf NomRépertoire Is Object Then
InitialCall = False
'Valorise l'objet Folder
Set oDir = NomRépertoire
'Appel initial
Else
InitialCall = True
'Table résultat
Erase TabNomsFichiers
NbFichiers = 0
'File System Object
Set oFSO = CreateObject("Scripting.FileSystemObject")
'Complémente éventuellement le nom du répertoire avec '\'
If Right(NomRépertoire, 1) <> "\" Then NomRépertoire = NomRépertoire & "\"
'Valorise l'objet Folder
Set oDir = oFSO.GetFolder(NomRépertoire)
End If
'Si option NoRecycle et répertoire poubelle on ne traite pas
If (NoRecycle And oDir.Name = "$RECYCLE.BIN") Then Exit Function
'Si le répertoire est "System Volume Information" on ne traite pas
If oDir.Name = "System Volume Information" Then Exit Function
'Vérifie si le répertoire contient des fichiers avec l'extension
If Len(Extension) = 0 Then
TakeIt = True
Else
TakeIt = True
'La fonction Dir() introduit des erreurs #52 ou #53 sur les objets Folder
'de la boucle "For Each oSubDir In oDir.subfolders" ci-dessous.
'IL NE FAUT PAS L'UTILISER !!!
'SI SI IL FAUT L UTILISER !!!!!! :):):):)
On Error Resume Next
x = True
x = Dir(oDir.Path & "\*." & Extension) <> vbNullString
If Err.Number > 0 Or Not x Then TakeIt = False: Err.Clear: x = vbNull
End If
'On n'examine les fichiers du répertoire que s'il contient des fichiers avec l'extension
If TakeIt Then
On Error Resume Next
For Each oFile In oDir.Files
If Err.Number = 0 Then
'Test si correspondance de l'extension
If Len(Extension) = 0 Then
TakeIt = True
Else
If oFSO.GetExtensionName(oFile.Name) Like Extension Then TakeIt = True Else TakeIt = False
End If
'Stocke le nom complet du fichier en table
If TakeIt Then
NbFichiers = NbFichiers + 1
ReDim Preserve TabNomsFichiers(1 To NbFichiers)
TabNomsFichiers(NbFichiers) = oFile.Path
End If
'Fichier en erreur
Else
NomObjetEnErreur = "Fichier <"
If oFile Is Nothing _
Then NomObjetEnErreur = NomObjetEnErreur & "Nothing" & ">" _
Else NomObjetEnErreur = NomObjetEnErreur & oFile.Name & ">"
GoSub TraiteErreur
End If
Next oFile
On Error GoTo 0
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
'Appels recursifs identifiés par le type Object de l'argument OsubDir
Call FichiersRépertoireFSO(oSubDir, NoRecycle, Extension)
'Répertoire en erreur
Else
NomObjetEnErreur = "Répertoire <"
If oSubDir Is Nothing _
Then NomObjetEnErreur = NomObjetEnErreur & "Nothing" & ">" _
Else NomObjetEnErreur = NomObjetEnErreur & oSubDir.Path & ">"
GoSub TraiteErreur
End If
Next oSubDir
On Error GoTo 0
'Return value
If InitialCall Then
FichiersRépertoireFSO = False
If NbFichiers > 0 Then FichiersRépertoireFSO = TabNomsFichiers
End If
Exit Function
TraiteErreur:
'Error #70 Authorisation refusée, Error #76 Path not found, Autre erreur à identifier ?
If Not (Err.Number = 70 Or Err.Number = 76) Then
MsgBox "FichiersRépertoireFSO erreur #" & Err.Number & vbCrLf & "Sur " & NomObjetEnErreur & ""
End If
NomObjetEnErreur = ""
Err.Clear
Return
End Function
'--------------------------------------------------------------------
'Fonction de Tranpose selon la logique de WorksheetFunction.Transpose
'sauf que WorksheetFunction.Transpose se limite à 65536 éléments
'alors que cette fonction lève cette limite.
'--------------------------------------------------------------------
Function TransposeExcel(T As Variant) As Variant
Dim tt() As Variant
Dim NbDimensions As Integer
Dim i As Long
Dim j As Long
If Not IsArray(T) Then
MsgBox "Function TransposeExcel: error argument is not an array !"
Exit Function
End If
'1 ou 2 dimensions pour t ?
On Error Resume Next
i = UBound(T, 2)
If Err.Number Then NbDimensions = 1 Else NbDimensions = 2
On Error GoTo 0
'------------------------------------------------------
'Tableau origine 1 dimension
'=> Tableau destination 2 dimensions dont la 2ème est 1
'------------------------------------------------------
If NbDimensions = 1 Then
ReDim tt(LBound(T) To UBound(T), 1 To 1)
For i = LBound(T) To UBound(T)
tt(i, 1) = T(i)
Next i
End If
'----------------------------
'Tableau origine 2 dimensions
'----------------------------
If NbDimensions = 2 Then
'-----------------------------------------------
'Tableau origine 2 dimensions dont la 2ème est 1
'=> Tableau destination 1 dimension
'-----------------------------------------------
If UBound(T, 2) = 1 Then
ReDim tt(LBound(T, 1) To UBound(T, 1))
For i = LBound(T, 1) To UBound(T, 1)
tt(i) = T(i, 1)
Next i
'-------------------------------------------------
'Tableau origine 2 dimensions dont la 2ème est > 1
'=> Tableau destination 2 dimensions inversées
'-------------------------------------------------
Else
ReDim tt(LBound(T, 2) To UBound(T, 2), LBound(T, 1) To UBound(T, 1))
For i = LBound(T, 2) To UBound(T, 2)
For j = LBound(T, 1) To UBound(T, 1)
tt(i, j) = T(j, i)
Next j
Next i
End If
End If
TransposeExcel = tt
End Function