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
bonsoir @Valtrase pour la version 1 je suis parti de ton idée de base
je lui ai ajouté la recursivité (optionnelle) ainsi que les partie de nom et extension optionnelles
1728242203472.png


il s'avère que j'avais ca mais avec redirection du resultat mais dans un fichier texte
et à ma grande surprise la version avec redirection dans fichier texte est plus rapide chez moi que la version avec récupération dans stdout.readall
et pour le fun j'ai fait un exemple avec un ersatz de ma fonction FSOGOSUB ultra simplifiée qui me permet d'accélérer la recherche en zappant des boucles inutiles
 

Staple1600

XLDnaute Barbatruc
Re

@patricktoulon
Bizarrement je peux quand même exécuter ce code sur le PC du boulot
Sub test()
CreateObject("WScript.Shell").Popup "Hello!", 5, "Title"
End Sub
Ce serait donc juste le .Run qui serait bloqué ?

PS: Sur mon PC boulot, le lecteur C est masqué, le %temp% pas accessible, je peux créer de fichier par code dans Mes Documents etc...
J'oubliais le filtrage web
Bref, vivement la retraite ;)

Sinon, personne ne reproduit ce j'expliquais dans le message#45 ?
Je viens de retester
Et le phénomène se produit toujours.
 

laurent950

XLDnaute Barbatruc
Bonjour @Staple1600, @patricktoulon

ce que j'ai compris !

ce système me plait bien @patricktoulon et pourquoi pas l'adopter, je vais aussi essayer de comprendre comment cela fonctionne pour l'utiliser par la suite. merci Patrick

L'erreur "Permission refusée" que tu rencontres provient probablement de restrictions d'accès au répertoire C:* sous Windows. Par défaut, les utilisateurs ordinaires n'ont pas toujours les droits pour créer ou modifier des fichiers directement à la racine du disque système (**C:*).

@patricktoulon
Sur PC boulot, pas de test possible, sécurité oblige
Je ne peux pas utiliser Wscript.Shell.Run
Bloqué par l'antivirus
et je ne peux pas créer de fichier sur le bureau par script: Permission refusée.

Solutions possibles :

1. Utiliser un chemin de répertoire où tu as les permissions :

Essaye d'enregistrer le fichier dans un répertoire où tu as des droits d'écriture, comme ton dossier Documents ou Bureau.

Par exemple, tu peux changer la ligne de code pour enregistrer le fichier dans ton dossier Documents :

TonDossier = Créer un dossier (Nouveau dossier) et appelle celui-ci (TonDossier)

VB:
Sub test2()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    ' Exemple : Créer un fichier texte dans le dossier Documents
    Dim file As Object
    Set file = fso.CreateTextFile("C:\TonDossier\example.txt", True)
    file.WriteLine "Hello World!"
    file.Close
End Sub

Où se trouve physiquement scrun.dll ?

Sur la plupart des systèmes Windows, scrun.dll est situé dans le dossier système de Windows, généralement ici :
  • C:\Windows\System32\ (pour les systèmes 32 bits)
  • C:\Windows\SysWOW64\ (pour les systèmes 64 bits)
Tu n'as pas besoin de t'en soucier directement lorsque tu écris du code VBA ou VBScript, car l'environnement de développement ou l'exécution du script se charge de charger la DLL quand elle est nécessaire.

' ============================================================


La différence entre Wscript.Shell.Run et scrun.dll repose sur leurs rôles et fonctionnalités distincts dans les scripts et l'exécution sous Windows.

1. Wscript.Shell.Run :​

Wscript.Shell est un objet fourni par la bibliothèque Windows Script Host (WSH), utilisé pour interagir avec le système d'exploitation Windows à travers des scripts (par exemple, en VBScript ou VBA). La méthode .Run permet de lancer des commandes système, des programmes ou des fichiers exécutables directement depuis un script.

Exemples d'utilisation de Wscript.Shell.Run :​

  • Lancer une application ou exécuter une commande dans une fenêtre de commande (cmd.exe).
  • Exécuter un fichier batch ou un autre script.
Voici un exemple en VBA :

vba
Copier le code
Code:
Sub TestRun()

    Dim shell As Object
    Set shell = CreateObject("WScript.Shell")
 
    ' Exécute un programme (ex : notepad.exe)
    shell.Run "notepad.exe"

End Sub

Dans cet exemple, Wscript.Shell.Run lance le programme Notepad via une commande.

Caractéristiques principales de Wscript.Shell.Run :​

  • Usage : Lancer des processus ou des commandes externes.
  • Retour : Tu peux spécifier si la commande s'exécute de manière synchrone (attendre la fin du programme) ou asynchrone (continuer le script sans attendre).
  • Contexte : Il est souvent utilisé dans des scripts pour exécuter des programmes, ouvrir des fichiers ou gérer des tâches système.

2. scrun.dll (Microsoft Script Runtime) :​

scrun.dll est une bibliothèque d'exécution de scripts de Microsoft Script Runtime. Contrairement à Wscript.Shell.Run, cette bibliothèque fournit des objets système pour manipuler des fichiers, des dossiers, des collections, et des dictionnaires dans des scripts VBA ou VBScript.

Le plus commun des objets fournis par scrun.dll est FileSystemObject, qui est utilisé pour interagir avec le système de fichiers (créer, lire, supprimer des fichiers et dossiers).

Exemple d'utilisation de scrun.dll (FileSystemObject) en VBA :​

vba
Copier le code
Code:
Sub TestFileSystemObject()

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
 
    ' Créer un fichier texte dans le répertoire Documents
    Dim file As Object
    Set file = fso.CreateTextFile("C:\Users\TonNomUtilisateur\Documents\example.txt", True)
    file.WriteLine "Hello World!"
    file.Close

End Sub

Caractéristiques principales de scrun.dll :​

  • Usage : Manipuler des fichiers, des dossiers, des collections, et des dictionnaires via des scripts.
  • Contenu : Fournit des objets comme FileSystemObject, Dictionary, TextStream pour lire, écrire et gérer des fichiers et répertoires.
  • Contexte : Il est utilisé pour gérer des tâches liées au système de fichiers dans des scripts VBA, VBScript ou dans des macros.

Comparaison résumée :​

FonctionnalitéWscript.Shell.Runscrun.dll (Microsoft Script Runtime)
Rôle principalExécuter des commandes système ou des programmesManipuler des fichiers, dossiers, collections
Bibliothèque associéeWindows Script Host (WSH)Microsoft Script Runtime (scrun.dll)
Méthodes principales.RunFileSystemObject, Dictionary, TextStream
Exemples d'utilisationLancer un programme externeCréer ou lire des fichiers dans un script
Contexte d'utilisationLancer des processus ou commandes systèmeGérer des tâches liées au système de fichiers
En résumé, Wscript.Shell.Run est principalement utilisé pour exécuter des programmes ou des commandes, tandis que scrun.dll (via des objets comme FileSystemObject) est utilisé pour gérer des fichiers et des répertoires dans des scripts.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

@laurent950
Merci pour ces explications mais je sais déjà tout cela 🤔
Tu aurais du comprendre en lisant ceci
Sur PC boulot, pas de test possible, sécurité oblige
Que ce PC est fourni par mon employeur et que dessus tourne un Windows bridé par la DSN.
(Direction des Services Numériques)
Et c'est pareil, pour tous mes collègues.
Nous ne nous loggons pas en tant qu'administrateur.
Je suis donc tributaire de l'outil qu'on me fournit pour bosser

Dans le message#51, j'informais simplement @patricktoulon que je n'avais pu testé son fichier au boulot
(et je résumais pourquoi)

Tu me parles du lecteur C alors que je précisais
le lecteur C est masqué
J'aurais du précisé, masqué dans l'explorateur Windows.
Je ne vois que le lecteur D (dans lequel est mon profil)
 

Staple1600

XLDnaute Barbatruc
Bonsoir @patricktoulon

On est bien d'accord sur le déroulé ?
[TEST SUR MON PC PERSO]
Je suis dans VBE
Je double-clique sur l'userform: FilDialogSepcial2 et j'appuie sur F5
L'userform s'affiche
Je saisis xlsx dans TxtbExtension et j'appuie sur Chercher
Un MsgBox affiche le contenu MSG_CHEMIN_VIDE​
J'appuie alors sur Choix Dossier et je sélectionne mon dossier contenant un seul classeur *.xlsx
Je clique de nouveau sur Chercher
Un MsgBox affiche alors le contenu de MSG_LISTE_VIDE​
Et voici donc la fin de mon test
erreurtoujours.png
Ces deux fonctionnent sans souci sur mon PC perso ;)
VB:
Sub TestA()
CreateObject("WScript.Shell").Run "winver.exe"
End Sub
Sub testB()
Dim strPath
strPath = ThisWorkbook.Path & "\"
With CreateObject("Scripting.FileSystemObject").CreateTextFile(strPath & "test.txt")
    .WriteLine Date
    .WriteLine Time
    .Close
End With
End Sub
 

patricktoulon

XLDnaute Barbatruc
j'ai testé ce déroulé 5/6 fois et je n'ai pas ce soucis
d'ailleurs j'ai du mal à comprendre pourquoi car tout est démarré par go_click
que ce soit avant ou après show les valeur d'argument sont pris dans les textboxs

c'est vraiment bizarre ce phénomène 🤔
 

patricktoulon

XLDnaute Barbatruc
comme visiblement tu n'a pas de problème avec le scriptinruntime
version ameliorée de la version 3 du dialog FSO
ça reste un ersatz de ma fonction GOSU_FSO mais l'essentiel y est
VB:
Function recherche_récursive3(dparent, Optional partname As String = "*.*", Optional Recurr As Boolean = False, Optional L As String) As Variant
    Dim FSO As Object, Lparent As Object, SubFolder As Object, Ficher As Object, A As Boolean, B As Boolean
    Static first As Boolean
    Set FSO = CreateObject("scripting.filesystemobject")

    If Not TypeOf dparent Is Object  Then
        Set Lparent = FSO.GetFolder(dparent)
        first = True
    Else
        Set Lparent = dparent
    End If
    If GetAttr(Lparent) <> 22 Then
        Dim done As Boolean
        On Error Resume Next
        done = Len(Dir(Lparent.Path & "\" & partname)) > 0
        On Error GoTo 0
        If done Then
            For Each Ficher In Lparent.Files
                If LCase(Ficher.Name) Like partname Then L = L & Ficher.Path & vbCrLf
            Next
        End If

        If Recurr Then
            For Each SubFolder In Lparent.SubFolders
                recherche_récursive3 SubFolder.Path, partname, Recurr, L
            Next SubFolder
        End If
    End If
    If first Then recherche_récursive3 = L
End Function
 

Staple1600

XLDnaute Barbatruc
Re

@patrictoulon
En testant avec cette version de test
Code:
Public Sub go_Click()
tempFile = Environ("userprofile") & "\desktop\temp_output.txt"
ListBox1.Clear
chemin = TxtbFolder ' Le folder dans le textbox
If chemin = "" Then MsgBox "test1": Exit Sub
If Right(chemin, 1) <> "\" Then chemin = chemin & "\" ' On prévoit le séparateur si nécessaire
If TxtbExpression <> "" Then Expression = "*" & TxtbExpression ' Expression dans la partie du nom
If Checkrecursif Then Recurr = " /S" ' Commande récursive si le checkbox est true
    If TxtbExtension <> "" Then
        If TxtbExtension Like "[!A-Za-z0-9]*" Then MsgBox "Extension non valide": Exit Sub
        Extension = "*." & TxtbExtension
        Else: Extension = "*.*"
    End If
    ' Concat de la ligne de commande
    Dim TempString As String
    TempString = Replace("cmd /C Dir ""*****""" & Recurr & " /b /a-d > """ & tempFile & """", "*****", CStr(chemin) & Expression & "*." & Extension, 1, -1, vbTextCompare)
    Debug.Print TempString ' Contrôle dans la console
    ' La variable Liste récupère le texte du stdout
    CreateObject("Wscript.Shell").Run TempString, 0, True ' 0 = cacher la fenêtre, True = attendre que la commande se termine
    Do While Dir(tempFile) = "" Or i = 2000
    i = i + 1
    DoEvents
    Loop
    x = FreeFile
    Open tempFile For Input As #x
    Liste = Input$(LOF(1), x)
    Close #x
If Liste = "" Then MsgBox "test2": Exit Sub
End Sub
Je me suis aperçu que temp_output.txt est vide
Je comprends mieux que cela ne fonctionne pas ;)

PS: temp_output.txt est sur mon bureau, donc pas de problème pour créer un fichier sur le bureau de mon PC perso.
 

patricktoulon

XLDnaute Barbatruc
il y a beaucoup d'incohérences dans tes rapport
au final on ne sait pas ce qui fonctionne vraiment

j' ai fait cette exercice pour comparer la ligne de commande de valtrase à la mienne
pour comprendre pourquoi ma version qui devrait être normalement plus longue est en fait plus rapide
 

Statistiques des forums

Discussions
315 083
Messages
2 116 038
Membres
112 640
dernier inscrit
rachidqadmir