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
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...
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
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
@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.
@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.
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.
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.Run
scrun.dll (Microsoft Script Runtime)
Rôle principal
Exécuter des commandes système ou des programmes
Manipuler des fichiers, dossiers, collections
Bibliothèque associée
Windows Script Host (WSH)
Microsoft Script Runtime (scrun.dll)
Méthodes principales
.Run
FileSystemObject, Dictionary, TextStream
Exemples d'utilisation
Lancer un programme externe
Créer ou lire des fichiers dans un script
Contexte d'utilisation
Lancer des processus ou commandes système
Gé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.
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)
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
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
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
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
@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.
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