VBA et Windows Desktop Search...

pedrag31

XLDnaute Occasionnel
[Résolu] - VBA et Windows Desktop Search...

Bonjour le forum XLD,

Je recherche des fichiers sur mon réseau professionnel avec la commande Application.FileSearch dans un répertoire contenant une arborescence de près de 12000 dossiers... La recherche d'un fichier prend souvent entre 1 et 2 minutes...:(

J'ai parcouru plusieurs sites a la recherche d'une solution afin d'accélérer cette recherche. Il semble que l'outil d'indexage de fichiers "Windows Desktop Search" soit une solution efficace... Article sur WDS - Documentation
Mais je ne connais pas du tout, malheureusement...:confused:

Est-ce que certains d'entre vous connaissent cet outil?
Savez-vous comment intègre-t-on "WDS" dans du code "classique" en VB?
Sauriez-vous ou je peux trouver qques exemple simples de code en VB intégrant l'utilisation de WDS (pour une recherche de fichier ou dossier par exemple)?

Merci d'avance pour vos conseils.

Bonne journée, :)
 
Dernière édition:

pedrag31

XLDnaute Occasionnel
Re : VBA et Windows Desktop Search...

Bonjour le forum,

Bon, après une longue série de recherches sur Google, j'ai fini par trouver mon bonheur :cool: et reconstituer le code permettant d'utiliser l'indexation de Windows (Windows Desktop Search) depuis VBA/Excel. Ça fonctionne sur la base de requêtes SQL.

Le grand plus de cette méthode de recherche via l'index est qu'elle renvoie tous les fichiers présents dans les dossiers indexés en des temps records (entre 1 et 2s :D). Aucune comparaison avec les méthodes FSO et DIR que j'utilisais jusqu'à présent. Idéal pour traiter des recherches vastes ou dans des arborescences importantes.

Ce code exemple recherche les fichiers de type "*.xls*" qui sont sur le bureau de l'utilisateur et liste les résultats (Nom de fichier + Chemin) dans la fenêtre d’exécution de VBA.

VB:
Sub RequeteWindowsDesktopSearch()

'Dans VBA Menu "Tools/References..."
'Cocher "Microsoft ActiveX Data Object 2.8 Library"

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")
 
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
 
'requette : ensemble des fichiers Excel du bureau
objRecordset.Open "SELECT System.FileName,System.ItemFolderPathDisplay FROM SYSTEMINDEX WHERE System.ItemFolderPathDisplay = 'C:\Utilisateurs\UserName\Desktop' AND System.ItemNameDisplay LIKE '%.xls%'", objConnection
 
If objRecordset.RecordCount <> 0 Then
objRecordset.MoveFirst
    Do While Not objRecordset.EOF
        For i = 0 To 1
            Debug.Print objRecordset(i)
        Next i
        objRecordset.MoveNext
    Loop
End If

objConnection.Close

End Sub

Testé avec Excel 2010 et Windows 7.

Bonne journée :)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
1728715522098.png


en même temps c'est normal le recordcount renvoie -1
autrement dit la requete n'aboutie à rien
 

dysorthographie

XLDnaute Accro
Bonjour,
objRecordset.RecordCount est inutile car il retourne toujours la position actuelle du curseur dans le recordset et retour un erreur si eof=bof.

objRecordset.MoveFirst a l'ouverture le recordset ce positionne toujours au premier enregistrement et de plus même punition si eof=bof

Tu n'as besoin que de ça
Code:
Do While Not objRecordset.EOF
        For i = 0 To objRecordset.fields.count -1
            Debug.Print objRecordset(i)
        Next i
        objRecordset.MoveNext
    Loop
 

patricktoulon

XLDnaute Barbatruc
Bonjour robert je t'invite a passer dans cette discution
 

Statistiques des forums

Discussions
314 717
Messages
2 112 166
Membres
111 447
dernier inscrit
jasontantane