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
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 Impliqué
+> 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 Impliqué
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
 

jurassic pork

XLDnaute Occasionnel
Hello,
j'ai effectué un test de performance (en utilisant cBenchmark) de windir avec les mêmes paramètres que ceux utilisés pour un test de performance entre les différentes méthodes de recherche de patricktoulon dans ses boîtes de dialogue de recherche :
VB:
Function WinDir(ParamArray valeurs() As Variant) As Variant()
    Dim I As Integer, Whr As String
    Dim bm As New cBenchmark
    ' 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
    bm.TrackByName "Init Windir"
    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
    bm.TrackByName "Execute Windir"
End Function

IDnrNameCountSum of ticsPercentageTime sum
0​
Init Windir
1​
281​
0,09%​
28 us
1​
Execute Windir
1​
305 342​
99,91%​
31 ms
TOTAL
2​
305 623​
100,00%​
31 ms
Total time recorded:31 ms

Recherche de *.xlsm résultats 165 fichiers
Recherche V1: 0,97 s
Recherche V2: 481 ms
Recherche V3: 239 ms
Recherche V4: 111 ms (Recherche_PowerShell2 PowerShell lancé par l'intermédiaire d'une dll unmanaged Csharp)
Recherche V4 1: 1,12 s (Recherche_PowerShell PowerShell lancé par un WScript.Shell)
Recherche Windir: 31 ms


Ami calmant, J.P
 
Dernière édition:

Statistiques des forums

Discussions
315 093
Messages
2 116 139
Membres
112 669
dernier inscrit
Guigui2502