Importer une photo dans un userform VBA

Résolu
Bonjour,

Dans le cadre d'un projet informatique, je dois créer un programme VBA. Il s'agit d'un logiciel pour un centre équestre.
A un moment dans mon projet, j'ai crée un userform "InscriptionChevaux", permettant à l'utilisateur de rentrer dans le logiciel un nouveau cheval. L'utilisateur devra donc renseigner le nom, la date de naissance, la race, etc. du cheval. Mais, j'aimerais aussi que l'utilisateur puisse également y mettre la photo du cheval.

Pour celà, dans mon userform, j'ai inséré un outil Image appelé "ImageCheval". Je souhaite que lorsque l'utilisateur clique que cet outil, un explorateur apparaisse afin que utilisateur puisse naviguer dans son pc pour trouver l'image.
Pour celà, j'ai créer la macro suivante au sein de l'outil "ImageCheval":

Private Sub ImageCheval_Click()
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
fd.Show
If fd.SelectedItems.Count > 0 Then
MsgBox fd.SelectedItems(1)
End If
Set fd = Nothing
End Sub


Cette macro fonctionne parfaitement bien, lorsque l'utilisateur clique sur "ImageCheval", l'explorateur apparaît et il peut aller la photo n'importe ou dans le pc. Cependant cette macro n'importe pas et n'enregistre pas la photo choisie au sein de mon objet "ImageCheval". En effet, je voudrais par la suite que la photo s'enregistre dans ma feuille de calculs Excel afin que lorsque l'utilisateur veux consulter les chevaux inscrits, la photo apparaisse de nouveau.

Je voudrais donc savoir comment faire pour importer la photo dans mon userform ainsi que dans ma feuille de calcul excel...?

J'espère avoir été clair, et merci par avance de votre aide :)

23 réponses

Résumé de la discussion

Le problème porte sur l'ajout d'une photo de cheval via un contrôle ImageCheval dans un formulaire VBA et sa sauvegarde dans une feuille Excel. La solution principale consiste à récupérer le fichier avec FileDialog puis à affecter l'image au contrôle en utilisant ImageCheval.Picture = LoadPicture(fd.SelectedItems(1)), ce qui affiche immédiatement la photo dans le formulaire. Pour enregistrer l'image dans la feuille, plusieurs options existent, notamment enregistrer le chemin dans une cellule ou insérer l'image directement via ActiveSheet.Pictures.Insert, selon le poids souhaité. En cas d'optimisation, créer un sous-répertoire dédié pour les images et ne stocker que les chemins dans le classeur permet d'éviter d'alourdir le fichier.

Bobot (l’IA à votre service)
  1. Oui, je suis bien sur Excel
    L'image est bien dans l'Userform
    Et le code dans le bouton image du Userform

    Du coup, voici le lien : http://cjoint.com/?3KutMk9ZeFn

    Une fois le document ouvert cliquer sur "Entrer", puis "Les Chevaux", puis "Inscrire un nouveau cheval" et enfin cliquer sur l'Image
    1
    1. Contributeur
      Dans les références ajouter Ole Automation
      Avec ça plus d'erreur mais comme dis plus haut l'image be se dessine pas
      Ajouter un bouton (à la place de Cliquez ci-dessous pour ajouter une photo et mettre le code dans ce bouton.
      A+
      1
      1. Contributeur
        Pour répondre à ta deuxième question ainsi que dans ma feuille de calcul excel...?
        Ton classeur est déjà suffisamment "lourd" pour encore y ajouter toutes les photos.
        Je te conseillerais plutôt de ...
        Créer un sous-répertoire pour tes images chevaux
        dans le bouton valider copier l'image sélectionnée dans ce répertoire. avec un nom significatif comme par exemple Clientxx.jpg
        De cette façon, quand tu en a besoin tu n'a que de les recharger.
        A+
        1
        1. Contributeur
          Bonjour,
          importer une image, rien de plus facile
          Dans l'Userform une PictureBox
              PictureBox1.Picture = LoadPicture(Chemin & nomimage) 
          dans une feuille
          Sélectionner la cellule et..
           ActiveSheet.Pictures.Insert(Chemin & nomImage).Select
          Seulement, avec ça tes images seront déformées, si tu veux garder le ratio c'est beaucoup plus compliquer.
          Voire cette démo
          A+
          Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
          Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
          0
          1. Merci beaucoup pour votre réactivité :)

            J'ai installé cet élément dans ma macro, mais un message d'erreur s'affiche "Erreur de compilation : Sub ou Function non définie" et le déblogage me met ne surbrillance "loadpicture", savez vous d'où celà peut provenir ?
            0
            1. Contributeur
              Explique où se situe le code ? dans le module de l'UserForm ?
              En VBA c'est pas PictureBox mais Image
              Image1.Picture = LoadPicture("C\Repertoire\Image1.Jpg")  

              Montre la ligne exacte et complète où se situe l'erreur.
              EDIT:
              Pour centrer l'image met les propriétés..
              PictureAlignment à 2
              PictureSizeMode à 3

              Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
              Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
              0
              1. Je te remercie vraiment pour ton aide :)

                Pour Image et non PictureBox, merci mais je m'en étais douté ;)

                Je n'arrive pas à insérer de capture d'écran sur le forum, mais voici ma macro (j'ai mis en gras l'endroit ou le déblogage me met en surbrillance et au moment ou il me met le message d'alerte disant que Sub ou Fuction n'est pas défnie):

                Private Sub ImageCheval_Click()
                Dim fd As FileDialog
                Set fd = Application.FileDialog(msoFileDialogFilePicker)
                fd.Show
                If fd.SelectedItems.Count > 0 Then
                MsgBox fd.SelectedItems(1)
                ImageCheval.Picture = <gras>loadpicture</gras>(fd)
                End If
                Set fd = Nothing
                End Sub


                Cette macro se trouve dans l'Userform et plus précisément dans l'Image.

                Par contre, je ne comprends ce que tu veux me dire avec ca :
                "EDIT:
                Pour centrer l'image met les propriétés..
                PictureAlignment à 2
                PictureSizeMode à 3 "
                0
                1. Contributeur
                      ImageCheval.Picture = LoadPicture(fd.SelectedItems(1))

                  Pour l'Edit:
                  En mode édition, clic droit sur le contrôle image -> Propriétés
                  Dans le fenêtre Propriétés tu va comprendre ce que je veux dire.
                  A+

                  0
                  1. Effectivement je comprends beaucoup mieux maintenant pour les propriétés ;) Merci beaucoup, j'ai changé comme vous me l'avez dit !

                    J'ai aussi changé selon vos conseils le loadpicture, mais j'ai encore le message d'alerte provenant du loadpicture me disant "Erreur de compilation : Sub ou Function non définie".
                    Je ne comprends vraiment pas...

                    Private Sub ImageCheval_Click()
                    Dim fd As FileDialog
                    Set fd = Application.FileDialog(msoFileDialogFilePicker)
                    fd.Show
                    If fd.SelectedItems.Count > 0 Then
                    MsgBox fd.SelectedItems(1)
                    ImageCheval.Picture = <gras>[/contents/1171-vbscript-fonctions-diverses LoadPicture]</gras>(fd.SelectedItems(1))
                    End If
                    Set fd = Nothing
                    End Sub


                    Sans vouloir abuser de votre gentillesse, vous avez une nouvelle idée concernant le message d'alerte ?
                    0
                    1. Contributeur
                      Dans l'éditeur clic sur le menu..
                      Outils => Références.
                      Dans la fenêtre, n'y aurait-il pas une référence marquée "MANQUANT" ?
                      si Oui, dis la quelle.
                      0
                      1. Nan, je ne vois rien me signalant "Manquant"....
                        0
                        1. Contributeur
                          Je remarque qu'il y a un problème avec le contrôle image, chez moi ça ne bug pas mais l'image ne veux pas se mettre dans le contrôle.
                          Essaye en mettant le code dans un bouton.
                          0
                          1. Je viens de mettre ma macro dans un "CommandButton" et ca me fait exactement le même problème que lorsque la macro est dans une "Image", c'est à dire que le debogage me bloque sur loadpicure en me le mettant en surbrillance...
                            0
                            1. Contributeur
                              Tu est bien sur Excel ?
                              L'image est bien sur un UserForm ?
                              Le code est dans le module de l'Userform ?
                              Je ne vois pas d'autre raison qui pourrait créer ce problème.
                              J'ai vérifié dans l'aide et testé plusieurs fois...
                              Éventuellement mettre une copie de ton classeur sur Cjoint.com (sans donnée confidentielle)
                              Et mettre le lien dans un poste suivant.
                              A+
                              0
                          2. Vous êtes FORMIDABLE, ca fonctionne !!!! :D

                            Un grand merci à vous et merci pour votre grande patience ! :)
                            0
                            1. Ok, merci pour le conseil, je vais voir pour faire cela.
                              Et merci pour tout !
                              0
                              1. Bonsoir,
                                J'avais du laisser un peu de côté mon projet VBA, il est maintenant à rendre pour très très bientôt. Tout est quasi fini, mais je pensais pouvoir finir l'enregistrement de la photo toute seule en enregistrant les photos des chevaux dans un sous répertoire lorsque l'utilisateur clique sur "valider" (comme vous me l'aviez conseillé), mais j'arrive pas vraiment. Je suis allée fuiner dans des livres et sur internet mais je ne vois aucun sujet sur un forum qui pourrait correspondre au mien, Lermite, pouvez-vous de nouveau m'aider svp en m'indiquant comment procéder ?
                                0
                                1. Contributeur
                                  Re,
                                  Tout en haut du module, tu met
                                  Dim MemoImage as String
                                  
                                  

                                  Dans la sub qui te permet de mettre l'image dans l'Image, juste en dessous de..
                                      ImageCheval.Picture = LoadPicture(fd.SelectedItems(1))
                                  'Tu met
                                      MemoImage = fd.SelectedItems(1)

                                  Dans le code du bouton Valider
                                  Dim Destination as string
                                       Destination = "C:\Répertoire\Répertoire des images\Client" & NumClient & ".jpg"
                                       FileCopy MemoImage, Destination

                                  Tu dis
                                  Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
                                  Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
                                  0
                                  1. Bonsoir,
                                    Tout d'abord un grand merci pour votre réactivité.
                                    J'ai tout mis comme vous m'avez dit, aucun problème détecté par le debogage. Par contre, la photo ne s'enregistre pas dans le répertoire....
                                    On est bien d'accord que je dois remplacer "C:\Répertoire\Répertoire des images\Client" par le chemin propre à mon ordinateur et à mon répertoire ?
                                    0
                                    1. Contributeur
                                      Comment tu numérote les clients ?
                                      Pour tester..
                                          'Après la ligne..
                                           Destination = "C:\Répertoire\Répertoire des images\Client" & NumClient & ".jpg"
                                          'Tu ajoute
                                          MsgBox "Image = " & MemoImage & Chr(13) & "NumClient =" & NumClient _
                                          & Chr(13) & "Destination = " & Destination

                                      Met le résultat dans un poste suivant.
                                      A+
                                      0
                                      1. Merci beaucoup de votre réponse.
                                        J'ai trouvé d'ou venait mon erreur, il me manquait un "\" à la fin de mon chemin.
                                        Du coup, voici mon chemin :
                                        Destination = "C:\Users\Méloo\Documents\Photos Chevaux\& InscriptionChevaux.NomCheval.Value & .jpg"

                                        Mon problème maintenant est que j'aimerais que le nom de ma photo change à chaque inscription et qu'elle prenne le nom du cheval. Mais, avec ce chemin, InscriptionChevaux.NomCheval.Value ne change jamais, du coup toutes les photos ont le même nom et à chaque inscription, la nouvelle photo écrase l'ancienne...
                                        J'ai essayé de créer une variable, mais à chaque fois c'est pareil, le nom de change pas...
                                        Avez-vous une idée svp ?
                                        0
                                        1. Bonjour,
                                          Post très intéressant, Merci.
                                          Pour ma part, je souhaite afficher une image (dans mon userform) qu à pour adresse un lien internet (type http://).
                                          Il s'agit d'un affichage seul de l'image. Pas d'enregistrement en local.
                                          Merci à vous.
                                          0
                                      • 1
                                      • 2