TL;DR —
Application.GetOpenFilenameaffiche la boîte de dialogue Ouvrir et renvoie le chemin choisi par l'utilisateur sous forme de chaîne — elle n'ouvre pas le fichier. Pour l'ouvrir réellement, vous devez encore appelerWorkbooks.Open. Quand l'utilisateur clique sur Annuler, elle renvoie le booléenFalse; déclarez donc la variableAs Variant(jamaisAs String) et testezIf fname = False Then Exit Subavant de l'utiliser.
Sub AskThenOpen()
Dim fname As Variant ' Variant, pour que l'annulation puisse renvoyer False
fname = Application.GetOpenFilename( _
"Excel Files (*.xlsx;*.xlsm), *.xlsx;*.xlsm", , "Choose a workbook")
If fname = False Then Exit Sub ' l'utilisateur a annule
Workbooks.Open fname ' GetOpenFilename n'a donne que le chemin
End Sub
GetOpenFilename est le moyen le plus court d'arrêter de coder des chemins en dur. Elle affiche la boîte de dialogue Ouvrir familière, laisse
l'utilisateur naviguer et vous renvoie ce qu'il a choisi. Mais deux faits à son sujet sont à l'origine de la plupart des questions en ligne,
et tous deux viennent du même malentendu : cette fonction renvoie un chemin — elle n'ouvre pas le fichier,
et elle n'échoue pas bruyamment quand l'utilisateur annule. Assimilez ces deux points et c'est une fonction d'une ligne que vous
utiliserez sans cesse.
Ce que vous allez apprendre
- Le modèle mental qui relie
GetOpenFilename,GetSaveAsFilenameetFileDialog - Pourquoi elle renvoie un chemin, et non un classeur ouvert — et la ligne que vous devez encore écrire
- Le piège de l'annulation : elle renvoie
False, la variable doit donc êtreAs Variant - La syntaxe de
FileFilter, avec plusieurs extensions et plusieurs groupes de filtres - Renvoyer plusieurs chemins d'un coup avec
MultiSelect:=True(un tableau indexé à partir de 1) - Quand
GetOpenFilenamesuffit et quand passer àFileDialog
Le modèle mental : un pense-bête qui demande « quel fichier ? »
Voyez GetOpenFilename comme le fait de tendre à l'utilisateur un pense-bête qui demande « quel fichier ? » — il y inscrit un
chemin et vous le rend. C'est tout ce qu'elle fait. Elle ne va pas fouiller dans l'armoire à dossiers pour en sortir le fichier :
fname = Application.GetOpenFilename(...) ' renvoie une chaine de CHEMIN, p. ex. "C:\Data\Jan.xlsx"
Workbooks.Open fname ' c'est VOUS qui ouvrez
Le signalement « GetOpenFilename ne fonctionne pas » le plus fréquent signifie en réalité « je l'ai appelée et mon fichier ne s'est pas ouvert ». Bien sûr que non — vous avez obtenu le chemin ; l'ouvrir est une ligne à part. Une fois que vous avez intégré que demander un chemin et agir sur le chemin sont deux étapes, la fonction devient simple et prévisible.
Le piège de l'annulation : renvoie False, donc Dim As Variant
C'est celui qui fait le plus mal. Quand l'utilisateur clique sur Annuler, GetOpenFilename renvoie la valeur
booléenne False. Cela vous impose un choix au moment de déclarer la variable :
Dim fname As Variant ' CORRECT - peut contenir un chemin String OU le booleen False
' Dim fname As String ' FAUX - False est converti en texte "False"
Si vous déclarez fname As String, VBA convertit silencieusement le False renvoyé en la chaîne "False", de sorte que
If fname = False ne se déclenche jamais et votre code poursuit avec un « chemin » bidon nommé False. La déclarer
As Variant conserve le booléen en tant que booléen, si bien que If fname = False Then Exit Sub intercepte réellement
l'annulation. C'est exactement le même piège que la lecture d'un InputBox annulé — le remède est
le même : conservez le résultat dans un Variant et vérifiez le type de réponse obtenu avant de vous y fier.
Le FileFilter : description, virgule, motif
Le premier argument contrôle quels fichiers la boîte de dialogue affiche. Sa forme est une description, une virgule, puis le motif — et vous pouvez enchaîner plusieurs groupes :
' Un seul groupe : le libelle, puis le ou les motifs
fname = Application.GetOpenFilename("Text Files (*.txt), *.txt")
' Plusieurs extensions dans un meme groupe : separez les motifs par un point-virgule
fname = Application.GetOpenFilename("Excel Files (*.xlsx;*.xlsm), *.xlsx;*.xlsm")
' Plusieurs groupes entre lesquels l'utilisateur peut basculer : separez par une virgule les paires libelle/motif
fname = Application.GetOpenFilename( _
"Excel Files, *.xlsx;*.xlsm, CSV Files, *.csv, All Files, *.*")
À l'intérieur d'un même filtre, plusieurs extensions se relient par des points-virgules (*.xlsx;*.xlsm). Pour proposer plusieurs
filtres entre lesquels l'utilisateur peut basculer dans la liste déroulante, séparez par une virgule les paires libellé/motif. Le deuxième
argument facultatif, FilterIndex, choisit le groupe sélectionné par défaut ; le troisième, Title, définit le
titre de la boîte de dialogue. Bien appliquer la règle virgule/point-virgule, c'est ce qui distingue un filtre qui fonctionne
d'un filtre qui n'affiche rien.
Plusieurs fichiers : MultiSelect renvoie un tableau indexé à partir de 1
Passez MultiSelect:=True et le type de retour change : au lieu d'une seule chaîne de chemin, vous obtenez un tableau de
chemins — ou encore False si l'utilisateur a annulé :
Sub OpenSeveral()
Dim files As Variant, i As Long
files = Application.GetOpenFilename( _
"Excel Files, *.xlsx;*.xlsm", , , , True) ' dernier argument = MultiSelect
If Not IsArray(files) Then Exit Sub ' False (annulation) n'est pas un tableau
For i = LBound(files) To UBound(files) ' le tableau est indexe a partir de 1
Workbooks.Open files(i)
Next i
End Sub
Deux détails comptent. Testez IsArray(files) plutôt que = False, car en cas de succès vous détenez désormais un tableau,
pas une chaîne. Et parcourez avec LBound à UBound — le tableau que renvoie GetOpenFilename
commence à 1, et coder For i = 1 To ... en dur fonctionne par hasard ici, mais LBound/UBound est l'habitude
qui ne trahit jamais. Chaque élément est un chemin complet prêt pour Workbooks.Open.
GetOpenFilename ou FileDialog ? Choisissez selon vos besoins
Pour la tâche de tous les jours — demander un fichier à lire — GetOpenFilename l'emporte par sa simplicité : une ligne, le
chemin revient directement, aucun objet à configurer. Passez à FileDialog quand vous
avez besoin d'un dossier (GetOpenFilename ne peut pas en choisir), quand vous voulez la maîtrise plus riche de l'objet, ou
quand vous préférez lire depuis .SelectedItems. Pour demander où enregistrer plutôt que quoi ouvrir, la
fonction miroir est GetSaveAsFilename. Les trois partagent la même règle : elles
renvoient un chemin, et l'ouverture ou l'enregistrement est la ligne suivante.
Comment ExcelMaster vous aide
Les deux erreurs ici sont du genre discret : déclarer le résultat As String (l'annulation passe alors sous forme du
texte "False"), et s'attendre à ce que le fichier s'ouvre alors que vous n'avez reçu qu'un chemin. Toutes deux compilent sans problème et
échouent à l'exécution sur la machine de quelqu'un d'autre.
ExcelMaster vous laisse dire ce que vous
voulez — « demande-moi un CSV, puis importe-le dans une nouvelle feuille » — et il écrit l'appel GetOpenFilename avec
le bon filtre, la protection Variant contre l'annulation et le Workbooks.Open (ou l'import) qui agit réellement sur
le chemin. Vous conservez le classeur et le code.
Questions fréquentes
Comment utiliser GetOpenFilename en VBA Excel ?
Appelez fname = Application.GetOpenFilename(fileFilter, filterIndex, title). Déclarez fname As Variant, et
testez If fname = False Then Exit Sub pour intercepter une annulation. En cas de succès, fname contient le chemin choisi sous forme de
chaîne — passez-le à Workbooks.Open pour l'ouvrir. GetOpenFilename elle-même ne renvoie
que le chemin ; elle n'ouvre rien.
Pourquoi GetOpenFilename n'ouvre-t-il pas le fichier ?
Parce que ce n'est pas son rôle — elle renvoie le chemin que l'utilisateur a sélectionné et s'arrête là. Ouvrir le fichier
est une étape distincte : Workbooks.Open fname pour un classeur, ou un FileSystemObject
/ Dir pour d'autres fichiers. La boîte de dialogue demande seulement « quel fichier ? » ; agir sur la réponse relève de
votre code.
Comment vérifier si l'utilisateur a cliqué sur Annuler dans GetOpenFilename ?
Déclarez la variable As Variant et testez If fname = False Then Exit Sub. En cas d'annulation, la fonction renvoie
le booléen False ; en cas de succès, elle renvoie une chaîne de chemin. Si vous déclarez plutôt la variable As String,
False est converti en le texte "False", la vérification ne se déclenche jamais, et la macro continue avec un chemin
invalide.
Comment sélectionner plusieurs fichiers avec GetOpenFilename ?
Passez MultiSelect:=True (le cinquième argument). La valeur de retour devient un tableau de chaînes de chemins, ou
False en cas d'annulation. Testez d'abord IsArray(result), puis faites une boucle For i = LBound(result) To UBound(result)
et ouvrez chaque result(i). Comme le type de retour devient un tableau, ne testez pas = False pour
l'annulation — utilisez IsArray.
Quelle est la syntaxe de FileFilter dans GetOpenFilename ?
Chaque filtre est une description suivie d'une virgule et d'un motif : "Excel Files (*.xlsx), *.xlsx". Reliez
plusieurs extensions dans un même filtre par des points-virgules : "*.xlsx;*.xlsm". Proposez plusieurs filtres en
séparant par une virgule les paires libellé/motif : "Excel, *.xlsx, CSV, *.csv, All, *.*". L'argument facultatif
FilterIndex définit celui qui est sélectionné par défaut.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 26/09/2026.
Guides associés : VBA FileDialog · VBA GetSaveAsFilename · VBA Open Workbook · VBA InputBox · VBA Dir · VBA UBound
