Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

(vba) afficher fichiers dans boite de dialogue ...

10 réponses
Avatar
j-pascal
Bonjour,

A partir d'un bouton de UF, je souhaite ouvrir un répertoire et n'afficher
que les fichiers "*.txt" et "*.Gif".
Mon appli travaille sous "C:\" , mais le répertoire en question se trouve
sur "E:\"

J'ai fait ceci :

'------------------------------
Private Sub Rep_E_Click()

On Error GoTo rRr3

ChDrive "E"
If Dir("E:\Toto", vbDirectory) <> "" Then
Application.Dialogs(xlDialogOpen).Show "E:\Toto\*.gif; *.txt"
Else
MsgBox "Répertoire inaccessible."
End If
GoTo rRr4
rRr3:
MsgBox "Répertoire inaccessible."
ChDrive "C"
rRr4:
End Sub
'------------------------------

Outre que je ne suis pas sûr que ce code soit le plus efficace, le pb est
qu'un fichier *.txt que je sélectionne me renvoit ceci :
http://cjoint.com/?mxlzTC0kjE

Sachant que mes Gif sont des images de tableau Excel, je crains d'avoir le
même pb qu'avec les Txt !

En fait, je ne veux pas importer ces fichiers dans l'application, ni les
modifier, mais simplement ouvrir le répertoire depuis le UF et consulter les
fichiers en question.

Merci d'avance pour vos lumières,

Cordialement,

JP

10 réponses

Avatar
PMO
Bonjour,

Essayez plutôt d'utiliser la méthode GetOpenFilename.

Cordialement.

PMO
Patrick Morange
Avatar
j-pascal
Bonsoir Patrick,

Ok, j'ai fait ceci :

'-----------------------
Private Sub Rep_E_Click()

Dim typeFichier As String
Dim Titre As String
Dim nomFichier As Variant 'String = non !

Call FermeMenuPublic 'ferme le UF

typeFichier = "Fichiers, *.gif; *.txt"
Titre = "sélectionnez le fichier à ouvrir"

ChDrive "E" 'indispensable ??
On Error GoTo rRr

If Dir("E:Toto", vbDirectory) <> "" Then
ChDir "E:Toto"
Else
GoTo rRr1
End If

nomFichier = Application.GetOpenFilename(typeFichier, , Titre)

If nomFichier = False Then
Exit Sub
Else
nomFichier = Dir(nomFichier)
End If

If Right(nomFichier, 3) = "txt" Then
Workbooks.Open nomFichier
Else
'à traiter ...
End If
rRr:
MsgBox "Répertoire inaccessible."
ChDrive "C"
rRr1:
End Sub
'-----------------------

1 - (à la 8ème ligne) j'ai l'impression que le "ChDrive "E" ne sert à rien
! Pourtant l'appli fonctionne sous "C:" Quand doit-on appliquer un ChDrive
?
Par ailleurs, devrais-je mettre un "ChDrive "C"" à la fin de cette procédure
?

2 - Puisque j'ai :

"If Right(nomFichier, 3) = "txt" Then
Workbooks.Open nomFichier"

... mon fichier texte est copié dans une nouvelle feuille Excel (ce qui
paraît normal !). Comment faire pour qu'il s'ouvre comme un fichier txt ?
Faut-il mettre qqch qui ressemble à notepad ?
Pour l'instant je fais l'essai avec Txt, mais que va-t-il se passer lorsque
je vais essayer d'ouvrir un fichier *.gif ??

@+ ?

JP


"PMO" <patrickPOINTmorangeAROBASElapostePOINTnet> a écrit dans le message de
news:
Bonjour,

Essayez plutôt d'utiliser la méthode GetOpenFilename.

Cordialement.

PMO
Patrick Morange



Avatar
PMO
Bonsoir,

Ce n'est pas le père Noël quoique ...

Me revoilà avec, ci-dessous, votre code que j'ai
quelque peu modifié.

Je crois que cela devrait convenir.

'*******************
'### A adapter ###
Const MON_CHEMIN As String = "E:Toto"
'#################

Private Declare Function ShellExecute& _
Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long)

Private Sub Rep_E_Click()
Dim typeFichier As String
Dim Titre As String

Dim nomFichier As Variant
''obligatoirement Variant car interprété dans le code
''tantôt comme un Boolean, tantôt comme une String

Call FermeMenuPublic 'ferme le UF

typeFichier = "Fichiers, *.gif; *.txt"
Titre = "sélectionnez le fichier à ouvrir"
On Error GoTo rRr
If Dir(MON_CHEMIN, vbDirectory) <> "" Then
ChDrive MON_CHEMIN
ChDir MON_CHEMIN
Else
Error 76
End If
nomFichier = Application.GetOpenFilename _
(FileFilter:=typeFichier, Title:=Titre)
If nomFichier = False Then
ChDrive Application.DefaultFilePath
ChDir Application.DefaultFilePath
Exit Sub
End If
ShellExecute Application.hwnd, "Open", nomFichier, _
vbNullString, ThisWorkbook.Path, 1
ChDrive Application.DefaultFilePath
ChDir Application.DefaultFilePath
Exit Sub
rRr:
MsgBox Err.Description
End Sub
'*******************

Cordialement.

PMO
Patrick Morange
Avatar
j-pascal
Bonsoir Patrick,

Merci beaucoup, c'est vraiment génial !

(Je suis d'autant plus impressionné que je t'avoue que je n'y croyais plus
... J'ai fait une multitude de recherches sur Google ... en vain ...)

1 - Les arguments de la "Function ShellExecute ..." sont un peu (!)
mystérieux ...
2 - J'apprécie tes explications à propos de la déclaration en "Variant" de
"NomFichier"
3 - Je suis surpris de voir que tu peux définir ChDrive avec le même "path"
que ChDir ...
4 - La référence à Error76 est assurément plus efficace que mon MsgBox ...
(Où puis-je trouver les références des principales "Error" ? J'ai souvent
entendu parler de la "1004")
5 - Dans le GetOpenFile, j'avais omis "FIleFilter:"" et "Tittle:=" ; ça
fonctionnait néanmoins !
6 - Je note la référence à "Application.DefaultFilePath" ; Faut-il
considérer que ce chemin par défaut est celui où se trouve l'application ?
7 - Le Shell Execute est un peu mystérieux .... "hwnd" ??

L'ouverture des fichiers "*.txt" est parfaite ; j'ai essayé avec les
"*.Gif", c'est parfait également ! Même les Gifs animés s'ouvrent avec le
navigateur ... et s'animent !!

Un très grand merci ++++

Bonnes fêtes de fins d'année,

Cordialement,

JP

"PMO" <patrickPOINTmorangeAROBASElapostePOINTnet> a écrit dans le message de
news:
Bonsoir,

Ce n'est pas le père Noël quoique ...

Me revoilà avec, ci-dessous, votre code que j'ai
quelque peu modifié.

Je crois que cela devrait convenir.

'*******************
'### A adapter ###
Const MON_CHEMIN As String = "E:Toto"
'#################

Private Declare Function ShellExecute& _
Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long)

Private Sub Rep_E_Click()
Dim typeFichier As String
Dim Titre As String

Dim nomFichier As Variant
''obligatoirement Variant car interprété dans le code
''tantôt comme un Boolean, tantôt comme une String

Call FermeMenuPublic 'ferme le UF

typeFichier = "Fichiers, *.gif; *.txt"
Titre = "sélectionnez le fichier à ouvrir"
On Error GoTo rRr
If Dir(MON_CHEMIN, vbDirectory) <> "" Then
ChDrive MON_CHEMIN
ChDir MON_CHEMIN
Else
Error 76
End If
nomFichier = Application.GetOpenFilename _
(FileFilter:=typeFichier, Title:=Titre)
If nomFichier = False Then
ChDrive Application.DefaultFilePath
ChDir Application.DefaultFilePath
Exit Sub
End If
ShellExecute Application.hwnd, "Open", nomFichier, _
vbNullString, ThisWorkbook.Path, 1
ChDrive Application.DefaultFilePath
ChDir Application.DefaultFilePath
Exit Sub
rRr:
MsgBox Err.Description
End Sub
'*******************

Cordialement.

PMO
Patrick Morange


Avatar
Mgr Banni
patrick étant encore sous le coup du foie gras, il m'a chargé de répondre à
sa place...
c'est quand même avec "title" et un seul T (enfin...deux en tout) que ça
fonctionne le mieux
Mgr T.B.

"j-pascal" a écrit dans le message de news:
OH7yZX%
Bonsoir Patrick,
5 - Dans le GetOpenFile, j'avais omis "FIleFilter:"" et "Tittle:=" ; ça
fonctionnait néanmoins !


Avatar
j-pascal
Bonsoir,

Merci pour cette précision. Je suis seul coupable de cette erreur de
"recopie".

Néanmoins, une telle erreur d'orthographe aurait affiché : "Erreur de
compilation - Argument nommé introuvable" ...
Par ailleurs, depuis que je l'ai appris sur ce forum, j'utilise pratiquement
systématiquement "Débogage / Compiler VBAProject" avant de lancer mes
prodédures. Je ne sais plus à qui je dois ce conseil, mais je lui dis encore
merci !

Cordialement,

JP

"Mgr Banni" a écrit dans le message de news:
O$yhPj%
patrick étant encore sous le coup du foie gras, il m'a chargé de répondre
à sa place...
c'est quand même avec "title" et un seul T (enfin...deux en tout) que ça
fonctionne le mieux
Mgr T.B.

"j-pascal" a écrit dans le message de news:
OH7yZX%
Bonsoir Patrick,
5 - Dans le GetOpenFile, j'avais omis "FIleFilter:"" et "Tittle:=" ; ça
fonctionnait néanmoins !





Avatar
PMO
Bonjour,

Je suis très content que tout aille pour le mieux.

1 - Les arguments de la "Function ShellExecute ..." sont un peu (!)
mystérieux ...
Je me réfère au livre, malheureusement introuvable, de Dan Appleman
"VISUAL BASIC 5.0 Programmation des API WIN32"
très dur à lire mais une vraie mine de renseignements.
Si vous pouvez le trouver d'occasion ce serait un plus pour vous.

4 - La référence à Error76 est assurément plus efficace que mon MsgBox ...
(Où puis-je trouver les références des principales "Error" ? J'ai souvent
entendu parler de la "1004")
Ci-dessous, un petit code quisimule les erreurs et renvoit leurs N° et
descriptif
cdans une nouvelle feuille.

5 - Dans le GetOpenFile, j'avais omis "FIleFilter:"" et "Tittle:=" ; ça
fonctionnait néanmoins !
Les arguments nommés permettent de ne pas tenir compte des paramètres
ou de les sauter si on n'en pas l'utilité
nomFichier = Application.GetOpenFilename(typeFichier, , Titre)

ici un argument non signalé entre 2 virgules

nomFichier = Application.GetOpenFilename _
(FileFilter:=typeFichier, Title:=Titre)
là seuls les arguments utilisés sont indiqués

6 - Je note la référence à "Application.DefaultFilePath" ; Faut-il
considérer que ce chemin par défaut est celui où se trouve l'application ?
Si vous faites menu Outils/Options/onglet Général
vous trouvez Dossier par défaut qui correspond à
"Application.DefaultFilePath"

**************************
Option Explicit
Const MAX_ERR As Long = 1004
Sub RefErreur()
Dim i&
Dim j&
ReDim Tbl(1 To MAX_ERR, 1 To 2)
On Error GoTo Erreur
For j& = 1 To MAX_ERR
Error j&
Next j&
Sheets.Add
Range(Cells(1, 1), Cells(MAX_ERR, 2)) = Tbl
Exit Sub
Erreur:
i& = i& + 1
Tbl(i&, 1) = Err.Number
Tbl(i&, 2) = Err.Description
Resume Next
End Sub
**************************

Bonnes fêtes.

Cordialement.

PMO
Patrick Morange
Avatar
j-pascal
Bonsoir Patrick,

Ci-dessous, un petit code quisimule les erreurs et renvoit leurs N° et
descriptif
dans une nouvelle feuille.


La numérotation me paraît assez étrange dans la mesure où plusieurs numéros
font référence à une seule cause, ie "Erreur définie par l'application ou
par l'objet" !

Les arguments nommés permettent de ne pas tenir compte des paramètres
ou de les sauter si on n'en pas l'utilité

nomFichier = Application.GetOpenFilename _
(FileFilter:=typeFichier, Title:=Titre)
là seuls les arguments utilisés sont indiqués


C'est noté.

Si vous faites menu Outils/Options/onglet Général
vous trouvez Dossier par défaut qui correspond à
"Application.DefaultFilePath"


J'ai bien fait de poser la question ! Il faut que je vois l'incidence que ce
bout de code peut avoir sur mon application car celle-ci est exécutée sur
plusieurs postes et j'imagine que les "paths" ne sont pas nécessairement
identiques d'un utilisateur à l'autre ...

Const MAX_ERR As Long = 1004


Pourquoi pas "Integer" ?
Je ne suis pas très à l'aise avec la déclaration des variables. Afin de
limiter la mémoire de mon application, j'ai essayé d'enlever tous les
"Variant", et je me retrouve avec pas mal de "String" ; mais je crois
comprendre qu'il est préférable de limiter aussi la valeur de ces chaines !!
Je crois qu'on peut utiliser des "variables espions" (?) mais l'unique
expérience que j'ai eue avec ces dernières n'a pas été trés concluante ...

Cordialement,

JP

PS : désolé pour mon "tutoiement" intempestif.


Bonnes fêtes.

Cordialement.

PMO
Patrick Morange



Avatar
PMO
Bonsoir,

La numérotation me paraît assez étrange dans la mesure où plusieurs numéros
font référence à une seule cause, ie "Erreur définie par l'application ou
par l'objet" !
Le code est une bidouille qui ne fait que simuler des erreurs

de 1 à MAX_ERR.
Cela a le mérite d'afficher de descriptif des erreurs qui sont
véritablement répertoriées. Ensuite, pour celles qui ne le
sont pas, le Basic doit faire au plus près.

Const MAX_ERR As Long = 1004
Pourquoi pas "Integer" ?
Je ne suis pas très à l'aise avec la déclaration des variables. Afin de
limiter la mémoire de mon application, j'ai essayé d'enlever tous les
"Variant", et je me retrouve avec pas mal de "String" ; mais je crois
comprendre qu'il est préférable de limiter aussi la valeur de ces chaines !!
Dans ce cas particulier, la constante n'occupe qu'une seule place

mémoire et la différence d'occupation entre un Integer et un Long est
très minime et n'a pas d'impact avec les machines actuelles.
Le Long occupe 4 octets et l'Integer 2 octets.
Pour ma part, j'ai pris l'habitude d'utiliser systématiquement des Long
en lieu et place des Integer (sauf cas exceptionnels).
En voici la raison par un exemple concret :
Avant Excel 2007, on comptait 256 colonnes dans Excel et on pouvait coder

Dim numColonne As Integer
numColonne = Selection.Column

Mais, dans le Basic et à contrario du C ou d'autres languages, les
variables numériques sont signées c'est à dire qu'elles ont des valeurs
négatives
ou positives. Ainsi, l'Integer sur 2 octets (soit 16 bits) a :
2 puissance 16 = 65536 contenants avec des contenus s'échelonnant de
-32768 à +32767 (32768 négatifs + 1 zéro + 32767 positifs = 65536)
Maintenant on a Excel 2007 et ses 16000 et quelques colonnes. Et si,
dans un avenir proche, Excel 200x comptait 100 000 colonnes et bien
le code (comme l'exemple ci-dessus) planterait. Tous les programmes
conçus seraient à revoir pour une économie de bout de chandelle.
Conclusion : au diable l'avarice.

Quant aux variables String pas d'inquiétude. Elles n'occupent en
mémoire que leur taille (un caractère = 1 octet)

Cordialement,

PS : désolé pour mon "vouvoiement" intempestif.

PMO
Patrick Morange

Avatar
j-pascal
Bonsoir Patrick,

Merci beaucoup pour ces informations détaillées. J'en prends bonne note.

A bientôt,

Salutations,

JP


"PMO" <patrickPOINTmorangeAROBASElapostePOINTnet> a écrit dans le message de
news:
Bonsoir,

La numérotation me paraît assez étrange dans la mesure où plusieurs
numéros
font référence à une seule cause, ie "Erreur définie par l'application ou
par l'objet" !
Le code est une bidouille qui ne fait que simuler des erreurs

de 1 à MAX_ERR.
Cela a le mérite d'afficher de descriptif des erreurs qui sont
véritablement répertoriées. Ensuite, pour celles qui ne le
sont pas, le Basic doit faire au plus près.

Const MAX_ERR As Long = 1004
Pourquoi pas "Integer" ?
Je ne suis pas très à l'aise avec la déclaration des variables. Afin de
limiter la mémoire de mon application, j'ai essayé d'enlever tous les
"Variant", et je me retrouve avec pas mal de "String" ; mais je crois
comprendre qu'il est préférable de limiter aussi la valeur de ces chaines
!!
Dans ce cas particulier, la constante n'occupe qu'une seule place

mémoire et la différence d'occupation entre un Integer et un Long est
très minime et n'a pas d'impact avec les machines actuelles.
Le Long occupe 4 octets et l'Integer 2 octets.
Pour ma part, j'ai pris l'habitude d'utiliser systématiquement des Long
en lieu et place des Integer (sauf cas exceptionnels).
En voici la raison par un exemple concret :
Avant Excel 2007, on comptait 256 colonnes dans Excel et on pouvait coder

Dim numColonne As Integer
numColonne = Selection.Column

Mais, dans le Basic et à contrario du C ou d'autres languages, les
variables numériques sont signées c'est à dire qu'elles ont des valeurs
négatives
ou positives. Ainsi, l'Integer sur 2 octets (soit 16 bits) a :
2 puissance 16 = 65536 contenants avec des contenus s'échelonnant de
-32768 à +32767 (32768 négatifs + 1 zéro + 32767 positifs = 65536)
Maintenant on a Excel 2007 et ses 16000 et quelques colonnes. Et si,
dans un avenir proche, Excel 200x comptait 100 000 colonnes et bien
le code (comme l'exemple ci-dessus) planterait. Tous les programmes
conçus seraient à revoir pour une économie de bout de chandelle.
Conclusion : au diable l'avarice.

Quant aux variables String pas d'inquiétude. Elles n'occupent en
mémoire que leur taille (un caractère = 1 octet)

Cordialement,

PS : désolé pour mon "vouvoiement" intempestif.

PMO
Patrick Morange