Microsoft 365 WinSearch VBA | PowerPivot et/ou PowerQuery

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Pour faire écho à la discussion de @patricktoulon, j'ai retrouvé ce fil

J'ai voulu testé sur 365 et W10 64 bits
Et j'ai ce message d'erreur
ERROR_DSO.PNG

Alors tout comme @patricktoulon , je vous invite à tester le code présent dans la discussion de 2013 citée plus haut

La question étant: est-ce que chez vous aussi ce message d'erreur apparait ?

EDITION: Voir le message#57 où apparait PowerPivot dans l'histoire.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

@patricktoulon
Désolé, j'avais pas rangé ma chambre !!!!
Problème résolu
J'ai honte 🙃

Mais suis de preneur de voir ce que cela donnera quand tu auras titillé la chose ;)
 

Staple1600

XLDnaute Barbatruc
Re

@patricktoulon
je bute pour renvoyer le résultat dans un Array plutôt que dans les cellules
Je ne sais comment déclarer mon tableau
(en bref compter le nombre d'items renvoyé par la recherche)
Enrichi (BBcode):
Sub test_simple_B()
'Dans VBA Menu "Tools/References..."
'Cocher "Microsoft ActiveX Data Object 2.8 Library"
Dim t
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
objRecordset.Open "SELECT System.ItemName, System.DateModified FROM SYSTEMINDEX WHERE DIRECTORY='file:C:\Users\STAPLE\Documents'", objConnection
j = 1
Redim t(1 to Quoi?, 1 to 2)

Do Until objRecordset.EOF
    t(j, 1) = objRecordset.Fields.Item("System.ItemName")
    t(j, 2) = Format(objRecordset.Fields.Item("System.DateModified"), "dd/mm/yyyy hh:mm:ss")
    objRecordset.MoveNext
    j = j + 1
Loop
Cells(1).Resize(UBound(t, 1), UBound(t, 2)).Value = t
End Sub
Comment calculer mon Quoi ?
 

Staple1600

XLDnaute Barbatruc
Re

@patricktoulon
T'inquiètes ;)
En général, je n'oublie pas qu'Excel est un tableur à la base
Par conséquent, j'ai l'habitude d'utiliser les outils idoines(*) pour faire telle ou telle chose ;)
WindowsSearch pour chercher des fichiers
(*) et j'essaie de me contenter des outils natifs fournis par Windows

Je m'autorise à rejoindre la joyeuse troupe des "Faisons faire à Excel surtout tout ce qu'il n'est pas censé faire" par simple curiosité intellectuelle ;) et pour occuper les jours de pluie et/ou les nuits sans lune ;)

Sans passer par l'array, je passe par ici, mais ca coince pour la suite
Code:
Private Sub CommandButton1_Click()
'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';"
objRecordset.Open "SELECT System.ItemName, System.DateModified FROM SYSTEMINDEX WHERE DIRECTORY='file:C:\Users\STAPLE\Documents'", objConnection
While objRecordset.EOF = False
        UserForm1.ListBox1.AddItem objRecordset.Fields(0)
        objRecordset.MoveNext
Wend
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

@patricktoulon
De mon côté, j'en suis là, (ca fait moins mal aux yeux, donc pas de risque d'épilepsie ;))
Avec l'array de côté
Code:
Private Sub CommandButton1_Click()
'Dans VBA Menu "Tools/References..."
'Cocher "Microsoft ActiveX Data Object 2.8 Library"
Dim vArr
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
objRecordset.Open "SELECT System.ItemName, System.DateModified FROM SYSTEMINDEX WHERE DIRECTORY='file:C:\Users\STAPLE\Documents'", objConnection
vArr = objRecordset.GetRows()
With ListBox1
    .ColumnCount = 2
    .ColumnWidths = "300;300"
    .List() = Application.Transpose(vArr)
End With
End Sub
PS: Je sais que il y a une limite avec Application.Transpose

Je m'en vais tester ton code épileptique ;)

PS: il faudrait chronométrer toutes les méthodes utilisées (celles de ton fil, et celles ici) pour faire une récap
et voir quelle syntaxe est la plus rapide
Je te laisse, faire vu que c'est toi qui a commencé à pousser Excel hors des clous, avec ton projet pseudo. boite ;)

EDITION: @patricktoulon
Merci d'avoir invité @dysorthographie a se joindre à nous. ;)
 

crocrocro

XLDnaute Impliqué
je bute pour renvoyer le résultat dans un Array plutôt que dans les cellules
Je ne sais comment déclarer mon tableau
(en bref compter le nombre d'items renvoyé par la recherche)
Bonjour le fil,
Pour répondre à la question de Staple, pour alimenter automatiquement le tableau qui s'autodimensionne :
VB:
t = objRecordset.GetRows()
EDIT : je n'avais pas vu que vous aviez déjà trouvé la solution, désolé :(
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re, Bonjour @crocrocro

@patricktoulon
Comme je le disais au message#12, il aura un problème avec Application.Transpose si trop grand nombre de fichiers dans l'Array.

Comme évoqué plus bas, la même plus ou moins à ma sauce
VB:
' Dans VBA Menu "Tools/References..."
' Cocher "Microsoft ActiveX Data Object 2.8 Library"
Sub testt()
Dim a
a = W_SearchIDX("C:\Users\STAPLE\Documents", "xlsx")
Cells(1).Resize(UBound(a, 1), UBound(a, 2)).Value = a
End Sub
Private Function W_SearchIDX(strPath As String, strExt As String) As Variant
Dim objConnection As Object, objRecordset As Object, vArr
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")
' Ouverture de la connexion
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
' Format de la requête avec LIKE pour extension et nom partiel
objRecordset.Open _
"SELECT System.ItemName, System.DateModified FROM SYSTEMINDEX WHERE DIRECTORY='file:" & strPath & "' " & "AND System.ItemName LIKE '%." & strExt & "%'", objConnection ' Adaptation du filtre d'extension
vArr = objRecordset.GetRows()
W_SearchIDX = Application.Transpose(vArr)
objRecordset.Close
objConnection.Close
End Function
Il y un problème de format avec certaines dates en colonne B
 
Dernière édition:

crocrocro

XLDnaute Impliqué
Je ne sais pas si vous avez aussi cette différence de résultat :
Dans le code du post 17 avec la clause Where :
VB:
"WHERE System.ItemPathDisplay LIKE '" & Chemin & "%' " & _
remonte 1 enregistrement
alors qu'avec
Code:
"WHERE DIRECTORY='file:" & Chemin & "' " & _
remonte bien tous les enregistrements correspondant à l'ensemble des paramètres
 

Staple1600

XLDnaute Barbatruc
Re

Ca mouline un peu pour lister mes 87 000 fichiers(*) ;)
=> 9,90 secondes [O365 & W10 64 bits / 16Go de ram)
=> 9,13 secondes si pas de restitution sur la feuille
VB:
Sub test_OK()
'Staple1600 - 12/10/24
Dim strPath$, objConnection As Object, objRecordset As Object, vArr As Variant, ta_b
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")
strPath = Environ("USERPROFILE") & "\Documents"
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
objRecordset.Open "SELECT System.ItemPathDisplay, System.ItemTypeText, System.Size FROM SystemIndex WHERE SCOPE='file:" & strPath & "'", objConnection
Application.ScreenUpdating = False
vArr = objRecordset.GetRows()
ta_b = Transpose2dim(vArr)
Cells(1).Resize(UBound(ta_b, 1), UBound(ta_b, 2)).Value = ta_b
objRecordset.Close
objConnection.Close
End Sub
Private Function Transpose2dim(t)
'|>patricktoulon<|
ReDim tb(LBound(t) To UBound(t, 2), LBound(t) To UBound(t))
    For c = 0 To UBound(t, 2)
        For lig = 0 To UBound(t)
            tb(c, lig) = t(lig, c)
        Next
    Next
Transpose2dim = tb
End Function
(*) voir message précédent.
 
Dernière édition:

dysorthographie

XLDnaute Accro
Bonjour Staple1600 et Patrick

Étapes pour Utiliser la Recherche de Windows​

  1. Ouvre la recherche de Windows : Appuie sur Win + S pour ouvrir la barre de recherche.
  2. Tape "Documents" : Saisis "Documents" dans la barre de recherche. Cela devrait afficher le dossier "Documents" dans les résultats.
  3. Ouvre le Dossier Documents : Clique sur le dossier "Documents" pour l'ouvrir.
  4. Recherche dans le Dossier: Une fois dans le dossier "Documents", tu peux utiliser la barre de recherche en haut à droite pour rechercher des fichiers spécifiques. Voici quelques options de recherche :
    • Afficher tous les fichiers : Tape * pour afficher tous les fichiers et sous-dossiers.
    • Filtrer par type de fichier : Par exemple, tape *.pdf pour afficher uniquement les fichiers PDF.
    • Filtrer par date : Tu peux rechercher par date en utilisant des mots-clés comme last week, this month, etc.

Indexation via les Paramètres de Windows​

Si tu souhaites que Windows indexe automatiquement ton dossier "Documents" pour des recherches futures plus rapides, voici comment vérifier les paramètres d'indexation :

  1. Ouvre les Paramètres d'Indexation:
    • Appuie sur Win + S, puis tape "Options d'indexation" et appuie sur Entrée.
  2. Modifie les emplacements indexés:
    • Dans la fenêtre "Options d'indexation", clique sur le bouton "Modifier".
    • Assure-toi que le dossier "Documents" est coché. Si ce n'est pas le cas, coche-le et clique sur "OK".
  3. Construis l'index:
    • Retourne à la fenêtre "Options d'indexation" et clique sur "Avancé".
    • Dans l'onglet "Paramètres de l'index", tu peux reconstruire l'index si nécessaire en cliquant sur "Reconstruire". Cela peut prendre un certain temps en fonction du nombre de fichiers.
ce qui explique Eof=Bof

VB:
S
Sub test_simple()
Dim Sql As String
 
    ' Construire la requête SQL avec SCOPE
    Sql = "SELECT System.ItemName, System.ItemPathDisplay, System.DateModified, System.Size " & _
          "FROM SYSTEMINDEX WHERE SCOPE='file:" & CreateObject("Shell.Application").Namespace(&H5&).Self.Path & "'"
Debug.Print Sql
    With CreateObject("ADODB.Connection")
        .Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';" ' Ouvrir la connexion
        ' Exécuter la requête SQL
        ActiveCell.CopyFromRecordset .Execute(Sql)
            ' Utiliser GetRows pour obtenir les résultats dans un tableau
        .Close
    End With  
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re, Bonjour @dysorthographie

@dysorthographie
En modifiant ainsi, je récupère la liste dans la feuille
et en filtrant sur l'extension, c'est tout de suite plus rapide
=> 0,02 secondes
Enrichi (BBcode):
Sub test_simple_BIS()
'-> dysorthographie
Dim SqlB As String
SqlB = "SELECT System.ItemName, System.ItemPathDisplay, System.DateModified, System.Size" & vbCrLf & _
      "FROM SYSTEMINDEX" & vbCrLf & _
      "WHERE SCOPE = '" & CreateObject("Shell.Application").Namespace(&H5&).Self.Path & "' and System.FileExtension = '.xlsx'"
Debug.Print SqlB
    With CreateObject("ADODB.Connection")
        .Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';" ' Ouvrir la connexion
        ' Exécuter la requête SQL
        ActiveCell.CopyFromRecordset .Execute(SqlB)
            ' Utiliser GetRows pour obtenir les résultats dans un tableau
        .Close
    End With
End Sub
Avec cette syntaxe, je bute pour utiliser GetRows alors que je l'utilise plus haut dans le fil mais avec une autre syntaxe! 🤪

@crocrocro
Merci pour la précision
Car j'ai l'habitude de lire les messages sur XLD sur le principe ci-dessous.
J'ai donc cru que ton message était pour tous. ;)

@nomdupseudo
phrase
phrase
=>le message s'adresse à la personne dont on indique le pseudo

pas d'indication de pseudo
phrase
phrase
=> le message s'adresse à tous les lecteurs de la discussion
 
Dernière édition:

Statistiques des forums

Discussions
315 094
Messages
2 116 144
Membres
112 669
dernier inscrit
Guigui2502