ImagesDansAccess

Retour vers Access

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

  1. D'abord, augmenter la taille de votre champ "Photo" jusque 255 caractères

     

  2. Poser un bouton sur le formulaire que nous appellerons B_Parcourir

     

  3. 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
  4. 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

    1. de l'ImageFrame,
    2. du contenu d'un champ [Nom],
    3. d'un sous-dossier appellé "Photos" sur notre disque dur
    4. 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 

Fin