par , 11/03/2020 à 22h50 (5154 Affichages)
On décrit dans ce billet une méthode pour gérer vos pièces jointes, consistant à enregistrer les chemins de vos fichiers dans la base Access plutôt que d'utiliser un champ de type pièce jointe.
On utilise pour cela FileDialog qui permet de choisir un fichier ou un dossier sur le disque à l'aide d'une boîte de dialogue.
Cette méthode a l'avantage de ne pas alourdir la base en gardant les fichiers à l'extérieur, mais nécessite cependant de prendre certaines précautions.
I - Précautions à prendre
I.1 - Enregistrer toutes vos pièces jointes dans un même dossier
Ce répertoire principal destiné à regrouper vos fichiers peut bien entendu contenir des sous-dossiers.
Cela permet une meilleure gestion de vos fichiers, et, notamment, en cas de déplacements de vos fichiers, par exemple dans un dossier partagé situé sur un serveur, de mettre à jour facilement les chemins des fichiers enregistrés dans la base.
Exemple :
On remplace l'ancien dossier "C:\Gestion Pièces jointes\Pièces jointes\" par le nouveau "C:\Data\Gestion Pièces jointes\Pièces jointes\" dans les chemins des fichiers :
ancien chemin:
C:\Gestion Pièces jointes\Pièces jointes\Courrier.docx
nouveau chemin:
C:\Data\Gestion Pièces jointes\Pièces jointes\Courrier.docx
I.2 - Utiliser une table pour enregistrer l'adresse du dossier contenant vos fichiers
C'est utile pour accéder directement au dossier depuis Access, ou pour changer facilement les chemins des fichiers saisis, en cas de déplacement de ceux-ci dans un autre répertoire.
II - FileDialog
Il permet, entre autres, à l'utilisateur de sélectionner un fichier ou un dossier dans une boîte de dialogue.
Synthaxe VBA
applicationn.FileDialog (fileDialogType)
Paramètres fileDialogType :
Paramètre |
Valeur de la constante |
Description |
msoFileDialogFilePicker |
3 |
Permet à l'utilisateur de sélectionner un fichier |
msoFileDialogFolderPicker |
4 |
Permet à l'utilisateur de sélectionner un dossier |
... |
... |
... |
Par commodité, on utilise par la suite dans le code VBA du Late Binding, qui ne nécessite pas de référencement de librairie.
III - Tables principales
III.1 - T_Dossier
Table permettant d'enregistrer le chemin du dossier contenant les fichiers.
Nom du champ |
Type du champ |
Description |
CheminDossier |
Texte |
Chemin du dossier contenant les pièces jointes |
III.2 - T_PieceJointe
Permet d'enregistrer les chemins des pièces jointes.
Nom du champ |
Type du champ |
Description |
IdPieceJointe |
Numéro-auto |
Identifiant de la pièce jointe |
IdFiche |
Entier long |
Identifiant de la fiche associée |
CategoriePieceJointe |
Texte |
Catégorie de la pièce jointe (Document, Tableau, Image, Vidéo, etc..) |
CheminFichier |
Texte |
Chemin du fichier sur le disque |
IV - Interface Access
Un formulaire principal pour sauvegarder les fiches clients et un sous-formulaire pour enregistrer les chemins des fichiers associés à ces fiches.

V - Sous-formulaire pour enregistrer les pièces jointes

Il est relié à la table T_PieceJointe et permet d'enregistrer les chemins des fichiers dans cette table. Le champ IdFiche sert à faire le lien avec le formulaire principal.
Boutons de commande pour gérer les pièces jointes :
- Choix de la pièce jointe ;
- Ouverture de la pièce jointe ;
- Suppression de la pièce jointe.
V.1 - Procédure sur clic du bouton permettant de choisir le fichier sur le disque
On choisit le fichier sur le disque avec FileDialog, et on met à jour le champ avec le chemin du fichier sélectionné :
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
| Private Sub CmdChoisirFichier_Click()
Dim fd As Object ' Office.FileDialog
' Créer un objet FileDialog pour choisir un fichier
Set fd = Application.FileDialog(3) ' msoFileDialogFilePicker : 3
' 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
' Effacer les filtres précédents
fd.Filters.Clear
' Afficher la boîte de dialogue
If fd.Show() Then ' on a sélectionné un fichier
Me.CheminFichier = fd.SelectedItems(1) ' on met à jour le champ avec le chemin sélectionné
End If
' On libère la variable objet
Set fd = Nothing
End Sub |
V.2 - Procédure sur clic du bouton pour ouvrir le fichier enregistré sur le disque
On ouvre, avec la fonction Shell, le fichier dont le chemin est enregistré dans le champ CheminFichier :
1 2 3 4 5
| Private Sub CmdOuvrirFichier_Click()
If Nz(Me.CheminFichier.Value, "") <> "" Then ' si un chemin est enregistré dans le champ CheminFichier
Shell "explorer.exe " & Chr(34) & Me.CheminFichier.Value & Chr(34), vbMaximizedFocus ' on ouvre le fichier avec son chemin
End If
End Sub |
VI - Formulaire pour choisir ou ouvrir le dossier contenant les fichiers

VI.1 - Procédure sur clic du bouton de commande permettant de choisir un nouveau dossier avec FileDialog
On choisit le dossier sur le disque avec FileDialog, et on met à jour le champ avec le chemin du dossier sélectionné :
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
| Private Sub CmdChoisirDossier_Click()
Dim fd As Object ' Office.FileDialog
Dim sCheminDossier As String
' Créer un objet FileDialog pour sélectionner un dossier
Set fd = Application.FileDialog(4) ' msoFileDialogFolderPicker : 4
' Titre de la boîte de dialogue
fd.Title = "Sélectionnez un dossier..."
' Ne pas autoriser la sélection multiple
' (donc 1 seul fichier est sélectionnable à la fois)
fd.AllowMultiSelect = False
' Effacer les anciens filtres
fd.Filters.Clear
' Afficher la boîte de dialogue
If fd.Show() Then ' si un choix a été effectué
sCheminDossier = Nz(Me.CheminDossier, "") ' on copie le chemin du dossier dans la variable
Me.CheminDossier = fd.SelectedItems(1) ' le dossier sélectionné devient le nouveau
UpdateCheminsFichiers sCheminDossier, Me.CheminDossier ' on met à jour les chemins des fichiers dans la base
End If
' On libère la mémoire
Set fd = Nothing
End Sub |
Si les fichiers sont sur un serveur, il faut que le chemin du dossier soit de la forme \\NomDuServeur\NomDuPartage\Dossier\.
VI.2 - Procédure sur clic du bouton de commande permettant d'ouvrir le dossier contenant les fichiers
On ouvre, avec la fonction Shell, le dossier dont le chemin est enregistré dans le champ CheminDossier :
1 2 3 4 5
| Private Sub CmdOuvrirDosssier_Click()
If Nz(Me.CheminDossier.Value, "") <> "" Then ' si un chemin est enregistré dans le champ CheminDossier
Shell "explorer.exe " & Chr(34) & Me.CheminDossier.Value & Chr(34), vbMaximizedFocus ' on ouvre le dossier avec son chemin
End If
End Sub |
VI.3 - Procédure de mise à jour des chemins des fichiers :
Si vous souhaitez déplacer vos fichiers dans un autre répertoire, une fois le choix du dossier effectué, il faudra exécuter une procédure pour mettre à jour les chemins des fichiers enregistrés dans la base, en remplaçant dans ces chemins l'ancien dossier par le nouveau.
1 2 3 4 5 6 7 8 9 10 11 12
| Sub UpdateCheminsFichiers(AncienDossier As String, NouveauDossier As String)
Dim sSQL As String
Dim db As DAO.Database
Set db = CurrentDb ' référence à la base courante
sSQL = "Update T_PieceJointe Set CheminFichier=Replace(nz(CheminFichier,""""),""" & AncienDossier & """ , """ & NouveauDossier & """)"
db.Execute sSQL, dbFailOnError ' Exécute la requête permettant de remplacer l'ancien dossier par le nouveau dans les chemins des fichiers enregistrés dans la base
Set db = Nothing ' on libère la variable
End Sub |