Image en fonction de la valeur d'une cellule
Juste un petit problème à faire de votre côté, dans la feuille "Collège 1" la ligne des listes déroulantes est la 19 alors que dans "Foyer 2" elle est en 20 et 42. pour que cela marche insérez une ligne au-dessus du tableau de la feuille "Collège 1" afin que la ligne des listes déroulantes soit aussi sur la 20.
Aïe,ça, ça ne sera pas possible. Mes 12 onglets sont différents, et je ne peux pas modifier leur structure. J'ai bien peur que nous soyons obliger de faire un code propre à chaque feuille.
Merci pour les commentaires !
Pas de soucis, tu me dis dès que tu à une question ou une remarque !
Bonsoir YouniCornn,
Je veux bien donner un coup de main a l'ami Arturo83
Si c'est juste un problème de nombre de lignes, c'est gérable par 1 seul code
Bonsoir,
Je pense que pour que tout se passe au mieux possible je vais vous partager le classeur final.
Laissez moi le temps d'anonimiser le plus possible et je reviens vers vous dans la soirée
Bonsoir …
Une adaptation* d’un de mes premiers travaux, assez simple pour afficher des images à partir d’une liste de validations.
*Je n’ai pris que quelques images de ton fichier.
Re bonsoir tout le monde, voici mon fichier final. Qui si je ne trouve pas de solution fonctionnel et sans accro restera comme ça.
Le fichier est un poil trop lourd pour être mis directement, alors voici le lien wetransfert (remplacer le [point] par un vrai point : (je n'ai pas la possibilité de réduire plus que cela le fichier. Même en passant en rar ou en zip je suis au dessus de la limite autorisé :/)
https://we[point]tl/t-A8zlestoME
Le fichier à des protection, les mdp sont dans l'onglet paramètres.
Merci à vous tous
Au passage Ordonc, je ne sais pas comment est-ce que fonctionne ton fichier mais ça peu être une piste aussi !
Re …
Toutes les images se superposent et la liste de leur nom est dans un autre onglet Feuil2. Elle est nommée Li. On définit la liste de validation
Le changement de nom dans la liste de validation permet d’afficher l’image correspondante avec la macro dans la fenêtre des codes de la feuille les contenant :
Private Sub Worksheet_Change(ByVal R As Range)
‘les images sont cachées
For n = 1 To Feuil2.[LI].Count: Shapes(n).Visible = 0: Next
‘affichage de l’image au changement de nom dans la liste en A5
If R.Address = "$A$5" And R <> "" Then Shapes(R).Visible = 1
End SubProcéder ainsi pour chaque liste en ajoutant l’endroit d’apparition de l’image.
Bien entendu la taille du classeur augmente avec le nombre d'images. Dans ce cas on peut stoquer celles-ci dans la machine puis les appeler pour les afficher une par une selon le choix de leur nom, mais c'est une autre histoire que certains sont prêts à te raconter
Bonjour,
Aïe,ça, ça ne sera pas possible. Mes 12 onglets sont différents, et je ne peux pas modifier leur structure. J'ai bien peur que nous soyons obliger de faire un code propre à chaque feuille.
Il y a plus simple, il suffit de remplacer la ligne:
If Not Intersect(Target, Range("A20:DU20,A42:DU42")) Is Nothing Then 'si la cellule sélectionnée est comprise dans la plage "A42:DU42"soit en incluant la ligne 19 à contrôler(cela n'aura pas d'incidence sur les feuilles "Foyer" puisque cette ligne est inutilisée dans ces feuilles là.
ou mieux, modifier la ligne en ajoutant des contrôles suivant la feuille (à adapter selon le nom et les particularités de chaque feuille), exemple :
Select Case ActiveSheet.Name
Case Is = "Collège 1"
Plage = "A19:DU19"
Case Is = "Foyer 2"
Plage = "A20:DU20,A42:DU42"
End Select
If Not Intersect(Target, Range(Plage)) Is Nothing Then************************************************************************************
Pour ce qui est de l'effacement des images, je vous propose ceci, sélectionnez la plage de cellules contenant les images à effacer, puis lancez la macro suivante (dans un module standard):
Sub Effacer_Images()
Application.ScreenUpdating = False
For Each img In ActiveSheet.Shapes
On Error Resume Next
img.Delete
On Error GoTo 0
Next
End Sub
Cdlt
Bonjour et bon lundi matin à tous !
J'ai essayer de faire les modifications que tu m'a suggéré Arturo
ou mieux, modifier la ligne en ajoutant des contrôles suivant la feuille (à adapter selon le nom et les particularités de chaque feuille), exemple :
Select Case ActiveSheet.Name
Case Is = "Collège 1"
Plage = "A19:DU19"
Case Is = "Foyer 2"
Plage = "A20:DU20,A42:DU42"
End Select
If Not Intersect(Target, Range(Plage)) Is Nothing Then
************************************************************************************
en adaptant le code au classeur entier. Ca donne un code comme ceci :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Déclaration des variables
Dim f1 As Worksheet, f2 As Worksheet
Dim Sht As Variant
Dim item As String
Dim Nb_Sht As Long, Position As Long
Dim Plage As String
Application.ScreenUpdating = False
Select Case ActiveSheet.Name
Case Is = "Lycée Saint Genès"
Plage = "A28:DU28"
Case Is = "Collège Saint Michel"
Plage = "A20:DU20,A42:DU42"
Case Is = "Collège Le Mirail"
Plage = "A24:DU24"
Case Is = "O'PTIMÔMES"
Plage = "A19:DU19"
Case Is = "Collège Bremontier"
Plage = "A22:DU22"
Case Is = "IDB - IME SAVIO & VILLAS"
Plage = "A19:DU19"
Case Is = "IDB - IME Villa SAISP"
Plage = "A19:DU19"
Case Is = "DIACONAT"
Plage = "A20:DU20,A42:DU42"
Case Is = "IDB - CRFP"
Plage = "A20:DU20,A42:DU42"
Case Is = "IDB - FOYER"
Plage = "A20:DU20,A42:DU42"
Case Is = "IDB - IME Saute Mouton"
Plage = "A22:DU22,A43:DU43"
Case Is = "IDB - SELF"
Plage = "A24:DU24"
End Select
If Not Intersect(Target, Range(Plage)) Is Nothing Then
Set f1 = Sheets("Paramètres") 'on affecte la variable f1 à la feuille "Paramètres"
Set f2 = Sheets(ActiveSheet.Name) 'on affecte la variable f1 à la feuille destination
Position = 0 'on initialise la position à 0 le bord gauche de la cellule de destination
Nb_Sht = 0 'on initialise le compteur d'image à 0
For Each Sht In ActiveSheet.Shapes 'pour chaque image trouvée dans la feuille
On Error Resume Next 'si on détecte une erreur,on passe à la ligne suivante
'*************************************************************************************************************
'si l'adresse de la cellule trouvée qui contient une image correspond à l'adresse de la cellule de destination _
ou si l'image empiète sur la cellule du dessus et celle de gauche, alors
If Sht.TopLeftCell.Address = f2.Cells(Target.Row - 1, Target.Column).Address Or _
Sht.TopLeftCell.Address = f2.Cells(Target.Row - 1, Target.Column - 1).Address Then
If Err.Number = 0 Then 's'il n'y a pas d'erreur
Nb_Sht = Nb_Sht + 1 'on incrémente le compteur d'image
Else
On Error GoTo 0 'on réinitialise la gestion d'erreur
End If
End If
Next Sht 'on cherche l'image suivante
Suite:
If Nb_Sht > 0 Then Position = Position + (50 * Nb_Sht) 'si le nombre d'image trouvée est supérieur à 0
item = Replace(Target, " ", "_") 'on prend le nom sélectionné dans la liste déroulante et on remplace les espaces par des tirets "soulignés"
Sht = Application.Match(Target, f1.Range("A1:A30"), 0) 'on recherche le nom de l'image dans la feuille paramètre
f1.Shapes(item).Copy 'on copie l'image trouvée
f2.Select
ActiveSheet.Paste Cells(Target.Row - 1, Target.Column) 'on la colle en haut et à gauche dans la cellule de destination
'positionnement de l'image
With ActiveSheet.Shapes(item)
.Top = Cells(Target.Row - 1, Target.Column).Top + 10 'on décale vers le bas pour centrer l'image verticalement dans la cellule de destination
.Left = Cells(Target.Row - 1, Target.Column).Left + Position 'on décale vers la droite autant de fois qu'il y a d'image trouvée, pour ne pas qu'elles se chevauchent
End With
'on renomme l'image(avec l'heure) pour le cas où on en ajouterait une autre identique et que le programme ne vienne pas la déplacer _
elle aussi puisqu'elle porterait le même nom que la dernière sélectionnée. _
Ainsi toutes les images sont uniques.
ActiveSheet.Shapes(item).Name = Time 'on renomme l'image pour le cas où une prochaine image identique dans la feuille, qu'elle ne soit pas déplacer elle aussi
End If
End SubA l'exécution tout se passe bien, mais les images se collent à gauche de la cellule (au lieu d'être centré dans al cellule). De plus, si je fais un premier choix et qu'ensuite je le modifie, la 1ere image reste en dessous de la nouvelle.
J'ai essayé d'adapter différent code trouvé ci et là, mais rien ne fonctionne (souvent du à la configuration (en même temps si c'est moi qui le configure, c'est à peu près normal que ça foire
Merci pour votre aide à tous.
Bonjour,
A l'exécution tout se passe bien, mais les images se collent à gauche de la cellule (au lieu d'être centré dans al cellule). De plus, si je fais un premier choix et qu'ensuite je le modifie, la 1ere image reste en dessous de la nouvelle.
En fait, c'est normal puisqu'on ne sait pas à l'avance combien d'images vont être sélectionnées dans la cellule donc, comme lorsqu'on commence à écrire du texte, on commence par la gauche et non pas au milieu de la feuille.
On peut s'amuser à coller la première image au milieu de la cellule, puis si une seconde image qui vient s'ajouter, elle poussera la première sur la gauche et ainsi de suite, mais à partir de la quatrième image (la 3ème étant à peu près au milieu), les nouvelles images devront s'ajouter à la suite des autres, c'est toute une gymnastique a gérer.
On peut aussi à la fin de chaque saisie d'une image, refaire le calcul du nombre d'images et recentrer le tout. je vais regarder cette option.
****************************************************************************************************************************************
De plus, si je fais un premier choix et qu'ensuite je le modifie, la 1ere image reste en dessous de la nouvelle.
Comment procédez-vous? dans un premier temps vous supprimez l'image qui ne vous convient pas et en sélectionnez une autre? vous faites autrement?
Cdlt
Bonjour,
A l'exécution tout se passe bien, mais les images se collent à gauche de la cellule (au lieu d'être centré dans al cellule). De plus, si je fais un premier choix et qu'ensuite je le modifie, la 1ere image reste en dessous de la nouvelle.
En fait, c'est normal puisqu'on ne sait pas à l'avance combien d'images vont être sélectionnées dans la cellule donc, comme lorsqu'on commence à écrire du texte, on commence par la gauche et non pas au milieu de la feuille.
Nous pouvons partir du principe (si cela simplifie les choses) qu'il ne peut y avoir que 1 image par cellule (qui doit correspondre au choix qui est fait dans la liste déroulante juste en dessous).
On peut s'amuser à coller la première image au milieu de la cellule, puis si une seconde image qui vient s'ajouter, elle poussera la première sur la gauche et ainsi de suite, mais à partir de la quatrième image (la 3ème étant à peu près au milieu), les nouvelles images devront s'ajouter à la suite des autres, c'est toute une gymnastique a gérer.
On peut aussi à la fin de chaque saisie d'une image, refaire le calcul du nombre d'images et recentrer le tout. je vais regarder cette option.
J'ai pu lire sur différents forums et autres posts un peu partout sur internet qu'un certain code pouvait permettre d'aligner le "shape" ( si on parle bien de ça ou d'image) selon la cellule. Mais je n'ai pas du tout réussi à correctement configurer la chose (1er lien et 2ème lien).
Pour moi toutes les images se collent à gauche sans se "décaler" :
****************************************************************************************************************************************
De plus, si je fais un premier choix et qu'ensuite je le modifie, la 1ere image reste en dessous de la nouvelle.
Comment procédez-vous? dans un premier temps vous supprimez l'image qui ne vous convient pas et en sélectionnez une autre? vous faites autrement?
Cdlt
L'intérêt est que l'utilisateur n'ai accès qu'aux listes déroulantes (aucunes autre modification n'est souhaitable). Donc dans l'exécution, j'ai imaginé, qu'il n'avait qu'à sélectionner dans la liste déroulante et ensuite imprimer ce dont il avait besoin.
Voici le classeur de travail avec les dernière modification (toujours sous we transfert car je ne peux pas plus le réduire en taille). https://we[point]tl/t-y0TzWJSuCF
Durant mes tests, je vais :
- 1 : sélectionner la case ou la liste déroulante se situe
- 2 : cliquer sur la flèche permettant l'apparition de la liste
- 3 : sélectionner l'appellation que je souhaite
si tout va bien
- 4.1 : je recommence au 1:, sur la deuxième colonne
si je me suis trompé
- 4.2 : je recommence au 2
Pour ce qui concerne l'effacement des pictogrammes j'ai testé de modifier votre code afin qu'il ne sélectionne que les feuilles ou il y a des pictogrammes (encore un soucis de configuration de ma part car je n'ai pas réussi. Des histoire de thisworkbook ou de worksheet.array....[j'ai ragequit].
J'essayai de l'attribuer au bouton situé dans "Index des menus" > la forme d'image. A voir si vous arrivez à faire ce que je souhaite
J'espère être le plus clair possible.
edit du post : ajout de la capture d'écran
Je vais apporter une autre précision/question :
Je ne comprend pas vraiment cette histoire de "décalage" d'image.
En modifiant le code de positionnement directement,
.Top = Cells(Target.Row - 1, Target.Column).Top + 7 'on décale vers le bas pour centrer l'image verticalement dans la cellule de destination
.Left = Cells(Target.Row - 1, Target.Column).Left + 100 'on décale vers la droite autant de fois qu'il y a d'image trouvée, pour ne pas qu'elles se chevauchent, j'obtiens quelque chose de très très correct.
Capture d'écran :
Je suis certain que ton code à une fonctionnalité importante, mais je dois t'avouer que je ne saisi pas vraiment son utilité malgré le fait que tu me les ai déjà expliqué.
Voilà, bon, j'arrête d'apporter des questions/remarques et te laisse bosser, sinon tu avancera jamais ^^'
Oui, mais vous avez 5 plats par jour, vous pouvez très bien demander les 5 images correspondant à ces 5 plats, c'est ce que j'avais crû comprendre, et c'est ce que fait ma proposition.
*************************************************************************
J'ai pu lire sur différents forums et autres posts un peu partout sur internet qu'un certain code pouvait permettre d'aligner le "shape" ( si on parle bien de ça ou d'image) selon la cellule. Mais je n'ai pas du tout réussi à correctement configurer la chose (1er lien et 2ème lien). Oui, mais s'il y en a plusieurs(dans la même cellule) comme dit précédemment, ça ne colle plus.
**************************************************************************
Je ne comprend pas vraiment cette histoire de "décalage" d'image. s'il y a plusieurs images sélectionnées pour la même cellule, il faut bien les décaler pour ne pas qu'elles se chevauchent, non!
Effectivement des interrogations très justifiées que je n'ai pas pensé d'exposer dès le début.
J'explique donc le pourquoi du comment de ces pictogrammes.
Ces derniers sont ici pour symboliser les différentes appellations que nous allons retrouver sur le menu de la semaine. Il ne peux y en avoir que 5 par semaine et ils seront tous différents.
Les pictogrammes ne servent pas à identifier les plats de menu journalier. Ce sont bien 5 appellations que nos convives vont retrouver tout au long de la semaine.
L'utilisateur final, après avoir correctement sélectionner l'appellation dans la liste déroulante (et que le pictogramme correspondant s'affiche lui aussi correctement [ce qui fonctionne aujourd'hui]), devra, simplement effectuer un C/C et placer, à sa guise un mini-pictogramme en face de chaque ligne correspondant.
Ceci est impossible à planifier à l'avance. (Voir exemple en image, ci-après).
Donc si je comprends bien, le décalage des images est valable uniquement si on souhaite mettre plusieurs image dans la même cellule ?
Bonjour YouniCornnn, Le Forum,
Une autre possibilité de fonctionnement au vu du poids du classeur.
Réduit dans le fichier ci-dessous à 1/3 de la taille d'origine.
Voir notes en rouge sur la première feuille.
Mais suite à la dernière image présentée (un peu tard).
L'adaptation peut être réalisée par une seule image (après placement des pictogrammes) sur la semaine entière.
Je ne comprends pas malgré tes explications bien détaillées. Où sont les images ?????
Je ne sais pas ce qu'il est mieux pour les utilisateurs finaux : la complexité et la légéreté d'un modèle comme le tiens ou l'aisance et la modularité comme les modèles précédents ?
Par ailleur je vous mets à disposition le dernier classeur, le plus à jours de mon coté (toujours via wetransfert) : https://we[point]tl/t-nZzD6HHJId
A nouveau,
En retour, pour ce soir, la version 2 du fichier pour affectation des images selon la dernière photo postée à 13h23.
Voir notes ajoutées en feuille Paramêtres.
Où sont les images ?????
Elles sont (4 pour l'instant pour le test) dans le contrôle ListImage nommée Liste. Dans le code de la feuille Collège 1.
Revoir le principe selon notes rouges.
Il est aussi possible de prendre une image globale de chaque menu de la semaine, lorsqu'elle est définitive. Pour moins de place.
Je ne sais pas ce qu'il est mieux pour les utilisateurs finaux
Aux utilisateurs a essayer et choisir...
Bonjour BrunoM45,
Je le remets au menu de cette semaine...
Vérifier par le menu Outils puis Références de l'éditeur VBA que ce contrôle Microsoft ImageList 6.0 est coché.
J'arrive aussi à l'utiliser sur un formulaire mais uniquement par le code.
Et il est bien pratique parfois.
A+
Salut X Cellus
Merci de le remettre au menu
Sinon pour la référence, le problème est bien là, elle n'y est pas par défaut
Cela semble être un contrôle 32bits donc non compatible avec la version 64 comme la mienne
Il faut passer par l'ajout d'un contrôle supplémentaire mais sur un USF
C'était juste pour info
A+
Bonjour Messieurs,
Je suis ravi que vous preniez plaisir à redécouvrir des outils que vous maîtriser par avant ! Comme pour Bruno, je n'ai pas la possibilité de "voir" les propriété du contrôle listimage.
Je devrais entre aujourd'hui et demain faire tester vos versions aux utilisateurs finaux. Personnellement, même si les combox et le placement "automatique" dans les cellules en pointillés sont agréable, dans la réalité il est préférable que l'utilisateur final effectue cette mise en page lui même.
Je verrais ce qu'il en pense et reviendrais vers vous !
Si Arturo passe par ici, est-ce que le code actuellement dans le dernier classeur disponible sur We transfert est viable, et ne créée pas de conflit ? Pour l'instant j'ai des erreurs de débogage lorsque je suis en mode édition (quand je veux modifier quelque chose sur d'autres feuilles).
C'est à mon avis quelque chose au niveau de la gestion du code dans le classeur en général. C'est tout de même important car les utilisateurs finaux doivent pouvoir saisir des plages dans l'index des menus.
X Cellus, ce que tu propose est très poussé, c'est remarquable, j'aimerais un jour atteindre ce niveau ! Chapeau bas !!
