TL;DR —
Application.FileDialogouvre le sélecteur Windows standard pour que l'utilisateur choisisse un fichier ou un dossier au lieu que vous codiez un chemin en dur. Choisissez un type —msoFileDialogFilePicker,msoFileDialogFolderPicker,msoFileDialogSaveAsoumsoFileDialogOpen. Appelez.Show: la méthode renvoie-1si l'utilisateur a choisi quelque chose et0s'il a annulé — pas le chemin. Le chemin se trouve dans.SelectedItems(1), une collection indexée à partir de 1.FileDialogvous donne un chemin ; c'est encore à vous de l'ouvrir ou de l'enregistrer.
Sub PickAFile()
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "Choose a workbook"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel Files", "*.xlsx;*.xlsm"
If .Show <> -1 Then Exit Sub ' -1 = selectionne, 0 = annule
MsgBox "You picked: " & .SelectedItems(1) ' collection indexee a partir de 1
End With
End Sub
Coder en dur "C:\Users\Me\Reports\Jan.xlsx" dans une macro est le moyen le plus sûr de la casser dès l'instant
où quelqu'un d'autre l'exécute. Le réflexe professionnel, c'est de demander. VBA vous donne trois outils pour cela, et l'idée
commune à tous mérite d'être clarifiée d'emblée : ces outils renvoient une chaîne de chemin — ils n'ouvrent,
n'enregistrent ni ne touchent aucun fichier. Obtenir le chemin et agir sur le chemin sont deux étapes distinctes.
FileDialog est le plus complet des trois, car c'est le seul à pouvoir aussi demander un dossier.
Ce que vous allez apprendre
- Le modèle mental qui relie
FileDialog,GetOpenFilenameetGetSaveAsFilename - Les quatre types de boîtes de dialogue et le rôle de chacun
- Pourquoi
.Showrenvoie-1et0au lieu deTrue/False, et comment le tester - Comment lire le résultat dans
.SelectedItems, une collection indexée à partir de 1 - Sélectionner un dossier avec
FolderPicker— ce que les fonctions plus simples ne savent pas faire - Autoriser la sélection multiple, ajouter des filtres, et le piège de la réinitialisation de l'objet partagé
Le modèle mental : un sélecteur configurable que vous lisez ensuite
Application.FileDialog n'est pas une fonction qui renvoie un chemin. C'est un objet que vous configurez, affichez,
puis lisez. Le déroulement suit toujours les trois mêmes temps :
Set fd = Application.FileDialog(msoFileDialogFilePicker) ' 1. choisir le TYPE
' ... definir .Title, .Filters, .AllowMultiSelect ... ' 2. le configurer
If fd.Show = -1 Then answer = fd.SelectedItems(1) ' 3. afficher, puis lire la selection
.Show bloque l'exécution jusqu'à ce que l'utilisateur clique sur un bouton, puis renvoie un état, pas le chemin. Le chemin — ou
les chemins — arrivent dans .SelectedItems. Gardez ces deux idées bien distinctes et l'objet tout entier devient limpide : afficher la
boîte de dialogue et lire le choix sont deux lignes différentes. Tout le reste de cette page se résume à choisir le bon type et
à savoir lire le résultat.
Les quatre types de boîtes de dialogue
Vous définissez le rôle de la boîte de dialogue par la constante que vous passez à Application.FileDialog(...) :
Application.FileDialog(msoFileDialogFilePicker) ' choisir un ou plusieurs fichiers existants
Application.FileDialog(msoFileDialogFolderPicker) ' choisir un dossier (pas de fichier)
Application.FileDialog(msoFileDialogOpen) ' comme FilePicker, avec en plus un .Execute qui ouvre
Application.FileDialog(msoFileDialogSaveAs) ' choisir un chemin et un nom d'enregistrement
Pour 90 % des macros, vous voudrez msoFileDialogFilePicker (obtenir un fichier à lire) ou msoFileDialogFolderPicker
(obtenir un dossier à parcourir). Les types Open et SaveAs embarquent une méthode .Execute supplémentaire qui
effectue réellement l'ouverture ou l'enregistrement, mais vous en avez rarement besoin — lire le chemin et appeler
vous-même Workbooks.Open ou SaveAs est plus clair et
vous laisse la maîtrise de ce qui se passe ensuite.
Pourquoi .Show renvoie -1 et 0
C'est le détail qui piège ceux qui s'attendent à ce que .Show renvoie le chemin choisi. La méthode renvoie un
état entier :
If fd.Show = -1 Then
' l'utilisateur a clique sur OK / Ouvrir / Enregistrer - une selection existe
Else
' l'utilisateur a clique sur Annuler - .SelectedItems est vide, ne PAS la lire
End If
-1 signifie qu'une sélection a été faite ; 0 signifie que l'utilisateur a annulé. Il se trouve que -1 correspond à ce que VBA appelle True,
si bien que If fd.Show = -1 et If fd.Show fonctionnent tous les deux — mais écrivez = -1, car cela dit ce que le nombre
signifie. La moitié importante, c'est le Else : si l'utilisateur a annulé, .SelectedItems est vide, et
SelectedItems(1) déclenche une erreur d'exécution. Protégez-vous toujours contre l'annulation avant de lire.
Lire le résultat : SelectedItems est indexée à partir de 1
Le choix de l'utilisateur est une collection, .SelectedItems, et comme toute collection VBA, elle compte à partir de 1,
pas de 0 :
If fd.Show = -1 Then
Dim i As Long
For i = 1 To fd.SelectedItems.Count ' les collections sont indexees a partir de 1
Debug.Print fd.SelectedItems(i) ' chaque element est une chaine de chemin complete
Next i
End If
Pour la sélection d'un seul fichier, .SelectedItems(1) suffit à tout dire. La boucle For i = 1 To .Count ne
compte vraiment que lorsque vous activez la sélection multiple — et commencer cette boucle à 0 est le classique décalage d'indice qui
déclenche « Subscript out of range ». Chaque élément est un chemin complet que vous pouvez passer directement à
Workbooks.Open, Dir ou à un
FileSystemObject.
Sélectionner un dossier — ce que seul FileDialog sait faire
Voici la raison pour laquelle FileDialog mérite sa place aux côtés des fonctions plus simples :
GetOpenFilename ne peut renvoyer qu'un fichier. Quand vous avez besoin d'un dossier — pour
parcourir tous les classeurs qu'il contient, par exemple — FolderPicker est l'outil qu'il vous faut :
Sub PickAFolder()
Dim fd As FileDialog, folderPath As String
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
If fd.Show <> -1 Then Exit Sub
folderPath = fd.SelectedItems(1)
If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\" ' normaliser
MsgBox "Chosen folder: " & folderPath
End Sub
Le dossier est renvoyé sans barre oblique inverse finale ; donc si vous vous apprêtez à y ajouter un nom de fichier
(folderPath & "Report.xlsx"), ajoutez le \ vous-même — l'oublier est le bug numéro un des
macros qui parcourent des dossiers. À partir de là, Dir(folderPath & "*.xlsx") parcourt tous les classeurs du dossier.
Sélection multiple, filtres et piège de la réinitialisation
Deux réglages couvrent l'essentiel du reste. AllowMultiSelect = True laisse l'utilisateur choisir plusieurs fichiers, ce qui est
précisément là où la boucle For i = 1 To .Count vue plus haut prend tout son sens. Les filtres restreignent ce que la boîte de dialogue affiche :
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = True
.Filters.Clear ' REINITIALISER d'abord - voir plus bas
.Filters.Add "Spreadsheets", "*.xlsx;*.xlsm;*.xls"
.Filters.Add "All Files", "*.*"
If .Show = -1 Then MsgBox .SelectedItems.Count & " file(s) chosen"
End With
Le piège qui mérite d'être nommé : Application.FileDialog est un objet unique partagé. Les filtres et réglages d'un
appel précédent peuvent encore s'y trouver. Appelez toujours .Filters.Clear avant d'ajouter les vôtres, et définissez
.AllowMultiSelect explicitement à chaque fois, sinon un réglage résiduel d'un moment antérieur de la session se glisse dans votre
boîte de dialogue. Traiter l'objet comme neuf alors qu'il est en réalité partagé est un bug discret et difficile à reproduire.
FileDialog ou GetOpenFilename ? Choisissez selon ce que vous voulez récupérer
Si vous avez besoin d'un dossier, ou si vous voulez la boîte de dialogue la plus riche (sélection multiple et filtres fins),
FileDialog est la réponse. Si vous avez simplement besoin d'un chemin de fichier à lire,
GetOpenFilename tient en une seule ligne et renvoie le chemin directement — sans objet,
sans .SelectedItems. Si vous avez besoin d'un chemin où enregistrer, c'est
GetSaveAsFilename. Les trois obéissent à la même règle : ils vous donnent un chemin,
et l'ouvrir ou l'enregistrer reste la ligne suivante, à votre charge.
Comment ExcelMaster vous aide
Les deux erreurs de cette page sont silencieuses : lire .SelectedItems après que l'utilisateur a annulé (une
erreur d'exécution), et oublier la barre oblique inverse finale quand vous construisez un chemin à partir d'un dossier choisi (un fichier
écrit au mauvais endroit). Toutes deux sont faciles à écrire et pénibles à retrouver.
ExcelMaster vous laisse décrire l'étape
en mots simples — « laisse-moi choisir un dossier, puis ouvre chaque classeur qu'il contient » — et il écrit le
code FileDialog qui protège contre l'annulation, normalise le chemin et parcourt les fichiers correctement. Vous conservez le
classeur et le code, et vous évitez le décalage d'indice.
Questions fréquentes
Comment ouvrir une boîte de dialogue de fichier en VBA Excel ?
Créez l'objet avec Set fd = Application.FileDialog(msoFileDialogFilePicker), configurez-le (.Title,
.Filters, .AllowMultiSelect), puis appelez fd.Show. .Show renvoie -1 si l'utilisateur a choisi quelque chose
et 0 s'il a annulé. Lisez le chemin choisi dans fd.SelectedItems(1). Notez que cela ne renvoie que
le chemin — c'est encore à vous d'appeler Workbooks.Open pour l'ouvrir.
Comment laisser l'utilisateur sélectionner un dossier en VBA ?
Utilisez Application.FileDialog(msoFileDialogFolderPicker). C'est la seule boîte de dialogue de fichier qui renvoie un
dossier plutôt qu'un fichier — GetOpenFilename ne sait pas le faire. Après
If fd.Show = -1 Then, lisez fd.SelectedItems(1) pour obtenir le chemin du dossier, et ajoutez une barre oblique inverse avant d'y
ajouter un nom de fichier, car le dossier est renvoyé sans \ final.
Pourquoi FileDialog.Show renvoie-t-il -1 au lieu du chemin du fichier ?
Parce que .Show renvoie un état, pas le chemin : -1 signifie que l'utilisateur a fait une sélection, 0 signifie qu'il a
annulé. Le chemin sélectionné (ou les chemins) se trouvent dans la collection .SelectedItems. Testez d'abord If fd.Show = -1 Then, et ne lisez .SelectedItems(1) que lorsqu'il vaut -1, car après une annulation cette collection est
vide et l'indexer déclenche une erreur.
Comment sélectionner plusieurs fichiers avec FileDialog ?
Définissez .AllowMultiSelect = True avant d'appeler .Show. Quand l'utilisateur choisit plusieurs fichiers, faites une boucle
For i = 1 To fd.SelectedItems.Count et lisez chaque chemin avec fd.SelectedItems(i). La collection est
indexée à partir de 1 ; commencez donc la boucle à 1, pas à 0 — commencer à 0 déclenche « Subscript out of range ».
Quelle est la différence entre FileDialog et GetOpenFilename ?
GetOpenFilename est une fonction d'une seule ligne qui renvoie une chaîne de chemin de fichier (ou
False en cas d'annulation) — la plus simple quand vous avez juste besoin d'un fichier à lire. FileDialog est un objet configurable
qui peut aussi choisir des dossiers, offrir une sélection multiple plus riche et (via .Execute) ouvrir ou enregistrer directement. Utilisez
GetOpenFilename dans le cas courant, FileDialog quand vous avez besoin d'un dossier ou de la maîtrise supplémentaire.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 26/09/2026.
Guides associés : VBA GetOpenFilename · VBA GetSaveAsFilename · VBA Open Workbook · VBA Dir · VBA FileSystemObject · VBA For Each
