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
    151.1 KB · Affichages: 1
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
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
Laurent j'ignore complétement de dont tu parles
 

patricktoulon

XLDnaute Barbatruc
comme je disais ça dépend des cas le plus souvent ma version 5 est plus rapide que la 2
exemple
1729437236935.png



la même recherche avec la 5

1729437283696.png


comme on dit y a pas photo ;) 😂
 

laurent950

XLDnaute Barbatruc
Laurent j'ignore complétement de dont tu parles
Voila patrick
j'ai trouvé cette explication

Windows xxx vous permet de choisir la priorité à donner aux ressources attribuées aux logiciels que vous utilisez.
Par défaut, les logiciels sont lancés dans une priorité normale.
Pour booster un peu un logiciel, vous pouvez augmenter temporairement sa priorité au dépend des autres logiciels.
Sous Windows xxx, cliquez avec le bouton droit de la souris sur la barre des tâches et cliquez sur Gestionnaire des tâches.
Dans la fenêtre qui apparaît, cliquez avec le bouton droit de la souris sur le logiciel dont vous souhaitez augmenter la priorité.
Cliquez sur Accéder aux détails.
Cliquez alors avec le bouton droit de la souris sur le processus sélectionné.
Cliquez sur Définir la priorité puis sur Haute. Evitez le mode Temps réel qui peut rendre votre système instable.
Fermez enfin la fenêtre du Gestionnaire des tâches.
Notez qu'une fois que vous fermerez votre logiciel, sa priorité sera de nouveau normale les fois suivantes.

j'avais eu une manipulation via un service informatique, mais il y a de cela très longtemps pour optimisé Autocad

je sais pas si cela ce gère avec VBA avec Excel ? et si il y a un gain réel ?
 

patricktoulon

XLDnaute Barbatruc
re
là je comprends mieux en effet mais ca n'a aucune incidence reelle sur excel vu que l'on utilise du vba et des fonction comme dir ou externe comme FSO adobd etc....
sincèrement je vois pas vraiment comment et avec quoi on pourrait optimiser plus que ca la 1 , 2 3 et 5
allez la même avec la 3
comme tu vois @jurassic pork même la 3 est plus rapide que la 2
1729437992578.png


il faut bien comprendre que mon intérêt dans ce topic c'est pas de lister le plus vite possible c'est d'avoir une liste filtrée assez rapidement a portée de click dans un fichier excel
et avec toutes les vidéos et capture qui prouvent A+B que mes version 5 et FSO seront largemnt supérieures dans le cadre d'une recherche typée

j'ai cru comme vous au départ que la 1 et 2 (la 4 mise à part) serait plus rapide mais non
l'optimisation que j'ai faite dans ces deux modèles est tout simplement bluffante

il est evident que si l'on veut un listing complet on prendra la 2 bien évidemment
 

patricktoulon

XLDnaute Barbatruc
a moi je m'en sert tout les jours voir toute la journée même
et si je vous dit que depuis le post156 ou je disais que je ne voyais pas comment optimiser plus que ça
et ben peut être que si en fait

la logique est simple
je cherche ce fichier
k:\vba excel\manipuler le ruban avec customUI\test_excel\chapotototructurlututupointu.xlsx


imaginons avec la 1,2,3,5 que je cherche "cha*to*tru*tur*po"
ça en fait des morceaux hein
et bien si par exemple je cherche ce fichier précisément et si j'arrêtais le moulin tout simplement dès qu'il le trouve hein ? ;)
avec la 1 et 2 je gagnerais pas beaucoup car le plus gros du temp c'est l'execution de la commande mais quand même

mais la 3 et 5 la c'est pas pareil
je suis quasiment certain qu'avec la 5 je passe de "ms" à "µs"
 

patricktoulon

XLDnaute Barbatruc
bon alors c'est pas le temps que j'attendais mais bon :rolleyes: là on est aux fesses de la 4
je recherche un seul fichier
k:\vba excel\manipuler le ruban avec customUI\test_excel\chapotototructurlututupointu.xlsx
avec la 5
1729441775371.png


ça décoiffe un peu je dirais non ?
0.035 contre 0.066 on est très proche de la moitié en mode recherche 1 fichier
 

patricktoulon

XLDnaute Barbatruc
Bonjour à tous

j'ai opéré une grosse modif de principe pour la 4
pour les recherches multi expression la requette et faite avec la première
et au lieu de liter selon les expression je reprend la liste et la decante dans une variable tableau



@laurent950
je reviens vers toi pour faire un peu le bilan sur ce code avec les api
alors on est dans des temps toujours vraiment pas mal
mais c'est quand même une déception après avoir ajouté tout ce qui manquait

donc pour commencer
1° je l'ai transformée en fonction retournant une liste
2° 'Ajout de l'extension dans la recherche(optionnelle "*.*" par defaut)
3° 'L'argument SearchString est optionnel aussi
4° 'Correction double separateur sur l'ajout conditionnel du dernier séparateur de path
5° 'Correction sur la recherche globale(tout fichiers) les dossier ne sont plus listés
6° 'Correction avec ajout de test GetAttr pour ne pas lister les dossiers


donc avant ton code dans un debug.print nous renvoyait 0.003xxxx
sauf qu'il listait tout dossiers et fichiers
donc au final avec toutes ces corrections conceptuelles ,avec le getattr pour n'avoir que les fichiers on remonte à 0.060/0.080 soit au niveau de la 5

je l'ai quand même greffé à un dialog (la 6) ça reste encore un résultat plus que satisfaisant

là vous les avez toutes je leurs ai donnés à chacune une couleur différente

Voila elles sont tout fonctionnelles ;)
 

Pièces jointes

  • boite de dialog recherche de fichier V1 2 3 4 5 6.xlsm
    151.1 KB · Affichages: 7
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re Bonjour @jurassic pork
essaie avec expression "*" et extension "*.*" écrit en dur dans les cells
sinon on voit bien avec tout les soucis d'adaptation que seule la version 5 est stable dans quasiment toute les situations

cela dit je crache sur rien ca nous permet d'envisager toute les possibilités diverses méthodes
pour la 6 c'est une eprouvette mettre des gestion d'erreur particulières ou filename ne fait pas la différence en un dossier et un fichier est un peu particulier

c’était juste pour faire plaisir a Laurent qui a quand même travaillé sur la base de ce code avec api
je trouvais normal d'aller jusqu'au bout avec ce modèle

on aura beau tourner dans tout les sens on en revient toujours à la 5 ;) ;)
qui ne demande rien et fait son petit chemin toute seule
 

jurassic pork

XLDnaute Occasionnel
J'ai fait des modifs dans les déclarations des API (en utilisant des LongPtr) et dans la variable hFind :. Il y avait aussi des API qui étaient mal déclarées (retour long au lieu de boolean)
VB:
#If VBA7 Then
    Private Declare PtrSafe Function QueryPerformanceCounter Lib "Kernel32" (lpPerformanceCount As Currency) As Long
    Private Declare PtrSafe Function QueryPerformanceFrequency Lib "Kernel32" (lpFrequency As Currency) As Long
    Private Declare PtrSafe Function FindFirstFile Lib "Kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As LongPtr
    Private Declare PtrSafe Function FindNextFile Lib "Kernel32" Alias "FindNextFileA" (ByVal hFindFile As LongPtr, lpFindFileData As WIN32_FIND_DATA) As Boolean
    Private Declare PtrSafe Function FindClose Lib "Kernel32" (ByVal hFindFile As LongPtr) As Boolean

Code:
Function APIFilterFileListByName(Path As String, Optional SearchString = "*", Optional extension = "*.*", Optional Recursif As Boolean = False, Optional TbL As Variant)
    Dim FindData As WIN32_FIND_DATA
    Dim hFind As LongPtr
    Dim FileName As String
    Dim FullPath As String
    Dim Debut As Long
    Dim X&
et maintenant la version 6 à l'air de fonctionner chez moi. A voir si ce code fonctionne aussi avec un Excel 32 bits sinon faire de la compil conditionnelle #IF WIN64
 

patricktoulon

XLDnaute Barbatruc
il faut penser à tout le monde
tes déclarations passent en vba 7 32 bits
et
VB:
 Dim FindData As WIN32_FIND_DATA
    #If VBA7 Then
        Dim hFind As LongPtr
    #Else
        Dim hFind As Long
    #End If
    Dim FileName As String
    Dim FullPath As String
    Dim Debut As Long
pour moi c'est ok
le, fichier a été modifié en pos t #1 et #160
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonsoir @jurassic pork , @Staple1600 , @laurent950 et tout les autres
je partage avec vous une redécouverte

depuis le début j'avais remarqué un truc qui me perturbait
en effet toute les fonctions avec le dir de vba avait une latence plus ou moins longue au premier lancement juste après avoir ouvert le fichier
j'ai d'abords cru que c’était un effet de cache( tout nous amenait a le penser)
en fait c'est beaucoup plus simple que ça
c'est en regardant mes vielles méthodes et fonctions récursives que j'ai fini par comprendre
en fait dir(de vba) a 4 méthodes
  1. Dir(dossier, vbdirectory)' lecture globale(vbsystem vbhidden,vbarchive,vbnormal,etc..)cumulables
  2. Dir(dossier &"\*.*) lecture de fichiers
  3. Dir() pour les suivants dans un do loop par exemple
  4. Dir$ pour clôturer un dir et ou ouvrir une session du dir vierge (donc vide donc mémoire minime)
je me suis intéressé au 4eme qui me permet de clôturer des sessions de Dir précédentes
et juste pour vérifier avant ma ligne dir(dossier ,vbdirectory) j'ai mis un Dir$

BINGO !! mon intuition était la bonne fini la latence au premier lancement (à froid)

donc là ou je pêche encore c'est de savoir si en fait ça enclenche une session dir vierge afinc d'ouvrir la session du Dir sans charge mémoire du coup un dir vbdirectory ou fichier est démarré plus vite
ou
alors ferme éventuellement un dir toujours près au démarrage de excel ce qui laisse la place a une session du Dir toute neuve et démarre donc plus vite
 

Membres actuellement en ligne

Statistiques des forums

Discussions
315 087
Messages
2 116 084
Membres
112 655
dernier inscrit
fannycordi