Option Explicit
Option Compare Text
Sub Main()
Application.ScreenUpdating = False
Dim F1 As Worksheet
Dim DossierRacine As String
Dim DossierCherche As String
Dim Resultats As New Collection
Dim i As Long
Dim Fso As Object ' Variable pour l'objet global
Set F1 = Worksheets(ActiveSheet.Name)
' Création de l'objet UNE SEULE FOIS pour tout le programme (Gain de vitesse)
Set Fso = CreateObject("Scripting.FileSystemObject")
DossierRacine = F1.Cells(1, 1).Value
DossierCherche = F1.Cells(20, 1).Value
' Nettoyage de la zone
F1.Range(F1.Cells(1, 2), F1.Cells(100, 2)).Clear
' Lancement de la recherche en passant l'objet Fso
Call TrouverTousLesDossiers(DossierRacine, DossierCherche, Resultats, Fso)
' --- GESTION DES RÉSULTATS AVEC LIENS ---
If Resultats.Count = 0 Then
F1.Cells(1, 2).Value = "Non trouvé"
F1.Cells(1, 2).Interior.Color = vbRed
ElseIf Resultats.Count = 1 Then
' Cas unique : Lien + Ouverture auto
F1.Hyperlinks.Add Anchor:=F1.Cells(1, 2), _
Address:=Resultats(1), _
TextToDisplay:=Resultats(1)
F1.Cells(1, 2).Interior.Color = vbGreen
Shell "explorer.exe " & Chr(34) & Resultats(1) & Chr(34), vbNormalFocus
Else
' Cas multiple : Liste + Ouverture auto du 1er
F1.Cells(1, 2).Value = "Il y a " & Resultats.Count & " dossiers identiques (cliquez pour ouvrir) :"
F1.Cells(1, 2).Interior.Color = vbYellow
F1.Cells(1, 2).Font.Bold = True
For i = 1 To Resultats.Count
F1.Hyperlinks.Add Anchor:=F1.Cells(i + 1, 2), _
Address:=Resultats(i), _
TextToDisplay:=Resultats(i)
F1.Cells(i + 1, 2).Interior.Color = RGB(220, 240, 220)
If i = 1 Then
Shell "explorer.exe " & Chr(34) & Resultats(1) & Chr(34), vbNormalFocus
End If
Next i
End If
F1.Columns("B").AutoFit
Application.ScreenUpdating = True
End Sub
' Fonction récursive optimisée
Sub TrouverTousLesDossiers(DossierPath As String, NomRecherche As String, ByRef ListeResultats As Collection, ByRef Fso As Object)
Dim Dossier As Object
Dim SousDossier As Object
On Error Resume Next
Set Dossier = Fso.GetFolder(DossierPath)
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
For Each SousDossier In Dossier.SubFolders
' Si on trouve, on ajoute à la collection (Rapide, pas de Redim)
If SousDossier.Name = NomRecherche Then
ListeResultats.Add SousDossier.Path
End If
' On continue l'exploration (Récursivité)
TrouverTousLesDossiers SousDossier.Path, NomRecherche, ListeResultats, Fso
Next SousDossier
End Sub