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

VBA GetOpenFilename dans Excel — obtenez un chemin de fichier, puis ouvrez-le vous-même

|

VBA GetOpenFilename dans Excel — obtenez un chemin de fichier, puis ouvrez-le vous-même

TL;DR — Application.GetOpenFilename affiche 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 appeler Workbooks.Open. Quand l'utilisateur clique sur Annuler, elle renvoie le booléen False ; déclarez donc la variable As Variant (jamais As String) et testez If fname = False Then Exit Sub avant 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, GetSaveAsFilename et FileDialog
  • 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 être As 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 GetOpenFilename suffit 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