Utiliser des images dans Access
BUT : Inclure des images sans que la base de données ne grossisse exagérément. En effet, si vous incluez des images dans un champ, elles seront transformées en format BMP et prendront une grande place au sein de la base de données
Pour Access 2010 et supérieur, c'est très simple
Pour les versions antérieures - Comment faire !
Condition préalable : Photo Editor doit être installé, vérifiez donc votre installation MS Office.
Principe, nous allons créer un champ texte qui va nous permettre de stocker un lien vers l'image,et avec une macro nous allons recharger une "nouvelle" image lorsque nous changerons d'enregistrement
D'abord nous créons une image blanche avec n'importe quel logiciel de retouche d'image... Elle nous servira d'image par défaut sur les enregistrements sans photo
Ensuite nous créons notre base de donnée de manière classique, nous y incluons un champ texte que j'appelle "Photo". Dans la propriété "valeur par défaut", j'indique le chemin à suivre pour atteindre le répertoire où je stocke les images que je veux voir apparaître dans ma base de données. Dans cet exemple, j'utilise c:/temp . Je désigne également par défaut l'image blanche.jpg
Un formulaire est alors construit à partir de cette table et un emplacement image est placé sur le formulaire en utilisant l'outil qui est ici entouré en rouge
Remarquez les propriétés Image, Type image et mode d'affichage. Réglez les de la même manière. Nous passons sur l'onglet et nous nommons ce cadre : ImageFrame
On édite maintenant les propriétés du champ Photo; on se place sur l'onglet événement et l'on décide d'inclure une procédure événementielle qui se déclenchera juste après sa mise à jour
et l'on définit à la même occasion une procédure qui fera appel à la première à chaque changement d'enregistrement
Pour faire apparaître les images désirées, il nous suffit de remplacer le nom de l'image par défaut "blanche.jpg" par le nom de l'image que l'on désire associer à l'enregistrement en cours
Comme on peut le constater sur l'arborescence, on garde une base de données de taille raisonnable, même si les images ne sont pas si légères
Faire un clic droit pour télécharger le fichier exemple, installer l'ensemble dans le répertoire c:/temp. Rassurez vous le fichier pèse 468 Ko, je n'ai pas inclus toutes les photos
Cliquez ici pour télécharger le fichier exemple ImagesDansAccess
Mouais ! et dans un rapport alors, la technique est la même mais le code doit être placé ailleurs, il faut éditer les propriétés de la partie du rapport où se trouve l'image (Entête, Détails, Pied de page) et c'est dans la propriété "Au formatage" qu'il faut mettre le code suivant
Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
' Indispensable car on obtient parfois un message d'erreur signalant que le type est incompatible
' lorsque l'on passe du mode construction au mode de production
On Error Resume Next
Me![ImageFrame].Picture = Me![Photo]
End Sub
Si vous souhaitez mettre une image en fond de formulaire sans grever votre base de données de précieux octets, voici comment faire :
Créez un module et collez-y le code suivant :
Sub AfficherFondFormulaire(NomFormulaire As String)
Dim CheminCompletVersLaBase, CheminEtImage As String
Dim LocalisationBarreOblique As Integer
'Obtient le chemin d'accès complet de la base de données ou du projet Access actif.
CheminCompletVersLaBase = CurrentProject.FullName
'Trouve l'emplacement de la dernière barre oblique inverse
LocalisationBarreOblique = InStrRev(CheminCompletVersLaBase, "\", Len(CheminCompletVersLaBase))
'Supprime le nom de la base de données, laisse le chemin d'accès
'et ajoute le nom du fichier image
CheminEtImage = Left(CheminCompletVersLaBase, LocalisationBarreOblique) & "Images\FondForm.jpg"
'Charge l'image comme fond dans le formulaire
Forms(NomFormulaire).Picture = CheminEtImage
Forms(NomFormulaire).PictureTiling = False
Forms(NomFormulaire).PictureSizeMode = 1
End Sub
et dans chaque formulaire qui devra s'habiller aux couleurs de cette image, collez le code
Private Sub Form_Current()
Call AfficherFondFormulaire(Me.Name)
End Sub
On peut ainsi obtenir un très joli effet comme dans cet exemple
Toujours plus fort ... Désigner l'image avec une boîte de dialogue qui permet la désignation du fichier sur le disque dur
- D'abord, augmenter la taille de votre champ "Photo" jusque 255 caractères
- Poser un bouton sur le formulaire que nous appellerons B_Parcourir
-
Private Function ShowOpen() As String ' Il faut ajouter la réference to Microsoft Office 11.0 Object Library. ' (ou supérieure) Dim fDialog As Office.FileDialog Dim varFile As Variant ' Définition la boîte de Dialogue pour désigner un Fichier. Set fDialog = Application.FileDialog(msoFileDialogFilePicker) With fDialog ' Interdit à l'utilisateur de faire un choix multiple .AllowMultiSelect = False ' Détermine le titre de la boîte de dialogue. .Title = "Sélectionnez un fichier image" ' Nettoie les extensions de fichiers et affiche tous les fichiers. .Filters.Clear .Filters.Add "All Files", "*.*" ' Montre la boite de dialogue. Si la méthode .Show retourne True, ' l utilisateur a désigné au moins un fichier. Si la méthode .Show method retourne ' False, l utilisateur a appuyé sur Annuler. If .Show = True Then 'Fais une boucle sur les différents fichiers sélectionnés 'mais ici on n'utilise pas true sur AllowMultiSelect 'comme on peut s'en resservir pour autre chose, gardons la boucle. For Each varFile In .SelectedItems Me.Photo.Value = varFile Next Else MsgBox "Vous avez cliqué sur Annuler." End If End With ShowOpen = varFile Me.Refresh End Function
-
Encore toujours plus fort, mais où s'arrêtera-t-il ? ... On peut si on est un garçon ordonné, décider que toutes les images ou photos seront dans un sous-dossier bien déterminé, et que par exemple les photos porteront toujours le nom de la personne (exemple, la photo de monsieur Dupont, s'appellera Dupont.jpg). Vu que l'on a certainement un champ [Noms] dans la base de données, on va récupérer son contenu pour retrouver le chemin qui conduit à la photo Pour cela on va utiliser 2 procédures, l'une qui va nous permettre de retrouver le chemin où se trouve la base de donnée et qui s'appelle ParentDir et la seconde que nous avons déjà vue plus haut mais que nous améliorons bien sûr
Donc maintenant sur notre formulaire nous n'aurons pas besoin d'un champ [Photo] mais
- de l'ImageFrame,
- du contenu d'un champ [Nom],
- d'un sous-dossier appellé "Photos" sur notre disque dur
- et de l'événement Sur Activation du formulaire
Function ParentDir(ByVal str As String) As String Dim i As Integer ' repère le dernier "\" If Right(str, 1) = "\" Then str = Left(str, Len(str) - 1) ' maintenant regarde le précédent For i = Len(str) To 1 Step -1 If Mid(str, i, 1) = "\" Then Debug.Print "Fichier " & Right(str, Len(str) - i) str = Left(str, i) GoTo fin01 End If Next i fin01: Debug.Print "Répertoire " & str ParentDir = str End Function
Private Sub Form_Current() Dim LeChemin As String On Error Resume Next LeChemin = ParentDir(Application.CurrentDb.Name) If Dir(LeChemin & "Photos\" & UCase([Nom]) & ".jpg", vbHidden) <> "" Then Me![ImageFrame].Picture = LeChemin & "Photos\" & [Nom] & ".jpg" 'le fichier existe (vbHidden permet de le retrouver même s'il est caché) MsgBox "Le fichier " & LeChemin & "Photos\" & [Nom] & ".jpg" & " existe" Else Me![ImageFrame].Picture = ParentDir(Application.CurrentDb.Name) & "Photos\blanche.jpg" MsgBox "Le fichier " & LeChemin & "Photos\" & [Nom] & ".jpg" & " n'existe pas" End If Me.Refresh End Sub
Télécharger le fichier ImagesDansAccess