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 à quel point vos 12 onglets ont différents

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

lv

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 Sub

Procé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 Sub

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.

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" :

capture


****************************************************************************************************************************************

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 :

capture

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 ^^'

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 faitdans la liste déroulante juste en dessous).
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).

capture

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.

12younireduc.zip (332.59 Ko)
X Cellus, juste, woua...

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

9younireducv2.zip (448.73 Ko)

Aux utilisateurs a essayer et choisir...

Bonjour X Cellus,

Quelle très bonne idée
Je pensais que ce "vieux" contrôle ne fonctionnait plus sur les nouvelles versions

Apparemment il fonctionne, en revanche pour moi impossible d'y accéder

2021 12 14 03h01 23

A+

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

image

Cela semble être un contrôle 32bits donc non compatible avec la version 64 comme la mienne

image

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).

capture

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 !!

Rechercher des sujets similaires à "image fonction valeur"