'*****************************************************************************************************
' ___ _ _______ __ _ ____ _ _ _______ ___ _ _ _ ___ _ _.
' // \\ /\\ // // \\ // // // // // // \\ // // // // \\ //| //
' //___// //__\ // //__// // // //__// // // // // // // // // // | //
' // // \\ // // \\ // // // \\ // // // // // // // // // | //
'// // // // // // // //___ // \\ // \\__// //__// //___ \\__// // |//
'****************************************************************************************************
'Fonction de listage de dossier dans une récursivité alternative (intra fonction)avec critères utilisant LA FONCTION DIR DE VBA
'-------------------------------------------------------------
'basée sur le même raisonnement que la DirPileListDIR(patricktoulon)
'------------------------------------------------------------
'Auteur: Patricktoulon
'Version DIR Alternative 1.2
'Méthode que j'ai appelé methode Pile :):)(Lecture de la pile de dossier rempli dynamiquement dans ses propres tours dans la collection)
'Date version : 15/03/2026
'Cette fonction utilise une alternative aux appels récursifs d'une fonction
'En effet dans celle ci la recursivité se fait par le do/loop dans le parcours la collection de folder
'Que je rempli tout au long des tours de boucle sur collection tout en supprimant le premier (le dossier en examen) a chaque tours
'Une alternative interessante a la recursivité classique utilisée en vba(Par rappel successifs de la fonction elle même)
'On a pas besoin de Variables statiques ou variables transportée a chaque tours
'On peu considérer que la encore diviser pour mieux règner reste un dogme qui se verifie
'Puisque chaque tour de do/loop supprime le dossier passé en revue et chaque tours passe en revvue seulement ses sous dossiers
'------------------------------------------------------------------------------------------------
'Un seul inconvénient ici c'est que les dossiers de sont pas classé dans l'ordre
'Il faut faire un tri (voir mes méthodes de tri le quicksort dans les ressources )
'------------------------------------------------------------------------------------------------
'Exemple d'utilisation
' 1° Liste complete de l'arborescence des dossiers
' x= DirPileFolderListDIR(chemin du dossier maitre)
'
' 2° Récuperation du chemin complet avec le nom du dossier
' Folder = DirPileFolderListDIR("chemin dossier maitre", "nom du dossier recherché")
'
' 3° Récuperation du chemin complet avec une partie du nom du dossier
' Folder = DirPileFolderListDIR("chemin dossier maitre", "partie nom du dossier recherché")
'------------------------------------------------------------------------------------------------
Option Explicit
Sub testList()
'Test de récupération complete de la liste des dossier (et leurs sous dossiers)
Dim ListeFolder
ListeFolder = DirPileFolderListDIR("K:\vba excel\001 application")
If IsArray(ListeFolder) Then
Cells(1, 1).Resize(UBound(ListeFolder), 1) = Application.Transpose(ListeFolder)
End If
End Sub
Sub cherche_un_dossier1()
'Test de récupération d'un dossier en particulier par son nom
Dim Folder
Folder = DirPileFolderListDIR("K:\vba excel\001 application", "creatorribbonx IMAGEMSO 2025 V 5 3")
If Folder <> "" Then MsgBox Folder
End Sub
Sub cherche_un_dossier2()
'Test de récupération d'un dossier en particulier avec une partie de son nom
Dim Folder
Folder = DirPileFolderListDIR("K:\vba excel\001 application", "IMAGEMSO 2025 V 5 3", True)
If Folder <> "" Then MsgBox Folder
End Sub
Function DirPileFolderListDIR(dossier As String, Optional ShearchFolder As String = vbNullString, Optional part As Boolean = False)
Dim ItemVU As String, Foldercollection As Collection, CurrentFolder As String, TbL, a As Long, Critere As Long, NameNonConformes As New Collection
Set Foldercollection = New Collection
ReDim TbL(0) ' Initialisation du tableau
' S'assurer que le dossier a un backslash final
If Right(dossier, 1) <> "\" Then dossier = dossier & "\"
' Ajout du dossier initial dans la pile de dossiers(FolderCollection)
Foldercollection.Add dossier
' Parcours de la pile de dossiers
Do While Foldercollection.Count > 0
'le dossier à explorer c'est toujours le premier de la collection
CurrentFolder = Foldercollection(1)
'on a determiné currentfolder on peut le supprimer de la pile
' on supprime donc le (1)
Foldercollection.Remove 1
'on intègre le dossier dans l'array
a = UBound(TbL) + 1: ReDim Preserve TbL(1 To a): TbL(a) = CurrentFolder
' Gestion des erreurs pour ignorer les dossiers système ou protégés
On Error Resume Next
'on fait un dir vbdirectory pour chopper dossiers et fichier
ItemVU = Dir(CurrentFolder, vbDirectory)
' Si erreur, on saute ce dossier
If Err.Number <> 0 Then Err.Clear: GoTo NextFolder
'si itemVu donne un premier path alors on decante ce DIR
'Parcourir les dossiers dans le dossier actuel
Do Until ItemVU = vbNullString
If Left(ItemVU, 1) <> "." Then
If (GetAttr(CurrentFolder & "\" & ItemVU) And vbDirectory) = vbDirectory Then
If ShearchFolder <> vbNullString And part = False Then If ItemVU = ShearchFolder Then DirPileFolderListDIR = CurrentFolder & ItemVU: Exit Function
If ShearchFolder <> vbNullString And part = True Then If ItemVU Like "*" & ShearchFolder & "*" Then DirPileFolderListDIR = CurrentFolder & ItemVU: Exit Function
' Ajouter les sous-dossiers à la pile de dossiers
Foldercollection.Add CurrentFolder & ItemVU & "\"
End If
End If
ItemVU = Dir()
Loop
NextFolder:
Loop
On Error GoTo 0
' Retourner le tableau des fichiers
If ShearchFolder = vbNullString Then DirPileFolderListDIR = TbL
If NameNonConformes.Count > 0 Then
Debug.Print "Dossiers avec erreurs: " & NameNonConformes.Count
End If
End Function