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:

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:

dysorthographie

XLDnaute Accro
Re, Bonjour @dysorthographie

Avec cette syntaxe, je bute pour utiliser GetRows alors que je l'utilise plus haut dans le fil mais avec une autre syntaxe! 🤪

VB:
 Dim TB()
        With .Execute(Sql)
           ReDim TB(.Fields.count-1) 'Pour combler le risque de .Eof du recodset vide!
            If Not .EOF Then TB = .getrows
            .Close
        End With
Code:
Resultats = split(.GetString(, , vbTab, vbCrLf),vbCrLf)
Ligne=Split(Resultats(0),vbTab)
VB:
    Me.list.column=.getRows
Code:
Presspapier =.GetString(, , vbTab, vbCrLf)
ActiveCell.PasteSpecial xlPasteAll
 
Dernière édition:

dysorthographie

XLDnaute Accro
J'utilise shell.application car documents ce trouve dans onedrive et environ ne le connais pas. Ça permet pour les adeptes de windows d'avoir la différence avec ou sans onedrive.
VB:
Enum SpecialFolders
    Desktop = &H0        ' Bureau
    Documents = &H5      ' Dossier Documents
    Downloads = &H19     ' Dossier Téléchargements
    Music = &H14         ' Dossier Musique
    Pictures = &H27      ' Dossier Images
    Videos = &H17        ' Dossier Vidéos
    Recent = &H3C        ' Dossier Éléments récents
    Favorites = &H12     ' Dossier Favoris
End Enum
 
Dernière édition:

crocrocro

XLDnaute Occasionnel
+> A tous ceux qui passent dans ce fil <+
Quels sont vos résultats niveau temps exécution avec un très grand nombre de fichiers ?
avec le code ci-dessous de dysorthographie : 0.55 secondes pour 10 000 fichiers
VB:
Sub test_simple_BIS()
'-> dysorthographie
Dim SqlB As String
Dim T0 As Double
Dim Message As String
    Cells.ClearContents
    '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'"
    SqlB = "SELECT System.ItemName, System.ItemPathDisplay, System.DateModified, System.Size" & vbCrLf & _
          "FROM SYSTEMINDEX" & vbCrLf & _
          "WHERE SCOPE = '" & CreateObject("Shell.Application").Namespace(&H5&).Self.Path & "'"
    T0 = Timer
    With CreateObject("ADODB.Connection")
        .Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';" ' Ouvrir la connexion
        ' Exécuter la requête SQL : beaucoup plus rapide !!!
        Cells(1).CopyFromRecordset .Execute(SqlB)
        .Close
    End With
    Message = Format(Timer - T0, "#0.00 ""Secondes"" ")
    MsgBox Message
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

@crococroco
Merci pour le retour de test
Le code initial est certes de dysorthographie mais cette macro vient du message#30 où j'ai modifié la chaine SQL
ligne
SqlB = "SELECT System.ItemName, System.ItemPathDisplay, System.DateModified, System.Size" & vbCrLf & _ "FROM SYSTEMINDEX" & vbCrLf & _ "WHERE SCOPE = '" & CreateObject("Shell.Application").Namespace(&H5&).Self.Path & "'"
Je vois que tu as remplace ActiveCell par Cells(1)
Précédemment, je étais à 0,03 secondes
Je vais retester
 

dysorthographie

XLDnaute Accro
Je n'est rien à voire avec le canal historique
1728757859136.png


VB:
Sub test_simple()
Dim TB()
TB = WinDir("SCOPE='file:C:\Myrep'", "AND System.FileExtension =  '.xlsx'")
End Sub

Function WinDir(ParamArray valeurs() As Variant) As Variant()
    Dim I As Integer, Whr As String
    ' Initialisation de la requête SQL pour sélectionner les colonnes souhaitées
    Sql = "SELECT System.ItemName, System.ItemPathDisplay, System.DateModified, System.Size FROM SYSTEMINDEX"
 
    For I = 0 To UBound(valeurs) ' Boucle à travers les paramètres fournis pour construire la clause WHERE
        Whr = Whr & " " & valeurs(I) ' Concatène chaque paramètre dans la clause WHERE
    Next
    If Trim(Whr) <> "" Then Sql = Sql & vbCrLf & "WHERE " & Whr ' Si la clause WHERE est définie, elle est ajoutée à la requête SQL
    Debug.Print Sql ' Affiche la requête SQL dans la fenêtre d'exécution pour débogage
    With CreateObject("ADODB.Connection") ' Crée une connexion ADODB et ouvre la connexion à l'indexeur de recherche Windows
        .Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';" ' Ouvrir la connexion
        ' Exécute la requête SQL et stocke les résultats
        ReDim WinDir(0) ' Redimensionne le tableau pour les résultats
        With .Execute(Sql)
            If Not .EOF Then WinDir = .getrows ' Si des résultats existent, les place dans le tableau WinDir
            .Close ' Ferme le recordset
        End With
        .Close ' Ferme la connexion
    End With
End Function
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

@crocrocro
Avec le code du message#41
=> 2,64 secondes pour 87 155 fichiers
=> 0.03 secondes en filtrant sur les *.xlsx

@dysorthographie
Bravo pour ton dernier code 👏
C'est très rapide
J'ai testé ainsi
Code:
Sub test_simple()
Dim TB()
Dim T0 As Double
TB = WinDir("SCOPE='file:C:\Users\STAPLE\Documents'", "AND System.FileExtension =  '.xlsx'")
Cells(1).Resize(UBound(TB, 1), UBound(TB, 2)).Value = TB
End Sub
Mais où mettre le Timer pour avoir exactement le temps d'exécution ?
 
Dernière édition:

dysorthographie

XLDnaute Accro
Je revendique aucun code. Il ya plusieurs écoles mais Microsoft les à toutes décliner et c'est l'habitude qui prime.

Personnellement je réduis au maximum à sa plus emple expression. Si je suis pas obligée de déclarer des variables alors ça va. Je trouve que plus le code est condensé plus il est lisible.

Je préfère guider sur les sujets que je pense metrisé et en plus j'aime bien.
 

crocrocro

XLDnaute Occasionnel
Pour Staple,
des précisions pour le temps d'exécution (en vélo ou en porsche, les temps ne sont pas les mêmes )
Processeur Intel(R) Core(TM) i3-5005U CPU @ 2.00GHz 2.00 GHz
Mémoire RAM installée 4,00 Go
Type du système Système d’exploitation 64 bits, processeur x64
0.55 secondes pour 10 000 fichiers
 

Statistiques des forums

Discussions
314 243
Messages
2 107 679
Membres
109 897
dernier inscrit
Leabapt34740?