Excel et VBA : obtenir un nom de fichier avec la boîte de dialogue GetOpenFilename

Le principe de base d’un programme est de traiter des informations de sources diverses. La fonction GetOpenFilename permet de sélectionner un ou plusieurs fichiers à traiter à l’aide d’une boîte de dialogue. Le nom des fichiers sélectionnés est stocké dans une variable ; celle-ci peut ensuite être analysée par le programme VBA.

VBA Excel - Boîte de dialogue GetOpenFilename

Cette fonction s’utilise ainsi :

Dim Nomdufichier as Variant

NomduFichier = Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

La variable associée à la fonction GetOpenFilename (ici Nomdufichier) doit être de type Variant. En effet, cette variable est amenée à stocker :

  • une chaîne de caractères (type String) : le nom d’un ou de plusieurs fichiers selon le choix de l’utilisateur,
  • une résultat booléen (type Boolean) Faux (false) si l’utilisateur ne sélectionne pas de fichier (clic sur le bouton “Annuler”).

Les paramètres de la fonction GetOpenFilename sont les suivants (source : https://msdn.microsoft.com/fr-fr/library/office/ff834966.aspx) :

Nom Obligatoire/Facultatif Type de données Description
FileFilter Facultatif Variant Chaîne spécifiant les critères de filtrage des fichiers.
FilterIndex Facultatif Variant Spécifie les numéros d’index des critères de filtrage des fichiers par défaut, de 1 au nombre de filtres défini dans FileFilter. Si cet argument n’est pas défini ou si sa valeur est supérieure au nombre de filtres présents, le premier filtre de fichiers est utilisé.
Title Facultatif Variant Spécifie le titre de la boîte de dialogue. Si cet argument n’est pas défini, le titre est « Ouvrir ».
ButtonText Facultatif Variant Macintosh uniquement.
MultiSelect Facultatif Variant True pour permettre la sélection de plusieurs noms de fichier. False pour ne permettre la sélection que d’un seul nom de fichier. La valeur par défaut est False.

L’argument FileFilter se compose de paires de chaînes de filtrage des fichiers, suivies de la spécification de filtre de fichiers par caractère générique MS-DOS, les différentes parties et paires étant séparées par des virgules. Chaque paire est répertoriée dans la zone de liste déroulante Type de fichiers. Par exemple, la chaîne suivante spécifie deux filtres de fichiers, à savoir texte et macro complémentaire : « Fichiers texte (*.txt), *.txt,Fichiers de compléments (*.xla), *.xla ». Pour utiliser plusieurs expressions contenant des caractères génériques MS-DOS pour un seul type de filtre de fichiers, séparez les expressions à l’aide de point-virgules. Par exemple, « Fichiers Visual Basic (*.bas; *.txt),*.bas;*.txt ». Si l’argument FileFilter n’est pas défini, sa valeur par défaut est « Tous les fichiers (*.*),*.* ».

Exemple d’utilisation n° 1 : sélection d’un seul fichier

Dim NomFichier as Variant

NomFichier = Application.GetOpenFilename("Fichiers Texte (*.txt),*.txt,Tous les fichiers (*.*),*.* ", 1, "Sélectionnez le fichier des écritures à importer", , False)

If NomFichier = False then Exit Sub

Cet exemple est dédié au traitement de fichiers texte (sélection par défaut du fait du deuxième argument fixé à 1) mais permet également d’ouvrir n’importe quel type de fichiers (*.*). La fenêtre est intitulée “Sélectionnez le fichiers des écritures à importer”. Le quatrième argument n’est pas précisé, celui-ci n’étant paramétrable que sur la version Macintosh. Le dernier paramètre étant False, l’utilisateur ne peut sélectionner qu’un seul fichier.

If NomFichier = False then Exit Sub

Cette ligne de code permet de sortir de la procédure si l’utilisateur a annulé la sélection de fichier (en appuyant sur la touche Echap ou en cliquant sur annuler).

Exemple d’utilisation n° 2 : sélection de plusieurs fichiers

Cet exemple est paramétré pour une multi-sélection (dernier paramètre défini à True). Pour sélectionner plusieurs fichiers, maintenir la touche Ctrl appuyée et cliquer sur les fichiers souhaités.  La variable NomFichier prend alors la forme d’une variable tableau contenant le nom des fichiers retenus (ou d’une variable booléenne si l’utilisateur ferme la fenêtre sans sélectionner un fichier).

Dim NomFichier as Variant
Dim i as Integer

NomFichier = Application.GetOpenFilename("Fichiers Texte (*.txt),*.txt,Tous les fichiers (*.*),*.* ", 1, "Sélectionnez le ou les fichiers des écritures à importer", , True)

If IsArray(NomFichier) = False Then Exit Sub

For i = 1 To UBound(NomFichier)
    MsgBox NomFichier(i)
Next

IsArray(NomFichier) renvoie False si aucun fichier n’a été sélectionné par l’utilisateur (la fonction IsArray détermine si NomFichier est une variable tableau donc Array), dans ce cas le programme sort de la procédure en cours (Exit Sub).

La boucle For… to… Next permet de récupérer la liste des fichiers stockée dans la variable NomFichier, qui dans ce cas fait office de variable tableau. Dans le présent exemple, la boucle redescend toutes les occurrences (de 1 à UBound(NomFichier)) de la variable NomFichier et les affiche à l’écran (MsgBox).

Approfondir le sujet : Programmer en VBA

Share Button
The following two tabs change content below.
Après seize années passées en cabinet d’expertise-comptable et de commissariat aux comptes (où j’ai exercé comme expert-comptable et chef de mission audit), j’ai pris le poste de directeur comptable d’un groupe de distribution automobile en novembre 2014. Au cours de ma carrière, j’ai acquis une expérience significative en audit et en exploitation des systèmes d’information (analyse de données, automatisation des tâches, programmation informatique) au service de la production des comptes annuels et consolidés. C’est cette expérience personnelle et ma passion pour l’informatique que je partage sur ce blog. Mon CV / Réalisations personnelles et projets informatiques / Ma collection / Me contacter

2 commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.