Afficher une image différente dans userform selon le texte dans une textbox
Bonjour,
Je détaille ma demande.
J'ai une base de données de pièces mécaniques.
J'ai fait un formulaire pour pouvoir modifier les prix et diverses info concernant chaque pièce. Grâce à Alex010281, il est parfait à présent.
Dans mon formulaire, j'ai réservé un emplacement pour y mettre une petite image de chaque pièce.
Je n'ai pas encore toutes les photos, mais je sais où aller les chercher sur un site marchand.
Comment dois-je m'y prendre ?
J'ai vu dans le sujet : Réduction d'image auto https://forum.excel-pratique.com/excel/reduction-d-image-auto-193102
sur ce forum, qu'il faudra sûrement que j'installe ImageMagik, ce n'est pas un problème.
Je vous joins mon fichier, qui n'a rien de confidentiel.
affichage de l'userform ModificationHonda par double clic sur une cellule entre les colonnes A et N
Merci d'avance
Bonjour,
Je te propose de jeter un coup d'oeil sur ce post
https://forum.excel-pratique.com/excel/inserer-une-image-dans-une-feuille-199431
A+
Bonjour
si j'ai bien compris
vous ajouter le control "Image" dans votre userform
puis a la fin de UserForme_Initialize
Image1.Picture = LoadPicture("C:\chemin\vers\votre\image.jpg")peut etre que c'est ca
re
Image1.Picture = LoadPicture("C:\chemin\vers\votre\image.jpg")le nom du fichier suivras votre double click, il faut adapter le chemin
encore
dans votre cas
Image1.Picture = LoadPicture("C:\chemin\Image" & NumLigne & ".jpg")chaque image auras le nom de Image(numero de ligne correspondante).jpg dans un meme repertoire que tu definira
cela devrais fonctionner
merci
Bonsoir à tous,
Je ne suis pas encore aller voir le sujet que vous avez suggérer mais je rebondi sur le propos d'iliyes au sujet du nom de l'image qui se rapporterait au numéro de ligne.
que se passerait il si le tableau venait à être trié sur une colonne ?
Je préfèrerai que le nom de l'image soit celui de la référence Honda sous la forme "95801 449 000" dans lequel les espaces seraient remplacés par des underscores.
bonjour
je ne suis pa devant mon PC, mais si on change "NumLigne" par "TextBoxNewRefHonda", je pense que ca devrais fonctionner
a tester
Bonjour à tous,
Je ne suis pas encore aller voir le sujet que vous avez suggérer mais je rebondi sur le propos d'iliyes au sujet du nom de l'image qui se rapporterait au numéro de ligne.
que se passerait il si le tableau venait à être trié sur une colonne ?
Votre tableau Tableau1 est un tableau structuré utilisez- le donc comme tel.
- Ajouter un colonne d'index par exemple "ID" qui contiendrait des valeurs uniques.
- lors d'un ajout ne chercher pas la dernière ligne mais utiliser la Méthode Add de l'objet ListRows de l'objet Listobjects.
Set NewRow =Feuil1.ListObjects("Tableau1").ListRows.Add. - Ajouter une colonne "Image" où sera stocké le nom de l'image. Elle pourrait prendre le nom de par exemple de l'ID de la pièce suivit de l'extension ex: "00001.Gif"
- Comme dis précédemment utilisez LoadPicture pour assigner une image à un contrôle image. Utiliser la propriété PictureSizeMode pour adapter l'image à votre convenance.
- Il vous faudrait aussi deux contrôle boutons sur le formulaire un pour affecter une image l'autre pour la supprimer.
En dehors de cela je pense que votre tableau de pièces est à revoir.
Évitez ce genre de code : ActiveCell.Offset(0, 42) = TextBox_400_B ' colonne AQ 400_B Vous voyez vous êtes obligé de noter à coté à quoi cela correspond.
Doit-on considérer qu'il n'y aura toujours qu'une seule image par pièce ou peut-il y en avoir plusieurs ?
Bonjour Alex020181
ben... on peu tous faire en excel
pour l'ajout de plusieurs image, il faut plusieurs control "Image", et les lier
merci
Hello
Ma question était pour Papicx.
On peut faire des boutons suivant/précédent si plusieurs images. Pas besoin de plusieurs contrôles.
Code en conséquence. D'où ma question.
Bonjour à tous,
la plupart ne vont avoir qu'1 image.
déjà, quand j'aurai mes les 1700 et quelques...
Mais si le code n'est pas trop complexe, alors je suis partant pour en mettre 2 ou 3, pas plus.
Du coup, dois-je prévoir des boutons "suivante" et "précédente" ou bien ce serait des flèches prévues dans l'image en sur-impression par le code ?
Bonjour Alex020181
Le répertoire où seront stockées le fichier Excel est : D:/C_X_Pieces_Honda
le sous répertoire où seront enregistrées toutes les photos sera D:/C_X_Pieces_Honda/Photos
Après la dernière colonne "Image" que j'ai renommée en "Image1", j'ai ajouté 3 colonnes à la fin au tableau1 et du Tabel19
- Image2
- Chemin1
- Chemin2
Qui peut le plus, peut le moins. Tous les champs ne serviront peut-être pas.
Mon souhait serait que les nouveaux noms des images soient issus des références, les 6 premiers caractères, on exclu les espaces, que le code VBA attribuera, suivi d'un suffixe de 2 lettres pour les différencier. Le champ à prendre pour faire cela est le New_Ref_Honda, colonne C.
Les images viennent de tellement d'endroits différents qu'il serait chronophage de les renommer correctement à la main et de vouloir les placer dans un sous dossier spécifique pour chaque pièce.
Voici le fichier à jour, version H du 23/05/2025 donc, avec ton système de code VBA que je maîtrise mieux.
Merci d'avance.
Bonjour @Jean-Paul,
Merci de vos recommandations, que je voudrais mettre en pratique dans le VBA de mon formulaire AjouterHonda avec le bouton Ajouter.
Le principe pour ajouter une ligne n'est pas de mon cru. J'en aurais été bien incapable sans des tutos pompés sur Internet.
C'est vrai que le principe de devoir compter les colonnes pour savoir quel nombre on doit mettre, est épineux et source d'erreurs.
Le système proposé semble plus facilement abordable, surtout pour un néophyte comme moi.
lors d'un ajout ne chercher pas la dernière ligne mais utiliser la Méthode Add de l'objet ListRows de l'objet Listobjects.
Set NewRow = Feuil1.ListObjects("Tableau1").ListRows.Add.
Évitez ce genre de code :
ActiveCell.Offset(0, 42) = TextBox_400_B ' colonne AQ 400_B
J'ai bien essayé de mettre du "range" pour arranger les choses, mais je n'y arrive pas.
J'ai essayé de mettre ça, évidemment, ça plante :
ActiveCell.Offset(0, Range("C")) = TextBox_New_Ref_Honda ' colonne C Nouvelle Référence Hondadu coup, je l'ai mise en commentaire pour la désactiver, et remise l'ancienne en active.
c'est quoi la bonne "formulation" ? dites moi pour une ligne, je ferai les autres (et les contrôles du bon fonctionnement qui va bien avec, bien sûr).
Private Sub CB_Ajouter_Click()
'**********************
' bouton AJOUTER
'**********************
' Sheets("Honda").Activate ' aller sur l'onglet Honda
Feuil1.Activate ' aller sur l'onglet Honda
Range("G12").Select ' se positionne sur la première cellule d'une colonne de données non vide
' qui est le champ "désignation"
Selection.End(xlDown).Select ' se positionne sur la dernière cellule non vide de la colonne
Selection.Offset(1, -6).Select ' on se décale d'une ligne vers le bas, et sur la première colonne (A)
ActiveCell = TextBox_Ref_Originale ' colonne A Référence Originale Honda
ActiveCell.Offset(0, 1) = TextBox_Quantité ' colonne B Quantité
ActiveCell.Offset(0, 2) = TextBox_New_Ref_Honda ' colonne C Nouvelle Référence Honda
' ActiveCell.Offset(0, Range("C")) = TextBox_New_Ref_Honda ' colonne C Nouvelle Référence Honda
...Merci d'avance
Edit 12h40
J'ai essayé de mettre () après la ligne, c'est toujours en rouge.
Bonsoir @papicx,
Pouvez-vous mettre un fichier qui soit à jour que je puisse y regarder de plus près. Merci.
Sinon il faut écrire :
Public Sub test101()
' // Nous pouvons renseigner la position de la nouvelle ligne, si omis alors elle se calle à la fin.
Dim newRow As Excel.ListRow
Set newRow = Feuil1.ListObjects("Tableau1").ListRows.Add ' Position:=1
With newRow
' // pour ajouter une valeur à la colonne "Désigantion" nous récupérons l'index de la colonne
Dim indexColumn As Long
indexColumn = .Parent.ListColumns("Désignation").Index
' // Puis nous pouvons attribuer une valeur à la colonne sur la nouvelle ligne
.Range(Index).Value = TextBoxDésignation.Value
' // On peu passer directement sans la variable index c'est la méthode que j'utilise le plus souvent.
.Range(.Parent.ListColumns("Désignation").Index).Value = TextBoxDésignation.Value
.Range(.Parent.ListColumns("Nouvelle réf Honda").Index).Value = TextBoxNewRefHonda.Value
'...
'...
'...
End With
' // Nous pouvons libérer la mémoire des objects inutiles.
If Not newRow Is Nothing Then Set newRow = Nothing
End SubJe ne saurais trop vous conseiller :
- Donner des noms explicite aux objets. Contrôle, Tableaux, etc..
- Éviter les accents dans les noms de contrôles, les variables etc..
- L'ajout de lignes vides dans le code alourdi celui-ci. (Ressentit personnel)
- Éviter les Underscore dans les noms de contrôles, les variables, etc celui-ci est utilisé pour les méthodes des contrôles ex: "Private Sub ListOfControl_Click()"
Au vu du nombre de contrôle sur le formulaire je pense qu'il faut adopter un autre technique pour remplir le tableau de la feuille Honda.
Construire un tableau de correspondance entre les contrôles et le nom des colonnes du tableau. Ensuite nous n'avons plus qu'a faire une boucle sur ce tableau et d’affecter à chaque colonne la valeur du contrôle.
Si cela vous intéresse, je peux vous faire une petite fonction.
Ça marchera mieux comme ça.
ThisWorkbook.sheets("Honda").Range("C" & NumLigne)=TextBox_New_Ref_HondaSi tu ajoutes des données dans une ligne Excel directement sous un tableau existant alors Excel englobe seul cette nouvelle ligne dans le tableau.
PS : J'ai ici mis "NumLigne" car je me souviens que c'est ce nom de variable que tu utilisais dans le formulaire de modification mais vérifie bien que tu utilises toujours dans ce nouveau code ce même nom sinon adapte cette ligne bien sûr.
Un truc comme ça ?
Pense à remettre ton lecteur du répertoire principal en "D:" car je n'ai pas de "D" donc je l'ai mis en "C".
Attention aux extensions des fichiers images supportées. JPG JPEG mais je ne sais pas s'il y en d'autres.
Sur les références en lignes 42, 45 et 48 j'ai associé un sous répertoire (ref). Dans ces sous répertoires j'ai placé des images (parmi celles que tu as données) et la zone image appelle bien ces fichiers (formulaire modification).
pourquoi mettez-vous pas le nom complet dans la colonne "image" comme ceci
le bouton "ajouter" et "supprimer" ajout/supprime le nom de l'image dans ces cellules.
Le fichier de hier 11:56 avait déjà le début de cette idée (https://forum.excel-pratique.com/excel/intialiser-un-nombre-a-2-decimales-et-l-afficher-dans-le-user...)
Oui c'est également une façon de faire. Quand j'ai ouvert ce fil je me suis rendu à la dernière réponse de papicx 11h57, vu qu'il y avait mon nom, et j'ai récupéré le fichier proposé à partir de là. Je n'ai pas été regardé dans l'autre fil.
En plus dans cette dernière réponse papicx précise que ce fichier est la dernière version en marquant la date qui est bien celle d'hier.
Voici le fichier à jour, version H du 23/05/2025
Je ne dénigre pas du tout ta proposition rassure toi.
L'une ou l'autre, le plus important c'est que le résultat convienne.
Si je devais comparer toutefois :
Avec ta méthode l'utilisateur peut choisir des fichiers image à partir de n'importe quel répertoire et ajouter son chemin dans la cellule qui va bien mais cela implique quand même que la hauteur des cellules ne soit pas toujours équivalente (esthétique je te l'accorde) mais surtout il ne faut pas qu'un autre utilisateur supprime ou renomme ledit fichier puisqu'il ne saura pas forcément que cela impacterait son référencement ici.
Avec ma méthode (pour le moment sans les boutons ajouter/supprimer que je n'ai pas encore fait car j'attends retour de papicx pour savoir si elle lui convient) les fichiers image sont regroupés par sous répertoires (par références) dans un répertoire principal. Il est facile pour l'administrateur du fichier de définir un répertoire principal dans un chemin lecteur sécurisé (dans le sens où l'utilisateur ne se rends pas et pas dans le sens mot de passe et cryptage) pour être certain que ces fichiers ne soient pas supprimés par quiconque. Et puis si un jour la base complète doit être sauvegardée tous les fichiers pourront l'être rapidement puisque regroupé dans un seul répertoire principal. Par contre je te concède que copier les fichiers prendra de la place de stockage selon le nombre de fichiers et la taille de chacun.
Et pour répondre directement à ta question : il est vrai aussi que la colonne de stockage du sous répertoire pourrait également contenir l'ensemble du libellé de répertoire et non pas que la fin. Mais est-ce vraiment utile ? Je trouve que ne mettre que le nom du sous répertoire est plus lisible. Ce n'est que mon choix et tout cela ne reste que proposition.
re,
j'ai continué avec le dernier fichier et j'ai ajouté une nouvelle feuille pour les images. (Voir aussi la réaction de Alex020181) On peut ajouter plusieurs fichier "JPG" pour chaque combinaison "Honda_original" & "New_Ref_Honda" & "désignation" et puis dans la colonne "priorité" un chiffre pour les trier dans une séquence ascendante. Pour ajouter cesfichier, vous pouvez utiliser le bouton "ajouter" de l'userform "ModificationHonda". Supprimer n'est pas encore programmé. Plus tard, j'aurais peut-être besoin d'une image "erreur" pour montrer dans l'Image1, si un fichier n'existe pas/plus.
C'est juste pour voir si tout fonctionne.
J'ai ajouté les MFCs demandées.
Les macros de Steelson y sont là pour uniformiser la plupart des manipulations des textboxes, etc. Le "finetuning" est encore à faire par des macros individuelles.
Les textboxes pour les montant TVA inclu ne sont plus accèssibles.