Boîte de dialogue Fichier/Ouvrir

Il est souvent utile d’afficher la boîte de dialogue Fichier/Ouvrir pour permettre à l’utilisateur de sélectionner un fichier (ou même plusieurs) sur son disque dur. Depuis Access 2002, la procédure est simplifiée, grâce à l’objet FileDialog. Voici comment la mettre en pratique…

Avant de commencer…

Pour pouvoir utiliser l’objet FileDialog, il faut lier la bibliothèque Microsoft Office à votre base de données. Pour ça :

  1. Ouvrez Visual Basic Editor (VBE).
  2. Cliquez sur le menu Outils / Références.
  3. Dans la liste, cochez Microsoft Office x.y Object Library (où x.y est le numéro de votre version d’Access, par exemple 11.0 pour Access 2003, 12.0 pour Access 2007, 14.0 pour Access 2010).

Exemple #1 : les bases

Voici un bout de code pour tester tout ça. Vous le recopiez comme d’habitude dans un module standard de votre base de données. Et pour tester, vous cliquez à l’intérieur du bloc de code (n’importe où), puis vous cliquez sur l’icône Exécuter Sub/UserForm, en haut de votre écran de VBE (l’icône qui représente triangle vert).

Quelques infos :

  • L’objet FileDialog est créé par par Application.FileDialog(msoFileDialogOpen). La valeur entre parenthèses indique de quel type de boîte il s’agit (ici : Fichier/Ouvrir). Je parlerai des autres valeurs dans des articles futurs.
  • La propriété Title permet, comme son nom l’indique, de définir le titre de la boîte.
  • La propriété AllowMultiSelect est une valeur booléenne (True ou False) qui indique si on autorise la sélection de plusieurs fichiers. Dans cet exemple, ce sera non.
  • La méthode Show() provoque l’affichage de la boîte. Elle renvoie -1 (soit True) si l’utilisateur a validé la boîte de dialogue, et 0 (soit False) sinon. Dans ce second cas, on ne fait rien de spécial.
  • Si l’utilisateur a pu valider la boîte, c’est qu’il a choisi un ou plusieurs fichiers. La liste de ces fichiers est donnée par la propriété SelectedItems, qui est une collection démarrant à l’indice 1. Dans notre cas, l’utilisateur ne peut sélectionner qu’un seul fichier, dont le nom est donc donné par fd.SelectedItems(1). En fait, on obtient le chemin complet du fichier, pas seulement le nom.

Exemple #2 : gestion des filtres

Dans l’exemple qui suit, j’ai ajouté quelques lignes pour filtrer la liste des fichiers. Je suppose que l’utilisateur ne pourra sélectionner que des images ou des bases de données Access. Éventuellement, il pourra aussi afficher tous les types de fichiers (*.*).

Comme vous le voyez…

  1. On commence par vider la liste des filtres existants à l’aide de l’instruction fd.Filters.Clear. Sinon, tous les filtres proposés par Access seront conservés.
  2. Ensuite, on ajoute 3 filtres personnalisés, à l’aide de fd.Filters.Add. Pour définir un filtre, vous utilisez 2 paramètres : le nom en clair du filtre, et la liste des extensions de fichiers correspondantes (les extensions sont séparées par des points-virgules). Un 3ème paramètre existe ; il permet de préciser la position du filtre dans la liste.
  3. La propriété FilterIndex permet de présélectionner l’un des filtres. Dans notre exemple, c’est le filtre Images qui est concerné (fd.FilterIndex = 2).

Exemple #3 : d’autres réglages !

Voici d’autres petits réglages disponibles dans FileDialog :

Qu’est-ce qui a changé ?

  • La propriété ButtonName permet de changer le texte du bouton principal (ici, on affiche « Sélectionner » au lieu de « Ouvrir« ).
  • La propriété InitialFileName donne le nom du fichier par défaut. Sans doute moyennement utile pour une boîte Fichier/Ouvrir, et plus intéressant pour une boîte Fichier/Enregistrer sous.
  • La propriété InitialView règle le type d’affichage de la boîte (ici : affichage en grandes icônes). La liste des options est proposée par Access devrait être assez explicite (sinon, vous testez !).

Exemple #4 : sélection multiple

Encore un autre exemple, qui montre comment permettre la sélection de plusieurs fichiers dans la boîte, et bien sûr comment récupérer les chemins complets de tous les fichiers choisis par l’utilisateur.

Les nouveautés :

  • Pour autoriser la sélection multiple, on commence par régler à True la propriété AllowMultiSelect.
  • Une fois la sélection faite, la propriété SelectedItems donne la collection (la liste) de tous les fichiers. Il ne reste plus qu’à parcourir cette collection par une boucle For Each / Next pour récupérer chaque fichier.
Info
Pour être complet : la boîte Fichier/Ouvrir n’ouvre pas réellement les fichiers, elle sert surtout à sélectionner ceux-ci. A vous d’enchaîner sur un traitement spécifique ensuite (comme stocker les chemins de fichiers dans une table, importer des fichiers texte, etc.).

Vous aimerez aussi...

22 réponses

  1. Maisonhaute dit :

    Très bon tutoriel, merci.
    Une propriété pratique qui peut servir à d’autres : ouvrir la boite de dialogue dans un dossier déterminé.
    Propriété à utiliser :
    fd.InitialFileName = C:\Test\ ‘Ouvre la boite de dialogue dans le dossier Test
    Attention : ne pas oublier le « \ » à la fin.
    Si on met le nom d’un fichier, ça le présélectionne…

  2. hassen BENYAHIA dit :

    en réponse au post du vendredi 21 août 2009, 18:39 par Noël
    et pour compléter le post du jeudi 11 novembre 2010, 11:22 par Hervé Inisan

    Me![document] = fd.SelectedItems(1) & « # » & fd.SelectedItems(1)
    permet d’insérer dans le champ un lien hypertexte opérationnel 😉

    merci à vous pour votre aide précieuse.

  3. Hervé Inisan dit :

    younesskhadim > Désolé, je ne peux pas envoyer de fichiers en direct (ça ferait trop de demandes). Par contre, il y a quelques bases dans la section « Téléchargement », et plein d’exemples de VBA sur le site.

  4. younesskhadim dit :

    bsr,
    s’il est possible de m’envoyé des exemples d’applications en vba access2003.
    Merci 😀

  5. Hervé Inisan dit :

    Coonax > Il y a plusieurs autres articles du blog qui utilisent la boîte de dialogue, ça devrait donner des pistes.

    Voir ici : http://grenier.self-access.com/?q=FileDialog

  6. Coonax dit :

    Bonjour,
    Merci beaucoup de votre aide ! Y a t-il une suite à ce tutoriel ? Le Stockage et l’affichage des fichiers selectionner ?

    Cordialement

    Coonax

  7. Hervé Inisan dit :

    Gilles > Content que ça marche ! 🙂

  8. Gilles dit :

    Super, c’était bien cela !
    Désolé de n’avoir pas mieux ouvert les yeux la 1re fois…
    Merci de votre réponse (et de votre rapidité…)
    Cordialement
    Gilles

  9. Hervé Inisan dit :

    Gilles > En plus de « Microsoft Access 12.0 Object Library », il faut bien cocher « Microsoft Office 12.0 Object Library » (voir la ligne bleue sur la capture d’écran). Le problème doit venir de là.

  10. Gilles dit :

    Bonjour
    J’ai essayé de faire comme indiqué, mais cela ne fonctionne pas (avec Access 2007)!
    Je commence bien par cocher Outils/Références/Microsoft Access 12.0 Object Library
    Je copie le code indiqué (SelectionFichier01).
    Cela me crée alors une erreur de compilation :
    « Type défini par l’utilisateur non défini ».
    Et si je mets cette ligne en commentaire pour exécuter le code sans déclarer la variable fd, j’arrive à une erreur d’exécution :
    « La méthode ‘FileDialog’ de l’objet « _Application’ a échoué’.
    Y a-t-il un autre paramétrage à effectuer pour faire fonctionner cette boite de dialogue.
    Merci d’avance
    Gilles

  11. Hervé Inisan dit :

    Hacen > ??? 🙂

  12. Hacen dit :

    Aide Access

  13. Aurélien dit :

    Tout cela est très clair et très utile. Merci.

  14. Hervé Inisan dit :

    Greg > Si le code de SelectionFichier02 est dans un module ListeFichiers, il n’est effectivement pas dans le module du formulaire. Le code du bouton l’est, par contre.

    Voici un aménagement qui doit marcher :

    1. Copier ce qui est entre Sub SelectionFichier02() et End Sub (ces lignes non incluses).
    2. Coller ce bloc entre le Sub Selection_Fichier_Click() et son End Sub (en gardant ces lignes).
    3. Ajouter la ligne Me![CROQUIS_CHEMIN] = fd.SelectedItem(1) dans le bloc If fd.Show(1) Then ... End If.

    Dans ce cas, le module ListeFichiers n’est plus utile, on ne l’utilise plus puisque le code se trouve maintenant dans le formulaire.

  15. Greg dit :

    Bon sang… J’essaie pourtant de comprendre, et de ne pas faire de simples copier/coller….

    Ca ne fonctionne toujours pas, malgré votre aide et votre patience…

    J’ai donc un module, nommé ListeFichiers :
    ‘ —
    ‘ SELECTION DE FICHIER AVEC FILTRE
    ‘ —

    Sub SelectionFichier02()
    Dim fd As Office.FileDialog

    ‘ Créer un objet FileDialog
    Set fd = Application.FileDialog(msoFileDialogOpen)

    ‘ Titre de la boîte de dialogue
    fd.Title = « Sélectionnez un fichier… »

    ‘ Ne pas autoriser la sélection multiple
    ‘ (donc 1 seul fichier est sélectionnable à la fois)
    fd.AllowMultiSelect = False

    ‘ Définir les types de fichiers autorisés
    fd.Filters.Clear
    fd.Filters.Add « Tous les fichiers », « *.* »
    fd.Filters.Add « Images », « *.gif; *.jpg; *.jpeg; *.png; *.bmp »
    fd.Filters.Add « Bases de données », « *.mdb; *.mde; *.mda; *.accdb; *.accde »

    ‘ Présélectionner le 2ème type de fichier (images)
    fd.FilterIndex = 2

    ‘ Afficher la boîte de dialogue
    If fd.Show() Then
    MsgBox « Vous avez sélectionné le fichier :  » _
    & vbCrLf & fd.SelectedItems(1), vbInformation
    End If
    Set fd = Nothing
    End Sub

    Puis, dans mon formulaire, un bouton, avec une procédure événementielle :
    Private Sub selection_fichier_Click()
    SelectionFichier02
    If fd.Show() Then
    Me![CROQUIS_CHEMIN] = fd.SelectedItem(1)
    End If
    End Sub

    Je ne pense donc pas que SelectionFichier02 se trouve dans le formulaire (et je ne sais d’ailleurs pas comment le rajouter si je le voulais »

    Un dernier coup de main ? Après, promis, je me rabat sur les OLE intégrés qui alourdiront ma base en quelques jours :o)

  16. Hervé Inisan dit :

    Greg > En fait, il faudrait que l’affectation du chemin soit aussi dans SelectionFichier02, si on garde cette base. Du style :

    Et si SelectionFichier02 ne se trouve pas dans le formulaire appelant, il faut remplacer Me par Forms![Nom du formulaire]

    Ouala !

  17. Greg dit :

    Merci pour votre réponse.
    Mais j’obtiens une erreur « Variable non définie » 🙁
    Je dois faire quelque chose de travers…
    J’ai mis le code que vous ma’vez indiqué en évènement « sur clic », c’est bien ça ?
    Mon code, pour le bouton de sélection est donc le suivant :
    Private Sub selection_fichier_Click()
    SelectionFichier02
    Me![CROQUIS_CHEMIN] = fd.SelectedItem(1)
    End Sub

    Merci encore pour votre aide !

  18. Hervé Inisan dit :

    Greg > Il faudrait écrire :

    Me![Nom du champ à renseigner] = fd.SelectedItems(1)

  19. Greg dit :

    Ouhh que je galère :o)
    Merci pour toutes vos astuces.
    J’ai réussit à créer un bouton, qui ouvre correctement la boîte de dialogue permettant de sélectionner un fichier.
    Mais comment faire pour que le chemin du fichier sélectionnée se copie dans un champ présent sur le formulaire ?

  20. Hervé Inisan dit :

    Noël > Il y a un exemple (à adapter) dans cet autre article du blog. Dans l’exemple, on stocke le nom « brut » du fichier. Il ne s’agit pas d’un lien hypertexte (un lien hypertexte doit avoir un formatage particulier). Mais c’est sans doute plus pratique de stocker sans lien hypertexte parce que :

    1. Ça ne nécessite pas de traitement particulier.
    2. Ça ne perturbe pas l’exportation du chemin sous d’autres formats (vers un CSV, vers Word, Excel…)
    3. S’il faut simuler le lien hypertexte, il y a toujours la possibilité d’utiliser FollowHyperlink.
  21. Noël dit :

    Bonjour,
    Je cherche depuis pas mal de temps et puis rien…
    J’ai compris comment on pouvait sélectionner le nom d’un fichier sur un disque dur. Mais comment faire pour copier le lien dans un champ d’une table Access.
    J’ai base de donnée d’articles et j’ai un champs hyperlien pour y stocker le chemin du fichier de la fiche technique de ce produit qui permet d’ouvrir ce fichier.
    Je vous remercie de votre attention.
    Noël

Laisser un commentaire

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