Afficher les images dans le formulaire

Bonjour à tous,

Me revoilà avec mon fichier de pièces de moto...

L'image de la pièce s'affiche bien dans le formulaire "ModificationHonda".

Pour faire apparaître le formulaire ModificationHonda, il faut juste double-cliquer sur une ligne du tableau "Honda" (premier onglet).

Les photos sont enregistrées dans un sous-dossier "Photos" du fichier Excel ci-joint.

J'ai donc essayé de dupliquer cette fonctionnalité dans le formulaire "AjouterAuDevis", sans succès.

J'ai fais des "copier-coller" de bout de codes que j'ai commenté par "papicx 2026-05-15" dans le code du formulaire et dans le Module2.

Je ne dois pas être loin de la solution, mais je ne suis pas assez compétent pour trouver ce qu'il manque et/ou ce qui n'est pas correct.

Je n'arrive pas à faire apparaître les images de la pièce dans le formulaire "AjouterAuDevis".

La/les photo(s) est/sont bien enregistrée(s) dans la fiche de la pièce puisqu'elle apparaît dans le formulaire "ModificationHonda".

Le nombre d'images par pièce est enregistré dans la dernière colonne (BS / Image1) du Tableau1 (premier onglet "Honda")

Dans l'idéal, quand la pièce a plusieurs images, elles devraient s'afficher dans les 2 cases (Image1 et Image2)

Pour ajouter une pièce au devis, on active la même matrice M_AjouterACeDevis contenue dans le Module2.

Ce qui est étrange, c'est que l'on n'a pas le même résultat selon la méthode choisie.

Dans un cas on a l'indication dans le label que l'image n'est pas trouvée, dans l'autre cas, le "label" disparait, mais toujours pas d'image.

Merci de votre aide.

voici une partie du code de la feuille AjouterAuDevis

Private Sub image1_()                        ' // j'ai dupliqué et adapté le code présent dans ModifierHonda  papicx 15/05/2026
     ' // mais ça m'étonnerait que ça fonctionne.
     Dim s1, s2, r1 As Integer

     r1 = Application.IfError(Application.Match(Image1.Tag, aImages, 0), 1)     'position de l'image actuelle

     Mon_Image r1
End Sub
Private Sub image2_()                        ' // j'ai dupliqué et adapté le code présent dans ModifierHonda  papicx 15/05/2026
     ' // mais ça m'étonnerait que ça fonctionne.
     Dim s1, s2, r2 As Integer

     r2 = Application.IfError(Application.Match(Image2.Tag, aImages, 0), 1)     'position de l'image actuelle

     Mon_Image r2
End Sub

une partie du code de la feuille ModificationHonda (qui elle fonctionne bien)

Private Sub AjouterAuDevis_Click()
     ' // PROJET :
     ' // sauvegarde les modifications + ouvre le formulaire AjouterAuDevis pour sélectionner la pièce d'origine ou adaptable
     ' // la procédure est dans le Module2      papicx 29/08/2025

     M_MAJTableauHonda Me, "Tableau1", "tabel19", Val(Me.TextBoxNumLigne.Text)
     Unload Me

     Dim NoDevis As String
    NoDevis = Sheets("Honda").TextBoxDevisEnCours.Text

    If NoDevis = "" Then
        If MsgBox("Aucun devis n'est sélectionné." & vbLf & "Veuillez sélectionner un devis.", vbExclamation, "Devis à sélectionner") = vbYes Then
            TousLesDevis.Show
        End If
        Exit Sub
    End If

    ' Déterminer la ligne sélectionnée dans le tableau "Tableau1"
    Dim LigneSelectionnee As Long

        LigneSelectionnee = TextBoxNumLigne - Range("Tableau1").ListObject.Range.Row    ' N° du "listrow", donc dans le tableau, n'est pas la même chose que la ligne de la feuille

    If LigneSelectionnee < 1 Or LigneSelectionnee > Range("Tableau1").ListObject.ListRows.Count Then
        MsgBox "Aucune ligne valide sélectionnée dans le tableau Honda.", vbExclamation
        Exit Sub
    End If

 '   M_AjouterACeDevis NoDevis, LigneSelectionnee
    ' si vous préférez, on pourrait aussi écrire
     M_AjouterACeDevis NoDevis:=NoDevis, LigneTableau1:=LigneSelectionnee

End Sub

Private Sub CB_Aujourdhui_Honda_Click()
         TextBox_maj_Honda = Format(Date, "dd/mm/yyyy")
End Sub

une partie du code du Module2

Sub M_ModifHonda(Ligne)                      'Ligne = le numéro de la ligne dans le tableau
     '***************************************************************************
     ' cette macro donne les valeurs sauvegardées dans le tableau1 aux textboxes etc de l'userform
     ' elle reçoit la ligne dans le tableau comme référence
     '***************************************************************************
     Dim TBL19, aHonda, i, j, temp, L
     Unload ModificationHonda

     Set MyUF = ModificationHonda
     Set MyImage = MyUF.Image1
     Set MyImageLabel = MyUF.Image1_Label

     With ModificationHonda                  'cet userform
          aMaster = Range("tabel19").Value2  'tableau avec les liens entre Tableau1 et USF ModificationHonda
          aHonda = Range("tableau1").Value2  'tableau1
          .TextBoxNumLigne.Tag = Ligne       'sauvegarder ce numéro du "listrow"
          .TextBoxNumLigne.Text = Ligne + Range("tableau1").Row - 1     'correction pour le "text", un décalage de la ligne de l'entête (= ligne du range -1)

          For i = 1 To UBound(aMaster)       'boucler tous les objets connus de "ajouterHonda" et "modificationHonda" dans le tableau 19
               If Len(aMaster(i, 4)) > 0 Then     ' si nom connu pour l'userform "modificationHonda"
                    If StrComp(aMaster(i, 2), "Formule", 1) = 0 Or aMaster(i, 5) = 0 Then     'le control est une formule ou un control sans lien avec le tableau1 (valeur 0 dans la 5eme colonne)
                         .Controls(aMaster(i, 4)).Enabled = True     'propriété normal "enabled"
                         .Controls(aMaster(i, 4)).Locked = True     'propriété "locked" = non modifiable
                    ElseIf (StrComp(aMaster(i, 2), "Image", 1) <> 0) Then     'ce n'est pas une image non plus
                         temp = aHonda(Ligne, aMaster(i, 5))     'nom du control dans l'UF "ModificationHonda" attention ligne est bien le listrow !!!!! pas la ligne de la feuille
                         L = Len(temp)
                         If L > 0 Then       'nom connu
                              If StrComp(aMaster(i, 2), "date", 1) = 0 Then temp = Format(temp, "dd/mm/yyyy")     'si c'est une date en colonne 2, alors convertir au format date
                              If StrComp(aMaster(i, 2), "N", 1) = 0 And aMaster(i, 7) = 2 Then temp = Replace(Format(temp, "# ##0.00"), ".", ",")     'si est numérique en colonne 2 et on demande 2 décimales en colonne 7, alors 2 décimales
                              .Controls(aMaster(i, 4)).Value = temp     'coller résultat dans le control
                         End If
                    End If
               End If
          Next
          Set MyUF = ModificationHonda
          Set MyImage = ModificationHonda.Image1
          Set MyImageLabel = ModificationHonda.Image1_Label
          MyRefOrig = .TextBoxRefOriginale.Text
          MyNewRef = .TextBoxNewRefHonda.Text
          MyDesign = .TextBoxDesignation.Text
          Mon_Image True                     'pour mise à jour de l'image1, sauter vers cette macro
          .Show                              'montrer l'UF "ModificationHonda"

     End With
End Sub

suite...

'***************************************************************
'   Bouton CB_AjouterACeDevis_Click()  de la page Honda
'        ' version Saboh12617 du lundi 01/09/2025
'
'***************************************************************
Sub M_AjouterACeDevis(ByVal NoDevis As String, ByVal LigneTableau1 As Long)

    Dim SH As Worksheet
    Set SH = Sheets("Devis")

    Dim r As Variant
    r = Application.IfError(Application.Match(NoDevis, SH.Range("TableauDevis[NoDevis]"), 0), 0)
    If r = 0 Then
        MsgBox "Devis inconnu", vbExclamation
        Exit Sub
    End If

             '// 3 lignes ajoutées le 15/05/2026
            Set MyUF = AjouterAuDevis
            Set MyImages = MyUF.Image1
            Set MyImageLabel = MyUF.Image1_Label

    With AjouterAuDevis     '<- je n'ai pas bien compris de quel UF il s'agit ce n'est pas vraiment "Cet uf" mais plutot un autre ( BsAlv )
        ' Infos du devis
        .TextBoxNomPrenom = SH.Range("TableauDevis[NomPrenom]").Cells(r, 1).Value2
        .TextBoxNoDevis = NoDevis
        .TextBoxTitreDevis = SH.Range("TableauDevis[Titredevis]").Cells(r, 1).Value2

        ' Infos de la pièce (Tableau1)
        Dim Tbl As ListObject
        Set Tbl = Sheets("Honda").ListObjects("Tableau1")

        If LigneTableau1 < 1 Or LigneTableau1 > Tbl.ListRows.Count Then
            MsgBox "Ligne de pièce invalide", vbExclamation
            Exit Sub
        End If

        Dim Ligne As Range
        Set Ligne = Tbl.ListRows(LigneTableau1).Range

            '// ligne ajoutée par papicx le 09/09/2025
        .TextBoxNumLigne.Text = LigneTableau1 + Range("Tableau1").Row - 1     'correction pour le "text", une décalage de la ligne de l'entête (= ligne du range -1)

        .TextBoxQu = Range("Tableau1[Qu]").Cells(LigneTableau1, 1).Value                    '// la quantité prévue est présent à titre indicatif sur le formulaire
        .TextBoxDesignation = Range("Tableau1[designation]").Cells(LigneTableau1, 1).Value
        .TextBoxRefOriginale = Range("Tableau1[Honda_Origine]").Cells(LigneTableau1, 1).Value
        .TextBoxRefAlternative = Range("Tableau1[Ref_Alt]").Cells(LigneTableau1, 1).Value
        .TextBoxNewRefHonda = Range("Tableau1[New_Ref_Honda]").Cells(LigneTableau1, 1).Value
        .TextBoxDateMAJ_Honda = Range("tableau1[date_maj_Honda]").Cells(LigneTableau1, 1).Value
        .TextBoxDateMAJ_ADAPTABLE = Range("tableau1[date_maj]").Cells(LigneTableau1, 1).Value

'//        .TextBoxDPCTTC = Ligne.Columns("DPC_TTC").Value
            ' // essai de mise au format des prix avec les 2 décimales  papicx 03/09/2025
        DPCTTC = Range("Tableau1[DPC_TTC]").Cells(LigneTableau1, 1).Value       '   Ligne.Columns("DPC_TTC").Value
        .TextBoxDPCTTC = Format(DPCTTC, "#,##0.00")

        .TextBoxRefAdaptable = Range("Tableau1[REF_HG]").Cells(LigneTableau1, 1).Value
        .TextBoxFournisseur = Range("Tableau1[Fournisseur]").Cells(LigneTableau1, 1).Value

'//        .TextBoxTTC€Adapable = Ligne.Columns("TTC_€_adapt").Value
            ' // essai de mise au format des prix avec les 2 décimales  papicx 03/09/2025
        TTC€Adapable = Range("Tableau1[TTC_€_adapt]").Cells(LigneTableau1, 1).Value
        .TextBoxTTC€Adapable = Format(TTC€Adapable, "#,##0.00")

              ' // afficher les images de la pièce    papicx 15/05/2026
                     '// 4 lignes ajoutées le 15/05/2026
                    Set MyUF = AjouterAuDevis
                    Set MyImages = AjouterAuDevis.Image1
                    Set MyImageLabel = AjouterAuDevis.Image1_Label
                    Mon_Image True

        .Show
'        AjouterAuDevis.Show
    End With
End Sub

le fichier Excel dégraissé sinon j'avais 1500 et quelques de références... il y 6 références avec leurs photos.

24test.zip (1.35 Mo)

Merci de votre aide.

Bonjour à tous.

Paix, je vois que depuis vendredi vous n'avez eu aucun retour sur votre demande. Vendredi j'ai regardé votre fichier, et rien ne fonctionne.

Apparemment vous avez "bricolé" avec des bouts de code récupérés ici ou là. Cela ne peut pas fonctionner.

Vous dites que vous avez plus de 1 500 références, cela fait, de mon point de vue, beaucoup, beaucoup "d'images" à stocker.

À mon avis, ce n'est pas gérable, et je ne vois pas la plus-value que cela apporte.

Si vous voulez, on peut revoir ensemble ce qu'il conviendrait de faire pour avoir un fichier qui vous permet d'atteindre votre objectif.

A vous de voir.

Cordialement.

Bonjour Claude,

C'est gentil de vous pencher sur mon fichier.

Sur mon pc, le formulaire Modification Honda fonctionne très bien, les images s'affichent correctement.
Ce n'est que sur le formulaire Ajouter au devis que ça ne fonctionne pas. Mes bricolages sont repérables car je les ai commentés avec ' Papicx 2026-05-15 à la fin.),

Dans le formulaire Modification, si vous ajouter une photo, vous verrez qu'elle s'enregistre bien. et même, on peut en mettre plusieurs.
Les images ont le nom qui correspond à la référence.
C'est la raison pour laquelle j'ai joins quelques photos correspondant aux références pour vous aider à le mettre en place.

C'est seulement dans le formulaire Ajouter Au devis que j'ai mis des bouts de code en m'inspirant du formulaire Modification.

Les images aident à s'assurer que c'est la bonne pièce, le descriptif étant trop succint.
Le fichier, tel qu'il est fait, ne gère pas les images elles-même mais seulement un tableau, dans l'onglet BDD_Images.
Il est probable que si vous n'enregistrez pas le fichier dans un répertoire "D" que cela ne fonctionne pas.

Perso, j'avais demandé à l'époque que le stockage soit dans un chemin relatif dans un sous dossier afin que le fichier soit exportable.
Peut-être cela n'est il pas possible. Je ne le sais pas.

C'est @BsAlv qui m'a concocté ça, et je l'en remercie.
Si vous pensez pouvoir revoir ce détail, ce serait déjà un bon point.

Merci d'avance pour votre aide.

2026 05 19 231200

Bonjour à tous.

papicx, j'entends bien vos explications, mais j'ai de nouveau regardé votre fichier, mais c'est totalement incompréhensible.

Des tableaux avec plus de 70 colonnes : c'est juste ingérable.

De mon point de vue, plus de 1 500 images à gérer me semble très compliqué : plus de 1500 liens pour aller chercher dans un dossier l'image correspondante, moi je veux bien.

Surtout que pour moi cela n'apporte aucune plus-value. On gère par la référence de l'article.
Votre fichier est enregistré sous format xlsb : ce format peut être intéressant que si vous avez un fichier où il y a énormément de calculs complexes. Ici cela ne semble pas être le cas.

Je vous donne ici mon avis. Je ne porte aucun jugement sur ce que vous avez fait.

Je vous confirme que votre fichier, en l'état, ne fonctionne pas chez moi (Office 365).
Depuis vendredi, vous n'avez eu aucune réponse : posez-vous les bonnes questions.

Si vous voulez, mettez un fichier dans lequel il n'y aurait que la liste des clients et la liste de vos articles, et je vous fais une proposition.
Si j'ai bien compris, vous voulez, à l'aide de ces données, établir un devis.
Je vous mets un fichier exemple de ce que l'on peut faire (à la place de "Commande", ce serait "Devis").

Cordialement.

Bonjour à tous,

@papicx,

Perso, j'avais demandé à l'époque que le stockage soit dans un chemin relatif dans un sous dossier afin que le fichier soit exportable.

Peut-être cela n'est il pas possible. Je ne le sais pas.

Tout est possible, pour ma part je le gère avec des options de classeur que chacun peut mettre à jour, grâce à un formulaire d'options.

C'est seulement dans le formulaire Ajouter Au devis que j'ai mis des bouts de code en m'inspirant du formulaire Modification.

On en revient au problème des fonctions et procédures qui font tout et n'importe quoi. ( Attention je ne critique le travail de personne.)
Il faut un minimum respecter le SRP cela vous aiderait à pouvoir utiliser une fonction à n'importe quel endroit du code; avec un minimum d'adaptation.

Claude,

Des tableaux avec plus de 70 colonnes : c'est juste ingérable.

Je suis entièrement d'accord là-dessus...

De mon point de vue, plus de 1 500 images à gérer me semble très compliqué : plus de 1500 liens pour aller chercher dans un dossier l'image correspondante, moi je veux bien.

Cela peut se faire simplement, et en toute transparence, si c'est bien conçu.

Et de façon générale, je pense qu'il faut revoir entièrement la façon dont est géré ce classeur, et la manière de stocker les références pour les pièces.
Le formulaire 'Modification Honda' ne vous parait-il pas un peu brouillon ? Dans sa façon d'être affiché et géré ?

Concernant les images si par exemple vous avez une fonction qui récupère une image d'après son identifiant unique, vous pouvez utiliser cette fonction pour afficher une image dans n'importe quel formulaire il ne vous faut que son identifiant, le chemin d'enregistrement étant gérer par les options (avec un dictionnaire ou collection par exemple).
Voilà à chacun son travail et un seul travail à chacun. Enregistrer, récupérer, afficher, etc...

Je pense que vous pouvez trouver du monde pour vous aider, mais il faut vouloir repartir d'une base saine et mettre en place une bonne gestion. Vous verrez que tout deviendra plus simple après.

Petite question en passant. Par exemple avez-vous besoin d'avoir toutes ces listes déroulantes Z, A, B, C, D, E, G ainsi que les 400, 500, 650. et autre 400B, 400CB etc.. Une zone pour la cylindrée, le modèle et autre suffirait amplement non ?
Et pour finir si vous utilisez des formulaires pour gérer les commandes, exit la mise en forme des tableaux feuilles etc, ils ne sont là que pour stocker les informations. Cela allègera le code de votre classeur.

Je vais quand même jeter un petit coup d’œil sur le fichier dès que j'ai un moment.

Bonsoir Papicx, le Fil,

J'ai placé tes images sur le disque D avec le chemin D:\C_X_Pieces_Honda\TEST\Photos.

Puis regardé ton fichier. Effectivement l'image s'affiche (1ière image) sur le formulaire. Par contre pourquoi elle est nommée 36141MC7003 dans ton fichier Zip. Alors qu' en ligne 6 de la feuille Honda elle s'inscrit en 36141MC7000. Pour les autres c'est bon.

Note aussi qu'il faut faire un double-clic est opérant à partir de la colonne F et suivante et non des colonnes A à E.

En fin de soirée je verrais pour l'autre formulaire. Bien que pour simplification. Il aurait été préférable que l'image s'affiche sur un mini formulaire dédié au coin gauche haut du premier formulaire.

Ainsi tu n'aurais qu'un seul code générant l'affichage des images et non des doublons de code pour plusieurs formulaires.A1

Bonjour à tous,

@PAYET Claude Je vais regarder votre fichier.

N'oubliez pas que j'ai Excel 2023, pas 365 ( et je ne passerai JAMAIS à 365 ).

à tous,

Je ne suis pas du tout contre de repartir sur une nouvelle base, surtout si la gestion est plus simple après.

Le plus chronophage est de sélectionner les images et de les enregistrer. Les enregistrer sur le fichier Excel, c'est le plus facile.

Je vais vous décevoir un peu, mais je tiens à conserver toutes ces informations. Elles me sont utiles, n'en doutez pas.

Les listes déroulantes Z, A, B, C, D, E, G ainsi que les 400, 500, 650 servent à sélectionner les pièces compatibles pour un modèle précis, afin de ne pas faire d'erreur via le formulaire de recherche.
Dans un passé lointain, j'avais "codifié" ces critères dans les 2 champs cylindrée et modèles. Je dois reporter ces indications dans ces champs à présent.
Ne vous cassez pas la tête a essayer de faire cette transition via des codes.

Les cases 400B, 400CB etc. indiquent la page et le numéro de la pièce sur les microfiches (que j'ai aussi au format papier).
Elles sont importantes, même si celles des références que je vous ai mises dans le fichier test sont vides. Toutes les références ne sont pas renseignées à ce jour.

Je suis d'accord pour que les images soient enregistrées avec seulement la nouvelle référence (New_Ref_Honda). Actuellement si je modifie la désignation, cela "déréférence" l'image que je dois aller ré-enregistrer pour l'afficher à nouveau. C'est contraignant.

Coté tableau client, ça fonctionne bien. Pour faire un devis, il y a une clé "CAM" (Client - Adresse - Moto) crée automatiquement car un client peut avoir plusieurs adresses et/ou motos.
Tout fonctionne bien de ce coté là. svp, ne touchez à rien.

Vous savez, je n'ai jamais eu de cours sur Excel, j'apprends tout à coups de tutoriels, de tests et de patience. J'ai 66 ans...
Ce fichier est le résultat de plusieurs personnes qui m'ont aidé à le faire.

Merci d'avance de votre aide.
Bien à vous

PS : j'avais fait une réponse plus détaillée, mais une mauvaise manip a tout écrasé. J'ai repris l'essentiel.

Bonsoir X Cellus,

36141MC7003 dans ton fichier Zip. Alors qu' en ligne 6 de la feuille Honda elle s'inscrit en 36141MC7000. Pour les autres c'est bon.

Ce fichier Excel est un exemple. Cette pièce a été renumérotée en "003" pour indiqué un fournisseur différent chez Honda. Mais c'est bien la bonne pièce.
Tu fais bien de me le faire remarquer, je vais corriger mon fichier d'exploitation. ;)

Note aussi qu'il faut faire un double-clic est opérant à partir de la colonne F et suivante et non des colonnes A à E.

C'est voulu, ça me permet de modifier le prix sur plusieurs lignes sans devoir ouvrir le formulaire pour cela.
C'est utile lorsque la même référence est utilisées plusieurs fois pour des désignations/utilisations différentes.

Il aurait été préférable que l'image s'affiche sur un mini formulaire dédié au coin gauche haut du premier formulaire.

Ce n'est pas moi qui ait créé ce code. Je pense que l'auteur a eu un peu cette démarche mais sans formulaire, seulement par la "fenêtre" dédiée à l'image.
Par contre, c'est moi qui voulait afficher les 2 premières images dans le formulaire "Ajouter Au Devis'". Sans y parvenir.

Merci bien.

A nouveau,

D'abord tes procédures :

Sub Image1 et Sub Image ne servent à rien. Tu peux les ôter.

Ensuite dans le Module2 dans la procédure :

Sub M_AjouterACeDevis(ByVal NoDevis As String, ByVal LigneTableau1 As Long)

Tu as deux lignes à modifier:

La première sous le commentaire

// 3 lignes ajoutées le 15/05/2026

Enlever le pluriel à Set MyImages = MyUf.Image1

Donc Set MyImage = MyUf.Image1

La deuxième en fin de du Module2 sous le commentaire

// 4 lignes ajoutées le 15/05/2026

Idem, ôter le pluriel à Set MyImages =

En fait, voir sur la première ligne du module3, tu as sur Public FileToOpen.... MyImage et non MyImages et donc plus loin dans le code cela créait une erreur et la ligne If Err.Number induisant que l'image ne s'affichait pas (Raz de l'image).

Si tu dois utiliser Image2, faire idem que Image1.

Cordialement.

Bonjour X Cellus

Tu es vraiment trop fort ! détecter un simple pluriel qui fout la brouille, c'est fort. MERCI !

Hélas, j'ai tenté de suivre tes indications pour gérer l'image2 mais je butte sur qq chose qui semble saturer la mémoire car j'ai parfois un message d'erreur qui m'indique "mémoire insuffisante".

Pour vous faciliter la "lecture" des images, j'ai mis un affichage sur chacune "Photo 1/2, 2/2, image seule"...

J'ai bien entendu fais les corrections indiquées.

début du module 2

Public FileToOpen, MyUF, MyImage, MyImage2, MyImageLabel, MyImage2Label, MyRefOrig, MyNewRef, MyDesign     

suite du module 2

             '// 3 lignes ajoutées le 21/05/2026
            Set MyUF = AjouterAuDevis
            Set MyImage = MyUF.Image1     ' pas de pluriel à MyImage sinon ça ne fonctionne pas
            Set MyImageLabel = MyUF.Image1_Label

    ' // essai d'affichage de l'image suivante   papicx le 21/05/2026  https://forum.excel-pratique.com/excel/afficher-les-images-dans-le-formulaire-202136
                Set MyImage2 = MyUF.Image2     ' pas de pluriel à MyImage sinon ça ne fonctionne pas
                Set MyImage2Label = MyUF.Image2_Label

suite et fin module 2

              ' // afficher les images de la pièce    papicx 21/05/2026
                     '// 4 lignes ajoutées le 21/05/2026
                    Set MyUF = AjouterAuDevis
                    Set MyImage = AjouterAuDevis.Image1     ' pas de pluriel à MyImage sinon ça ne fonctionne pas
                    Set MyImageLabel = AjouterAuDevis.Image1_Label
                            ' // essai d'affichage de l'image suivante   papicx le 21/05/2026  https://forum.excel-pratique.com/excel/afficher-les-images-dans-le-formulaire-202136
                            Set MyImage2 = MyUF.Image2     ' pas de pluriel à MyImage sinon ça ne fonctionne pas
                            Set MyImage2Label = MyUF.Image2_Label
                    Mon_Image True

le module 3

Sub Mon_Image(Optional N° As Integer)        'N° est le numéro de l'image demandé dans le cas où on a plusieurs images pour votre article
     Dim Ligne, r, aHonda, Answ, Col_Image1, iOffsetLigne
     If N° = 0 Then N° = 1
     r = Application.IfError(WorksheetFunction.XLookup("image1", Range("tabel19[tableau1]"), Range("tabel19[N°]"), 0, 0), 0)     'ligne pour l'image1 dans le tableau tabel19

     ' pour l'affichage du nombre d'image(s), puis le  .TextBoxNombreImage en fin de procédure
     With Range("tableau1").ListObject       'avec notre tableau structuré
          aHonda = .DataBodyRange.Value2     'matrice avec le contenu du tableau1
          iOffsetLigne = .Range.Row          'le décalage du tableau, donc "row" versus "listrow"
          Col_Image1 = .ListColumns("Image1").Index     'le numéro du "listcolumn" Image1 = le numéro de la colonne mais aussi décalé de 1, cad en réalité colonne 71 mais dans le TS listcolumn 70
     End With

     With MyUF                               'cet userform
          Ligne = --.TextBoxNumLigne.Text - iOffsetLigne     'lire N° du listrow dans ce textbox (décalage avec le numéro de la ligne avec les entêtes (maintenant le listobject comme référence
          If r > 0 Then                      'les coordinates de l'image1 dans le "tabel19" sont connus
               Range("Mon_Concat").Value2 = Join(Array(aHonda(Ligne, 1), aHonda(Ligne, 3), aHonda(Ligne, 7)), "|")     'concat ces 3 strings "Honda Original" & "honda New" & "designation" comme source dans BDD_images
               M_aImages
               If iImages > 0 Then
                    N° = Application.max(1, Application.Min(iImages, N°))     'eventuellement corriger le numéro de l'image demandé au nombre max d'images
                    On Error Resume Next     'continuer en cas d'erreur
                    MyImage.Picture = LoadPicture(aImages(N°))     'essayer d'importer l'image dans "image1"
                    MyImage.Tag = aImages(N°)     'ajouter le nom de l'image au tag de "image1"
                    MyImageLabel.Visible = False

                    If Err.Number <> 0 Then  'on a eu une erreur dans les 2 lignes précédentes
                         MyImage.Picture = LoadPicture(vbNullString)     'RAZ de l'image1
                         DoEvents
                         MyImage.Tag = "erreur"     'mettre "erreur" dans son tag
                         With MyImageLabel
                              .Caption = "fichier manquant " & vbLf & aImages(N°)
                              .Visible = True
                         End With
                         M_SupprimerImage aImages(N°)
                    End If

        '// ajout de 13 lignes pour l'affichage la deuxième image dans le formulaire AjouterAuDevis papicx 21/05/2026

                    MyImage2.Picture = LoadPicture(aImages(N° + 1))   'essayer d'importer l'image dans "image2"
                    MyImage2.Tag = aImages(N° + 1)   'ajouter le nom de l'image au tag de "image2"
                    MyImage2Label.Visible = False

                    If Err.Number <> 0 Then  'on a eu une erreur dans les 2 lignes précédentes
                         MyImage2.Picture = LoadPicture(vbNullString)     'RAZ de l'image2
                         DoEvents
                         MyImage2.Tag = "erreur"     'mettre "erreur" dans son tag
                         With MyImage2Label
                              .Caption = "fichier manquant " & vbLf & aImages(N° + 1)
                              .Visible = True
                         End With
                         M_SupprimerImage aImages(N° + 1)
                    End If

                    On Error GoTo 0

               Else                          'partie pour des articles sans image
                    iImages = 0
                    MyImage.Picture = LoadPicture(vbNullString)
                    MyImage.Tag = "erreur"
                    With MyImageLabel
                         .Caption = "aucune image"
                         .Visible = True
        '// ajout de 5 lignes pour l'affichage la deuxième image dans le formulaire AjouterAuDevis papicx 21/05/2026
           '         MyImage2.Picture = LoadPicture(vbNullString)
           '         MyImage2.Tag = "erreur"
           '         With MyImage2Label
           '              .Caption = "pas d'image supplémentaire"
           '              .Visible = True

                    End With
               End If
          End If

          .CB_First.Enabled = (iImages > 1)  'activer les 2 boutons "gauche" et "droite" si on a plusieurs images
          .CB_Next.Enabled = .CB_First.Enabled

          '    .TextBoxNombreImage = Cells((Ligne + 5), 69)     ' colonne BQ  Image1  affichage du nombre d'image(s)  remplacé par la ligne suivante le 13/07/2025 Bart
          .TextBoxNombreImage = aHonda(Ligne, Col_Image1)     'on a lu tableau1 dans la matrice aHonda, on utilise l'article du listrow"ligne" et le nombre d'image se trouve dans le liscolumn "Col_Image1"

          If .TextBoxNombreImage = 1 Then    ' change l'orthographe si singulier ou pluriel
               .LabelPhoto = "photo"
          ElseIf .TextBoxNombreImage > 1 Then
               .LabelPhoto = "photos"
          Else
               .TextBoxNombreImage.Visible = False
               .LabelPhoto = ""
          End If

     End With
End Sub

J'ai été obligé de mettre en commentaire les dernières lignes ajoutées car ça buggait.

Merci de ton aide.

2test-v-32.zip (1.58 Mo)

Bonjour Papicx, le Fil,

Attention, le module 3 a été réalisé d'abord pour le formulaire ModifHonda ou il n'existe qu'un contrôle Image (Image1).

Si tu inscris dans ce module 3 un code pour un autre contrôle Image. Forcément que des bugs surviendront.

Il était tard, hier, lorsque je t'ai posté mon dernier message. Vu qu'il y avait besoin de s'approprier les nombreuses lignes de code afin de trouver la solution. Donc j'ai omis de te demander la raison pour laquelle tu insère dans le 2ème formulaire Devis un autre contrôle Image. Si on utilise les < et > du premier contrôle Image on passe sur les différentes images liées à une référence.

Mais pour Devis, que cherches tu avec le second contrôle Image ?

Explique bien plus en détail ton nouveau besoin. Afin que l'on puisse y apporter une réponse adéquate. J'y répondrais en fin de journée.

Bonsoir X Cellus,

C'est bien ce que je pensais aussi, mais bon, pris dans la joie de voir mes images s'afficher, j'ai essayé d'aller plus loin.

En fait, ce que je voudrais, c'est afficher les 2 premières images dans le formulaire AjouterAuDevis.
J'ai vu que les boutons chevrons basculait bien d'une image à l'autre, c'est impec.
Ce formulaire n'est pas dédié à gérer la banque d'images, juste les afficher.

Si je comprends bien, je n'ai rien à ajouter au module3 et ça devrait s'afficher correctement.
Je vais me repencher sur le sujet car je crois bien que en faisant les corrections des pluriels que ça marchait bien.
De mémoire, les images étaient dans le désordre, d'où mon initiative de "numéroter" les images "photo 1/2, photo 2/2, unique"

Pour les photos dans le désordre, je pense que c'est moi qui les ai enregistrées différemment de ce qui est écrit.
Je constate un bug : si la pièce n'a qu'une photo, tout va bien.
Si la pièce à 2 photos au moins, quand je double-clique sur la ligne dans le tableau (pour la modifier donc), j'ai un message d'erreur.

Autre chose, sur le formulaire AjouterAuDEvis, il faudrait ne pas afficher ça "image2_label"

2026 05 21 210329

Je vais essayer de trouver le code pour désactiver le chevron de droite quand on est sur les 2 dernières photos.
Mais bon, ça va me prendre des heures... Mais je suis patient.

PS : dans mon zip V32, après dézipage, il faut renommer le dossier "TEST" et non pas "TEST V32" pour que les photos s'affichent.

Merci de ton aide.

Suite,

En ce qui concerne le nombre de photos pour une référence. J'ai Inscris dans la photo son numéro de photo. Voir ci dessous l'exemple.

captstk

Au cas où il n'existe qu'une photo pour la référence. Il n'est pas nécessaire de numéroter. D'abord c'est indiqué dans le rectangle et les chevrons < & > sont inactifs. Il aurait été préférable d'utiliser un bouton toupie avec un nombre maximum dans ses propriétés égale au nombre de photos.

Ensuite quand je clique sur Ajouter à ce devis, j'ai auparavant sélectionné la ligne correspondante à la référence (exemple Cellule H9) pour les photos ci-dessus présentent. Et renseigné le devis année et mois...

Je ne vois pas sur quel tableau tu fais un double-clic. Si c'est sur la feuille Honda, tu ouvres ModifHonda. Et non le formulaire Ajouter au devis.

Pour ôter le texte devant le contrôle Image2. Affiche l'objet formulaire dans la fenêtre de l'éditeur VBA puis clic-droit dans le contrôle Label nommé Image2_Label. Choisir la propriété Caption et effacer le texte Inscris.

Bonjour X Cellus.

Oui, c'est sur la feuille Honda qu'il y a un bug. Ou plutôt l'affichage de la boite de dialogue qui propose de garder le lien ou pas de l'image non trouvée, alors qu'elles y sont toutes.

Pour les numéros que j'avais mis, c'était pour vous y retrouver, vous, pendant les tests. Ce n'était pas nécessaire, mais c'est bien ce que tu as fait. Laisse le.

Je n'ai pas réussi à trouver comment faire pour désactiver le chevron une fois le nombre max d'image atteinte.

Autrement, c'est possible d'enregistrer les images dans un sous dossier Photos depuis un chemin relatif ?

Et pour le nom, je pense modifier la fonction "mon_concat" (je ne sais pas si c'est le bon terme) pour ne plus etre tributaire de la Désignation de la piece, mais seulement de la "new_ref_honda".

Bonjour à tous,

@papicx,

Je n'ai pas réussi à trouver comment faire pour désactiver le chevron une fois le nombre max d'image atteinte.

Pour faire cela le mieux et d'utiliser une collection :

  • Quand un article est sélectionné vous chargez la collection avec les images qui lui correspondent.
  • Si la collection est vide vous désactivez les boutons et affichez une image par défaut (Moins contraignant que la gestion d'un label dans l'image)
  • Ensuite il est facile de savoir la position dans la collection et de désactiver les boutons en fonction de cela
  • Utilisez de petites fonctions pour faire cela :
    • Chargement de la collection
    • Test de la validité du chemin (si le fichier n'existe plus)
    • Mise à jour des boutons

Vous devriez utiliser des index uniques pour chaque lignes du tableau structuré.

Voilà si vous voulez plus de renseignements n'hésitez pas.

Edit :

Petit retour sur votre interface et code. Quand vous paramétrez le formulaire et le tableau avec ce type d'entrée :

image

Ne serait-il pas plus judicieux d'utiliser des zones de listes avec des cases à cocher ? Cela permettrait d'avoir moins de colonnes sur votre tableau et faciliterait la maintenance dans le cas ou vous auriez besoin d'ajouter tel ou tel type ou modèle.

image

De plus vous avez des colonnes "Cyl", "modele", qui sont du coup redondant non ?
Et ces entrées à quoi vous servent-elles ?

image

Il y aurait peu-être une façon plus judicieuse de les traiter...

Bonne programmation.

Bonjour Jean-Paul,

C'est gentil de se pencher sur mon fichier.

Pour faire cela le mieux et d'utiliser une collection :

Quand un article est sélectionné vous chargez la collection avec les images qui lui correspondent.

Si la collection est vide vous désactivez les boutons et affichez une image par défaut (Moins contraignant que la gestion d'un label dans l'image)

Ensuite il est facile de savoir la position dans la collection et de désactiver les boutons en fonction de cela

Utilisez de petites fonctions pour faire cela :

Chargement de la collection

Test de la validité du chemin (si le fichier n'existe plus)

Mise à jour des boutons

Soyons clair et honnête envers moi-même.
Je ne sais pas faire une collection, donc la suite va être compliquée.

À la rigueur, si j'arrive à comprendre le code fourni, j'arriverai peut-être, je dis bien peut-être, au bout de quelques heures et de nombreux tests hasardeux à désactiver le "bouton chevron".
À propos de chemin, je demandais que justement dans un but de portabilité, que le sous-dossier Photos, avec ses images, soient dans le chemin relatif.
Là, nous avons X Cellus (https://forum.excel-pratique.com/s/goto/1267604) qui a eu la bonne idée de se créer un dossier identique au mien et a vu que le fichier fonctionnait.
Si c'est une solution pour 1 personne (qui sait se débrouiller en informatique), ce n'est pas envisageable pour le diffuser à plusieurs personnes surtout si elles sont novices en informatique.

La partie du code pour les images est à 98% du code qu'on m'a fourni.
Il me semble qu'il se sert d'une collection. En tout cas, il y a le tableau "TBL_Images" dans l'onglet "BDD_Images" qui recense les images avec les références correspondantes.


Pour les cylindrées et modèles, il y a des années, sous MsWorks 4.2 pour être précis, j'utilisais des 2 cases pour retrouver les compatibilité entre les modèles.
C'était aussi bien pratique lorsque j'éditais sur papier la looooongue liste de pièces. Ça prenait pas beaucoup de place dans mes colonnes.

2026 05 22 170834

Ce sont donc des "vieux" champs, toujours d'actualité, qui m'aident à sélectionner les "nouveaux" champs (captures ci-dessous) qui sont tous des menus déroulants et que j'ai aménagé de façon à pouvoir les saisir plus rapidement via le clavier, et ainsi les critères du menu déroulant sont respectés.
Essayez de saisir un x , un point, un 4 un 5 un 6 pour les cylindrées, vous verrez par vous-même.

capture des cylindrées

2026 05 22 171514

capture des modèles

2026 05 22 171528

Les champs ci-dessous sont là pour indiquer sur quelle page et quel numéro a la pièce sur les pages des vues éclatées de chaque modèle.

Toutes les cases qui concernent le modèle ne sont pas forcément remplies. C'est un travail de longue haleine que de collecter ces informations. (J'ai pris un article au hasard là).

2026 05 22 171542

Ce sont donc des champs à titre d'information, pas de sélection.


dans le cas ou vous auriez besoin d'ajouter tel ou tel type ou modèle.

Les modèles de ces motos ne sont plus fabriqués depuis longtemps.
Mais c'est gentil d'y avoir pensé.

Bonjour Papicx, le Fil,

Je t'ai réalisé un petit code pour intégrer au module3.

Voir l'image ci-dessous.

captstk2

Tu rajoutes sous la ligne

ElseIf .TextBoxNombreImage > 1

Après "photos " le code & "( " & No & " )"

Ainsi tu auras comme l'image ci-dessus, entre parenthèses le numéro de la photo. Donc si 3 photos pour la référence tu sauras que tu est sur la dernière si entre parenthèses il y a un 3.

Il faut pour les deux formulaires ModifHonda et AjoutDevis décaler vers le 1ier premier chevron le TextBoxNombreImage et agrandir le LabelPhoto avant le 2ème chevron, afin que le texte s'affiche en entier.

Note: ces deux contrôles peuvent être non visibles quand tu veux modifier les formulaires. Mais il suffit de cliquer entre les chevrons pour qu'ils apparaissent.

Cordialement.

Bonsoir.

C'est top ! Je vais appliquer ça.

Merci

Rechercher des sujets similaires à "afficher images formulaire"