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 Occasionnel
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:

Staple1600

XLDnaute Barbatruc
Re

[aparté suite et fin]
@patricktoulon
Je ne parle pas de prendre tel ou tel bout de mon code mais de simplement citer les XLDnautes qui ont mis du jus de neurones dans leur VBE, pour tester ton projet et où t'apporter de nouvelles pistes.

Un truc du genre quoi
'Octobre 2024: projet pseudo boite
'Auteur : patricktoulon
'suggestions emploi PowerShell & WSearch : Staple1600
'contributions code (WScript+PShell etc) : jurassic pork
[/aparté suite et fin]
 

Staple1600

XLDnaute Barbatruc
Re

@patrickoulon
Si je ne m'abuse, pour le moment avec Windows Search, on ne traite pas les sous-dossiers mais que la racine, non ?

patricktoulon à dit:
C'est bien pour cela que j'ai évoqué la piste Windows Search

Mais comme tu l'as dit, cette piste peut-être problématique si pas d'indexation ou si les services de WS sont arrêtés etc...

Alors que ce bon vieux Dir du Dos tournera sans souci sur ton les PC ;)
(quoique j'ai vu des PC où l'invite de commande était désactivé, tout comme VBScript par les DSI)
 

crocrocro

XLDnaute Occasionnel
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:

Statistiques des forums

Discussions
314 244
Messages
2 107 699
Membres
109 906
dernier inscrit
flavie06