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 :
- Ouvrez Visual Basic Editor (VBE).
- Cliquez sur le menu Outils / Références.
- 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).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
' --- ' SELECTION SIMPLE DE FICHIER ' --- ' Sub SelectionFichier01() 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 ' 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 |
Quelques infos :
- L’objet
FileDialog
est créé par parApplication.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
ouFalse
) 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
(soitTrue
) si l’utilisateur a validé la boîte de dialogue, et0
(soitFalse
) 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é parfd.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 (*.*
).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
' --- ' 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 |
Comme vous le voyez…
- 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. - 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. - 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
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
' --- ' SELECTION DE FICHIER - VARIANTE ' --- ' Sub SelectionFichier03() 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 ' Texte du bouton fd.ButtonName = "Sélectionner" ' Nom du fichier de départ fd.InitialFileName = "test.mdb" ' Type de vue au départ fd.InitialView = msoFileDialogViewLargeIcons ' 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 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
' --- ' SELECTION MULTIPLE DE FICHIERS ' --- ' Sub SelectionFichier04() Dim fd As Office.FileDialog Dim varFichier As Variant Dim strListe As String ' Créer un objet FileDialog Set fd = Application.FileDialog(msoFileDialogOpen) ' Titre de la boîte de dialogue fd.Title = "Sélectionnez un ou plusieurs fichiers ..." ' Autoriser la sélection multiple fd.AllowMultiSelect = True ' 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" ' Présélectionner le 2ème type de fichier (images) fd.FilterIndex = 2 ' Pas de nom par défaut fd.InitialFileName = "" ' Afficher la boîte de dialogue If fd.Show() Then ' Lister les chemins de tous les fichiers sélectionnés strListe = "" For Each varFichier In fd.SelectedItems strListe = strListe & varFichier & vbCrLf Next ' Afficher le résultat MsgBox "Vous avez sélectionné les fichiers suivants : " _ & vbCrLf & strListe, vbInformation End If Set fd = Nothing End Sub |
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 boucleFor Each / Next
pour récupérer chaque fichier.
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…
Merci pour le complément !
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.
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.
bsr,
s’il est possible de m’envoyé des exemples d’applications en vba access2003.
Merci 😀
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
Bonjour,
Merci beaucoup de votre aide ! Y a t-il une suite à ce tutoriel ? Le Stockage et l’affichage des fichiers selectionner ?
Cordialement
Coonax
Gilles > Content que ça marche ! 🙂
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
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à.
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
Hacen > ??? 🙂
Aide Access
Tout cela est très clair et très utile. Merci.
Greg > Si le code de
SelectionFichier02
est dans un moduleListeFichiers
, 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 :
Sub SelectionFichier02()
etEnd Sub
(ces lignes non incluses).Sub Selection_Fichier_Click()
et sonEnd Sub
(en gardant ces lignes).Me![CROQUIS_CHEMIN] = fd.SelectedItem(1)
dans le blocIf 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.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)
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 remplacerMe
parForms![Nom du formulaire]
Ouala !
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 !
Greg > Il faudrait écrire :
Me![Nom du champ à renseigner] = fd.SelectedItems(1)
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 ?
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 :
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