Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Equivalent de .Filesearch pour recherche de dossiers

  • Initiateur de la discussion Initiateur de la discussion pedrag31
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pedrag31

XLDnaute Occasionnel
Bonjour a tous, Bonjour le forum XLD,

Je travaille actuellement sur un AddIn Excel pour aider mes collegues de bureau a acceder facilement et rapidement depuis Excel a nos donnees articles, stockees dans un enorme repertoire reseau (plus de 10000 sous repertoires-article 🙄).

Je recherche donc le code VBA equivalent de la fonction Application.Filesearch pour faire des recherches sur les noms de dossiers uniquement... Foldersearch? 🙂
L'idee serait de pourvoir trouver, lister et manipuler avec ce code (comme avec .Foundfiles) tous les sous-dossiers d'un repertoire dont le nom contient une chaine de caractere donnee (*Nomdossier*).

J'aurais juste besoin de quelques lignes de code ou d'un exemple concret ou meme d'un petit site internet ou je pourrais trouver cela...

Merci d'avance pour vos precieuses indications!

Bonne journee 🙂
 
Re : Equivalent de .Filesearch pour recherche de dossiers

Bonjour le fil 🙂,
Un essai en PJ. Le chemin est à mettre en A1 😛.
Attention, sensible à la casse 🙄...
Se déclenche au bout de 4 caractères 😉.
Bon dimanche 😎
 

Pièces jointes

Re : Equivalent de .Filesearch pour recherche de dossiers

Bonsoir 🙂,
Une V2 avec case indiférente et affichage du chemin si clic sur dossier souhaité 😛...
Bonne soirée 😎
Ajout : Je viens de recharger le fichier, il y avait une duplication des résultats
 

Pièces jointes

Dernière édition:
Re : Equivalent de .Filesearch pour recherche de dossiers

Bonjour Kjin, Hippolite, JNP, Le forum XLD,

Tous d'abord un grand MERCI a vous tous pour vos réponses immédiates et diverses.😀

Suite a la réponse de Kjin, j'ai commencé a travailler sur le code proposé par PierreJean avec une sorte de "Dir" récursif...

J’étudie également la solution élégante suggérée par Kjin et JNP avec le FileSystemObject que je n'avais jamais pratiqué auparavant... Au fait, merci bcp pour le fichier exemple, ça aide énormément pour s'y mettre!

Toutes ces solutions fonctionnent très bien!

J'ai actuellement des temps de réponses assez longs étant donnés la taille du répertoire et du nombre important de sous-dossiers. Je joue avec les "Timer" pour faire un comparatif du temps de réponse de ces solutions et reviendrai surement vers vous pour vous demander conseil a ce sujet.

Je garde également au chaud le lien vers le complément FileSearch pour Excel 2007, je suis a l'abri pour le moment, nous travaillons encore sous 2003 mais le jour ou nous passerons a une version plus récente, va falloir reprendre un paquet de macros et ce code sera le bienvenu...

A très vite!

Bonne journée! 🙂
 
Re : Equivalent de .Filesearch pour recherche de dossiers

Bonjour Kjin, Hippolite, JNP, Le forum XLD,

Grâce a vos réponses, j'ai deux solutions qui fonctionnent bien. Merci beaucoup pour votre aide. Il faut maintenant optimiser le tout et je vais de nouveau avoir besoin de votre aide...🙄

Je viens de finir mes tests avec les fonctions FileSystemObject et la commande Dir. Voir pièce jointe pour le fichier pour tests de temps de réponse. Toutes vos remarques sur les optimisations et améliorations possibles seront les bienvenues!🙂

Note: J'ai enlevé la récursivité des fonctions pour ne travailler que sur les sous-dossiers de niveau 1 afin d'améliorer les temps de réponse.

Sur notre répertoire Articles de 6500 dossiers, j'ai des temps de reponse assez longs; de l'ordre de la minute avec FileSystemObject et de 10s pour la commande Dir.

  • Voyez-vous une façon d’améliorer ces temps de réponse?
  • Est-ce que j'oublie qqch. (paramètre, Application.ScreeUpdating=False, etc...)?
  • Est-ce que si j’intègre mon tri / ma sélection (Exple: ne sélectionner que les dossiers du type "E*") directement dans les fonctions FSO et DIR me permettra d'améliorer mes temps de réponse?
  • Comment peut-on expliquer qu'en comparaison, une simple recherche avec l'Explorateur Windows XP sur notre répertoire Articles puisse me lister tous les dossiers de type "E*" en moins de 1 ou 2 s?
  • Alternative possible mais je n'y crois pas trop : Peut-on appeler une recherche Explorateur Windows XP avec VBA? Dans le genre
    Code:
    Shell "Explorer.exe /n,/Search, "E*",...

Je vous remercie par avance pour vos conseils et recommandations.

Une très bonne journée a tous! 🙂
 

Pièces jointes

Dernière édition:
Re : Equivalent de .Filesearch pour recherche de dossiers

Salut,voir sur Directory Tree Listings , Quick Folder Tree In Excel , Browse For Folder et adapter

Sinon j'ai cela mais là aussi il faudra adapter,je n'ai plus l'origine de ce fichier,peut-être sur le site donné plus haut , affecter un bouton à SelDossierRacine la feuille recevant les données à le CodeName ShDatas
0.5s pour trouver 3396 fichiers xls parmi 15972 dans 1260 dossiers , donc à voir
Code:
Option Explicit

Private Const RDepart = 5
Private Const vbDot = 46
Private Const MAX_PATH As Long = 260
Private Const INVALID_HANDLE_VALUE = -1
Private Const vbBackslash = "\"
Private Const ALL_FILES = "*.*"

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type

Private Type FILE_PARAMS
    bRecurse As Boolean
    bFindOrExclude As Long
    nCount As Long
    nSearched As Long
    sFileNameExt As String
    sFileRoot As String
End Type

Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Private Declare Function FindFirstFile Lib "kernel32" _
                                       Alias "FindFirstFileA" _
                                       (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" _
                                      Alias "FindNextFileA" _
                                      (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
Private Declare Function PathMatchSpec Lib "shlwapi" _
                                       Alias "PathMatchSpecW" _
                                       (ByVal pszFileParam As Long, ByVal pszSpec As Long) As Long

Private fp As FILE_PARAMS

Private Declare Function QueryPerformanceCounter Lib "kernel32" (x As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (x As Currency) As Boolean

Sub SelDossierRacine()
Dim sChemin As String
    sChemin = ThisWorkbook.Path
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = sChemin & "\"
        .Title = "Sélectionner le Dossier Racine"
        .AllowMultiSelect = False
        .InitialView = msoFileDialogViewDetails
        .ButtonName = "Sélection Dossier"
        .Show
        If .SelectedItems.Count > 0 Then Rch .SelectedItems(1)
    End With
End Sub

Private Sub Rch(sRacine As String)
Dim Debut As Currency, Fin As Currency, Freq As Currency

    With ShDatas
        .Cells.Clear
        .Cells(1, 1) = sRacine
        
        .Cells(2, 1) = "*.xls"
        
        .Cells(3, 1) = ""
        .Cells(4, 1) = ""
        .Cells(5, 1) = ""
        .Range("B:B").Clear
    End With
    
    ActiveWindow.ScrollRow = 1
    ActiveWindow.ScrollColumn = 1
    
    Application.ScreenUpdating = False
    With fp
        '   start path
        .sFileRoot = QualifyPath(ShDatas.Cells(1, 1))
        '   file type(s) of interest
        .sFileNameExt = ShDatas.Cells(2, 1)
        .bRecurse = True
        .nCount = 0
        .nSearched = 0

        '   0=include, 1=exclude
        .bFindOrExclude = 1
    End With

    QueryPerformanceCounter Debut
    SearchForFiles fp.sFileRoot
    QueryPerformanceCounter Fin
    QueryPerformanceFrequency Freq

    With ShDatas
        .Cells(3, 1) = Format$(fp.nSearched, "###,###,###,##0")
        .Cells(4, 1) = Format$(fp.nCount, "###,###,###,##0")
        .Cells(5, 1) = FormatNumber((Fin - Debut) / Freq, 5) & " s"
        
        .Range("A1:A5").HorizontalAlignment = xlLeft
    End With
    
    Application.ScreenUpdating = True
End Sub

Private Sub SearchForFiles(sRoot As String)
Dim WFD As WIN32_FIND_DATA
Dim hFile As Long
    hFile = FindFirstFile(sRoot & ALL_FILES, WFD)
    If hFile <> INVALID_HANDLE_VALUE Then
        Do
            '   if a folder, and recurse specified, call method again
            If (WFD.dwFileAttributes And vbDirectory) Then
                If Asc(WFD.cFileName) <> vbDot Then
                    If fp.bRecurse Then SearchForFiles sRoot & TrimNull(WFD.cFileName) & vbBackslash
                End If
            Else
                '   must be a file ..
                If MatchSpec(WFD.cFileName, fp.sFileNameExt) Then
                    fp.nCount = fp.nCount + 1
                    ShDatas.Cells(fp.nCount + RDepart, 2) = sRoot & TrimNull(WFD.cFileName)
                End If
            End If
            fp.nSearched = fp.nSearched + 1
        Loop While FindNextFile(hFile, WFD)
    End If
    FindClose hFile
End Sub

Private Function QualifyPath(sPath As String) As String
    If Right$(sPath, 1) <> vbBackslash Then
        QualifyPath = sPath & vbBackslash
    Else
        QualifyPath = sPath
    End If
End Function

Private Function TrimNull(startstr As String) As String
    TrimNull = Left$(startstr, lstrlen(StrPtr(startstr)))
End Function

Private Function MatchSpec(sFile As String, sSpec As String) As Boolean
    MatchSpec = PathMatchSpec(StrPtr(sFile), StrPtr(sSpec)) = fp.bFindOrExclude
End Function
 
Re : Equivalent de .Filesearch pour recherche de dossiers

Bonjour Kiki29, Kjin, Hippolite, JNP, Le forum XLD,

Kiki29,

Un grand MERCI pour ton code supersonique!

Je suis littéralement époustouflé de la vitesse de ton code qui trouve sur notre répertoire Articles de 6500 dossiers, 2099 fichiers Excel en a peine 11s !!! 😀😀😀
Chapeau!

Je vais essayer d'adapter ton code pour ne rechercher que les noms de dossiers de niveau 1. Si c'est faisable, je pense que ton code sera de loin le plus rapide... J’étudie cela dans les jours qui viennent et poste un fichier si ça fonctionne.

Bonne journée! 🙂
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…