Quand, dans un programme, on souhaite laisser à l'utilisateur le choix d'un fichier, il est pratique d'afficher la boite de dialogue servant à ouvrir les fichiers (Fichiers / ouvrir).
On peut facilement la faire apparaitre en écrivant :
Application.Dialogs(xlDialogOpen).Show
qui donne exactement le même résultat que Fichier / ouvrir :
L'arborescence des fichiers est présentée avec sélection du répertoire en cours. Un double clic sur un des fichiers va l'ouvrir.
Plutôt que le répertoire en cours, on peut souhaiter orienter le choix de l'utilisateur vers un autre répertoire voire même vers un fichier particulier. Il suffit de passer le chemin du répertoire ou le nom complet du fichier en argument :
Application.Dialogs(xlDialogOpen).Show ("c:\mes documents")
ou Application.Dialogs(xlDialogOpen).Show ("c:\zaza.xls")
Petite difficulté, l'utilisateur peut changer d'avis et cliquer sur le bouton annuler. Dans ce cas là, aucun fichier n'est ouvert et le programme risque de ...faire n'importe quoi !
Il est donc généralement nécessaire de s'assurer que l'utilisateur a bien ouvert un fichier.
Pour ce faire, on enregistre dans une variable la valeur renvoyée par
Application.Dialogs(xlDialogOpen).Show :
False si l'utilisateur a cliqué sur annuler ou s'il a fermé la boite de dialogue en cliquant sur la petite croix en haut à droite, True sinon.
On peut écrire par exemple :
résultatOK = Application.Dialogs(xlDialogOpen).Show
ou plus court :
If Not Application.Dialogs(xlDialogOpen).Show Then Exit Sub
Ou bien, si on tient à ce que l'utilisateur choisisse un fichier :
encore:
résultatOK = Application.Dialogs(xlDialogOpen).Show
If Not résultatOK Then
MsgBox "vous devez choisir un fichier"
GoTo encore
End If
Dernier point, pour récupérer le nom du fichier sélectionné, il suffit d'utiliser ActiveWorkbook.FullName :
If Not Application.Dialogs(xlDialogOpen).Show Then Exit Sub
MsgBox "vous avez ouvert le fichier " & ActiveWorkbook.FullName
L'utilisation de Application.Dialogs(xlDialogOpen) est très commode lorsque l'on souhaite effectivement ouvrir un fichier. Si on veut simplement faire choisir un fichier à l'utilisateur, sans forcément avoir besoin de l'ouvrir, il vaut mieux utiliser GetOpenFileName (qui affiche la boite de dialogue, mais n'ouvre pas le fichier sélectionné). La fonction renvoie le nom complet du fichier sélectionné (ou bien False si rien n'a été sélectionné) :
nomfich = Application.GetOpenFilename
If nomfich = False Then Exit Sub
MsgBox "vous avez sélectionné le fichier " & nomfich & _
" qui pèse " & FileLen(nomfich) & " octets"
On peut orienter le choix de l'utilisateur en suggérant un chemin et / ou une extension :
ChDir "c:\mes documents"
nomfich = Application.GetOpenFilename("Feuilles de calcul (*.xls),*.xls")
On aurait pu écrire :
Application.GetOpenFilename("Fichiers texte (*.txt),*.txt") pour sélectionner des fichiers texte.
Enfin, on peut laisser à l'utilisateur la possibilité de sélectionner plusieurs fichiers (cinquième argument à True). La fonction renvoie leurs noms dans un tableau :
Sub taille_des_fichiers()
ChDir "c:\mes documents"
nomfich = Application.GetOpenFilename( , , "choisissez les fichiers", , True)
num = 0
Octt = 0
txt = ""
encore:
num = num + 1
On Error GoTo suite
txt = txt & Chr(10) & nomfich(num)
Octt = Octt + FileLen(nomfich(num))
On Error GoTo 0
GoTo encore
suite:
MsgBox num - 1 & " fichier(s) soit " & Octt & " octets : " & txt
End Sub
La macro ouvre la boite de dialogue, l'utilisateur choisit un ou plusieurs fichiers, et la macro lui indique le poids total des fichiers (en octets).
Dernière technique :
quand on souhaite proposer à l'utilisateur un choix de répertoires, GetOpenFileName n'est pas très adapté : quand un répertoire est sélectionné par l'utilisateur, il est ouvert. Si l'utilisateur valide alors, on peut récupérer le nom du répertoire grace à CurDir. Mais la méthode est mal adaptée quand le répertoire ne contient aucun fichier : la validation est impossible et l'utilisateur doit se rabattre sur "annuler", ce qui manque d'élégance.
La meilleure solution consiste à recourir à la fonction API "SHBrowseForFolder" dont le fonctionnement est présenté dans le § consacré aux API (cliquez ici).