Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Autres Tests de diverses solution pour lister dans un dialog perso des fichiers en filtrant par expression et extension

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
si il y a des âmes charitables qui voudraient bien tester ma pseudo boite de dialogue fichier avec filtre ca m'arrangerait
en fait je l'ai créée sous trois formae différente

1° la filedilogspecial1
avec un dir en ligne de commande lancée par wscript.shell(.excec) et récupérée par le stdout.readall
ce qui implique une apparition brève mais tout de même de la fenêtre dos

2° la filedilogspecial2
avec un dir en ligne de commande lancée par wscript.shell (.run)et récupérée dans un fichier text temporaire
ce qui implique que la fenêtre dos n'apparait pas puisque je hide la fenêtre

3° la filedilogspecial3
dans celle ci j'utilise un hersats de ma fonction FSOGOSUB de 2021 avec FSO

tout les argument sont optionnels
le choix du fichier se fait au double click
possibilité d'annuler

vous avez 3 module pour tester chaque version
si vous pouviez donc tester la testA4 , TestB4 , TestC4 qui sont selon moi les plus importantes
et me dire si la différence de temps d'apparition de la fenêtre avec la liste de fichier filtrée avec les arguments envoyés par les sub de testsest importante ou pas
voir même cela vous gène t il plus que ça (que la fenêtre dos apparaisse brièvement (pour la fildialoSpecial1) )?

merci aux testeurs
après moult tests dans diverses situations la version 5 et celle qui a été retenu
 

Pièces jointes

  • boite de dialog recherche de fichier V1 2 3 4 5 6.xlsm
    165.1 KB · Affichages: 0
Dernière édition:
Solution
bon après moults test dans diverses conditions pour la boites de dialog ce sera la petite dernière que j'ai un peu montré dans la vidéo
c'est pas la plus rapide mais

1° version 1 la méthode cmd Dir--> stdout readall ayant un problème de formatage et affichant la fenêtre de cmd vous l'avez compris de toute façon c'est la première a avoir été abandonnée

2° Version 2 méthode cmd dir --> fichier temporaire est acceptable mais selon l'occupation du pc elle peut varier su simple à X 7 a peu prés et elle exige forcement que au moins la destination du fichier soit autorisée pas simple sur pc pro voir même privé logué avec compte MS sur windows

3° version 3 FSO elle fonctionne très bien mais elle est plus lente que les autres mais je...

patricktoulon

XLDnaute Barbatruc
re
oui les versions ne liste pas dans l'ordre car je collectionne les fichiers
sauf peut être pour la 1 et 2 et si c'est pas le cas alors je n'y peut rien c'est le dir dans CMD qui fait la liste

si tu les veux dans l'ordre il faut utiliser la vielle vielle méthode mais c'est plus long
et là ils sont listés dans l'ordre de l'explorer
dossier 1
fichier
fichier
sousdossier
fichier
fichier
fichier
fichier
 

patricktoulon

XLDnaute Barbatruc
re
oui j'ai debugué bien sur la requete est correcte si ce n'est que des double"%%" mais ça n'a pas d'incidence sur la requete puisque ça fonctionne sur des autres disques indexés
C;\ ---> oui
C:\Program Files ---> non

j'ai même essayé de raccourcir le sql prendre tout sans filtre
"SELECT System.ItemPathDisplay , System.ItemName, System.DateModified FROM SYSTEMINDEX
WHERE System.ItemPathDisplay LIKE 'C:\Program Files\%' "
 

jurassic pork

XLDnaute Occasionnel
avec D: Indexé et ce code :
VB:
Sub test_simple()
Dim TB()
TB = WinDir("SCOPE='file:D:\Program Files\'")
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

j'ai bien des résultats.
Tu es sûr que ton c:\program files est indexé (voir options d'indexation) il y a parfois des exclude
 

patricktoulon

XLDnaute Barbatruc
si je prends scope la oui je l'ai
VB:
SqL = "SELECT System.ItemName, System.ItemPathDisplay, System.DateModified " & _
                  "FROM SYSTEMINDEX " & _
                  "WHERE SCOPE='file:" & Chemin & "'"
55 402 fichiers trouvés en 4.613 sec
mais je n'ai pas de filtre
et si je filtre dans la variable tableau je vais rallonger le temps
avec ma version 5 vba dir méthode empilement je suis à 6.xxx secondes
ça m’étonnerait que je fasse mieux avec le filtre sur variable tableau issue de la requette
 

patricktoulon

XLDnaute Barbatruc
j'ai peut être trouvé un compromis avec scope
Code:
SqL = "SELECT System.ItemPathDisplay " & _
           "FROM SYSTEMINDEX " & _
           "WHERE SCOPE='file:" & Chemin & "'" & _
           "AND System.ItemName LIKE '%" & partNom & "%' " & Recurr & _
           "AND System.ItemName LIKE '%." & extension & "%'"
resultat du sql
SELECT System.ItemPathDisplay FROM SYSTEMINDEX
WHERE SCOPE='file:k:\'
AND System.ItemName LIKE '%cdo%'
AND System.ItemName LIKE '%.%'
bon c'est un poil plus long car le where va chercher dans tout les sens mais ça marche
je vais travailler sur le recursif (switchable) avec scope c'est pas gagné
 

patricktoulon

XLDnaute Barbatruc
je viens de comprendre aussi que la requete n'acceptepas le mixte dans le like
il va falloir que je split et que je fasse autant de "AND ... KIKE..." que d’élément dans le split
en espérant que ca se transforme pas en "OR"
SELECT System.ItemPathDisplay FROM SYSTEMINDEX
WHERE SCOPE='file:k:\'
AND System.ItemName LIKE '%toto%turl%'
AND System.ItemName LIKE '%.%'
 

patricktoulon

XLDnaute Barbatruc
re
@jurassic pork

ben non ca ne marche marche pas
pour le dossier C;\vba excel\
je cherche ce fichier

K:\vba excel\manipuler le ruban avec customUI\test_excel\chapotototructurlututupointu.xlsx
les deux ne fonctionnent pas


a° en recursif
SQL:
SELECT System.ItemPathDisplay FROM SYSTEMINDEX
WHERE SCOPE='file:k:\vba excel\'
AND System.ItemName LIKE '%toto%'
AND System.ItemName LIKE '%turlututu%'
AND System.ItemName LIKE '%.%'

b°en non récursif
SQL:
SELECT System.ItemPathDisplay FROM SYSTEMINDEX
WHERE SCOPE='file:k:\vba excel\'
AND System.ItemPathDisplay NOT LIKE '%\%\%\%'
AND System.ItemName LIKE '%toto%'
AND System.ItemName LIKE '%turlututu%'
AND System.ItemName LIKE '%.%'

PAR CONTRE !!
si je cherche que juste en récursif "toto" là oui ça marche

j'en trouve 2 dont mon toto*turlututu
SQL:
SELECT System.ItemPathDisplay FROM SYSTEMINDEX
WHERE SCOPE='file:k:\vba excel\'
AND System.ItemName LIKE '%toto%'
AND System.ItemName LIKE '%.%'

si je cherche "%turlututu%" ça ne marche plus
vraiment bizarre ce truc
 

patricktoulon

XLDnaute Barbatruc
re ben non tu la vu le nom c'est bien
K:\vba excel\manipuler le ruban avec customUI\test_excel\chapotototructurlututupointu.xlsx

donc '%toto%turlututu%' devrait fonctionner et c'est pas le cas
d’après chatGPT c'est une histoire de longueur de texte dans l'indexation
 

patricktoulon

XLDnaute Barbatruc
re
ben oui l'indexation se fait sur les x premiers caractères
du coup pour des noms tordus , ben on est chocolats pour la recherche multi expression

pas si bien que ça pour une recherche le adobd hein

pour un simple listage ça à certainement son intérêt mais pas pour la recherche
je me bats avec ça depuis ce matin avec chatGPT et gemini

d'après ce que j'ai compris
le provider
Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"

n'offre qu'un service d'indexation minime et n’inclue pas la recherche par REGEXP ou encore PATINDEX
comme en vb.net pour des sql server
on est donc chocolat

la seule solution serait de tout lister puis décanter la liste dans le getrows()
 

laurent950

XLDnaute Barbatruc
Bonjour @patricktoulon,

Comme ton code est le plus rapide, et même ultra rapide, je me suis posé cette question : n'y a-t-il pas un moyen de forcer la priorité d'Excel de [Normal à Haute] (le temps de l'exécution de la VBA), puis à la fin, de la repasser de [Haute à Normal] ? Par expérience, on m'avait conseillé cette modification via AutoCAD par un service informatique il y a de cela très longtemps. Je ne sais pas si cela se gère via VBA et s'il peut y avoir un impact significatif sur les temps d'exécution.
C'est juste une idée.

Laurent
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…