🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA FileDialog dans Excel — FilePicker, FolderPicker et lecture de .SelectedItems

|

VBA FileDialog dans Excel — FilePicker, FolderPicker et lecture de .SelectedItems

TL;DR — Application.FileDialog ouvre 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, msoFileDialogSaveAs ou msoFileDialogOpen. Appelez .Show : la méthode renvoie -1 si l'utilisateur a choisi quelque chose et 0 s'il a annulé — pas le chemin. Le chemin se trouve dans .SelectedItems(1), une collection indexée à partir de 1. FileDialog vous 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, GetOpenFilename et GetSaveAsFilename
  • Les quatre types de boîtes de dialogue et le rôle de chacun
  • Pourquoi .Show renvoie -1 et 0 au lieu de True/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