XL 2010 Afficher une image (logo) en tant que mise en forme conditionnelle

Varenshar

XLDnaute Nouveau
Bonjour à tous,
Après avoir recherché sur ce forum (et d'autres) je n'ai toujours pas trouvé de solution qui me convienne:
Je cherche à insérer une image en tant mise en forme conditionnelle, sans macro et sans liste déroulante, de sorte que quelle que soit la cellule où j'inscrit la valeur correspondante, l'image s'affiche dans ladite cellule.

Il s'agit d'un planning de travail (production) composé de plusieurs onglets selon le produit à fabriquer, et un onglet qui se rempli automatiquement en fonction du produit choisi (dont le déroulement est préalablement planifié dans l'onglet correspondant). Chaque tâche est définie par un abrégé qui lorsqu'il est entré dans une cellule, met en forme ladite cellule dans une couleur définie par mise en forme conditionnelle. Il s'agit dont de faire la même chose avec les images qui correspondent en l’occurrence à des actions spécifiques (prise d'échantillon par exemple) à des moments spécifiques.

Ce planning est destiné à être utilisé par ma responsable qui connaît très peu excel, j'aimerais éviter si possible de lui compliquer la vie plus que nécessaire...

Je prépare un fichier neutre à joindre ultérieurement pour aider à mieux cerner mon problème, mais pour l'heure le temps me manque.
D'avance merci à tous ceux qui sauront m'aider, ou du moins qui essaieront !

Cdlt,
Varenshar
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Varenshar, bienvenue sur XLD,

Dans la feuille de calcul il faut positionner des images à tous les endroits où l'on veut faire apparaître le logo.

Sélectionner chaque image et dans la barre de formule entrer =Formule1 =Formule2 =Formule3 etc...

Voyez le fichier joint avec les noms Formule1 Formule2 Formule3 définis par les formules :
Code:
=SI(Feuil1!$B$5="Oui";Logo!$A$1;Logo!$B$1)
=SI(Feuil1!$I$5="Oui";Logo!$A$1;Logo!$B$1)
=SI(Feuil1!$P$5="Oui";Logo!$A$1;Logo!$B$1)
A+
 

Fichiers joints

Varenshar

XLDnaute Nouveau
Bonjour job75, et merci pour cette réponse rapide, bien qu'elle ne réponde pas exactement à mon besoin.

Je reprécise : Il s'agit d'afficher une image (de petite taille) en fonction d'une valeur écrite dans la cellule ou doit s'afficher ladite image, de la même manière qu'une mise en forme conditionnelle.
Par exemple, lorsque j'inscrit "St" dans une cellule, où que ce soit dans le document, cette cellule devient orange, ainsi que toutes les cellules contenant la même valeur.

Mais lors de certaines étapes, il y a des actions ponctuelles à réaliser en cours de route, comme la prise d'un échantillon par exemple, représentée par un logo (en l’occurrence pour ce cas précis, l'image d'un tube à essais). ce que j'aimerais c'est trouver un moyen d'afficher ce tube à essais dans n'importe quelle cellule du document simplement en inscrivant une valeur dans la cellule correspondante.

Je ne sais pas si c'est possible de faire aussi simple, mais la manière dont fonctionne le fichier ne permet pas une méthode comme la vôtre.

Encore merci,
Cdlt
Varenshar
 

job75

XLDnaute Barbatruc
Je reprécise : Il s'agit d'afficher une image (de petite taille) en fonction d'une valeur écrite dans la cellule ou doit s'afficher ladite image, de la même manière qu'une mise en forme conditionnelle.
Il ne s'agit pas du tout d'une mise en forme conditionnelle et si l'on met l'image sur la cellule à tester on ne pourra pas modifier cette cellule.
 

patricktoulon

XLDnaute Accro
bonjour
@job75 ,jai eu la même réflexion ;)

peut etre que le demandeur devrait savoir qu'il est impossible de mettre un background autre q'une couleur ou un gradient dans une cellule
de ce fait l'image couvrirait la cellule et empêcherait donc de la sélectionner pour modification
il y a bien une astuce simple en terme de raisonnement , mais je m'interroge si ça vaut le coup

pour l'astuce relire les deux dernière lignes vous devriez trouver tout seul
 

job75

XLDnaute Barbatruc
Bonjour patricktoulon,

Je ne vois guère d'astuce autre que d'utiliser le VBA avec cette solution très classique :
VB:
Private Sub WorkSheet_Change(ByVal Target As Range)
Dim txt$, s As Shape, fichier$, c As Range
txt = "tube" 'texte en minuscules à adapter
Set s = Sheets("Image").Shapes(1) 'à adapter
fichier = ThisWorkbook.Path & "\MonImage.gif"
Application.ScreenUpdating = False
Cells.ClearComments 'RAZ
If Application.CountIf(Cells, txt) = 0 Then Exit Sub
'---création du fichier image gif---
s.CopyPicture
With s.Parent.ChartObjects.Add(0, 0, s.Width, s.Height).Chart
    .Parent.Activate 'force le focus sur l'objet
    .Paste
    .Export fichier, "GIF"
    .Parent.Delete 'supprime le graphique temporaire
End With
'---création des commentaires contenant l'image---
For Each c In UsedRange
    If LCase(CStr(c)) = txt Then
        With c.AddComment("").Shape
            .Width = s.Width
            .Height = s.Height
            .Fill.UserPicture fichier 'image en motif du commentaire
        End With
    End If
Next
Kill fichier 'supprime le fichier gif
Me.Activate
End Sub
Voyez le fichier joint, les commentaires créés contiennent l'image du tube en motif.

A+
 

Fichiers joints

patricktoulon

XLDnaute Accro
re
ou on peut faire un insert picture en lui affectant un click
et dans le click la rendre invisible et faire une select sur le topleftcell du shapes(application.caller)
ou meme pas forcement la rendre invisible mais la décaler
et le sheets change réattribue tout
une sorte de bascule shape/cell
 

Varenshar

XLDnaute Nouveau
bonjour
@job75 ,jai eu la même réflexion ;)

peut etre que le demandeur devrait savoir qu'il est impossible de mettre un background autre q'une couleur ou un gradient dans une cellule
Merci patricktoulon, cette réponse me confirme ce que je soupçonnais.
Reste à savoir si une autre solution peut être trouvée pour régler ce problème, sinon ma chef se contentera d'un planning sans ses petits logos !

Je vais continuer à chercher, après tout, ça contribue à me former...
 

patricktoulon

XLDnaute Accro
une ebauche comme ca que l'on peut améliorer

tu tape roi ou fou ou tour en colonne "A"et tu a l'image sur la cellule
tu re clique sur l'image en colonne A ca te supprime l'image et vide la cellule ,il te reste plus qu'a retaper une autre des 2 autres images
 

Fichiers joints

Varenshar

XLDnaute Nouveau
une ebauche comme ca que l'on peut améliorer

tu tape roi ou fou ou tour en colonne "A"et tu a l'image sur la cellule
tu re clique sur l'image en colonne A ca te supprime l'image et vide la cellule ,il te reste plus qu'a retaper une autre des 2 autres images
C'est génial les macros, ce truc marche très bien, presque exactement comme je le voudrais.
Reste à savoir comment le reproduire, et l'adapter à mon fichier...

Il faudrait aussi que toute valeur autre que le nom d'une image soit ignorée par la macro.
Vu ce que je connais des macros (rien donc) je ne suis pas près d'y arriver... hélas.

Plus je parcoure ce forum, plus je constate que j'ai énormément de choses à apprendre, et c'est de plus en plus passionnant !
 

job75

XLDnaute Barbatruc
Bonjour Varenshar, patricktoulon, le forum,

Un essai en plaçant les images dans un UserForm :
VB:
Private Sub WorkSheet_SelectionChange(ByVal Target As Range)
WorkSheet_Change Selection
End Sub

Private Sub WorkSheet_Change(ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
Dim fichier$, s As Shape
fichier = ThisWorkbook.Path & "\MonImage.gif"
For Each s In Sheets("Images").Shapes
    If LCase(s.Name) = LCase(CStr(Target)) Then Exit For
Next
If s Is Nothing Then Unload UserForm1: Application.DisplayFullScreen = False: Exit Sub
Target.Select
Application.DisplayFullScreen = True 'mode Plein écran
Application.ScreenUpdating = False
'---création du fichier image gif---
s.CopyPicture
With s.Parent.ChartObjects.Add(0, 0, s.Width, s.Height).Chart
    .Parent.Activate 'force le focus sur l'objet
    .Paste
    .Export fichier, "GIF"
    .Parent.Delete 'supprime le graphique temporaire
End With
Me.Activate
'---remplissage et positionnement de l'UserForm---
With UserForm1
    .Caption = s.Name
    .PictureSizeMode = fmPictureSizeModeStretch
    .Picture = LoadPicture(fichier)
    Kill fichier 'suppression du fichier image
    .StartUpPosition = 0 'Manual
    .Top = Application.Top + 22 - 14 * ActiveWindow.DisplayHeadings + Target.Top
    .Left = Application.Left - 20 * ActiveWindow.DisplayHeadings + Target(1, 2).Left
    Application.ScreenUpdating = True
    .Show 0 'non modal
End With
End Sub
Bonne journée.
 

Fichiers joints

Dernière édition:

Varenshar

XLDnaute Nouveau
une ebauche comme ca que l'on peut améliorer

tu tape roi ou fou ou tour en colonne "A"et tu a l'image sur la cellule
tu re clique sur l'image en colonne A ca te supprime l'image et vide la cellule ,il te reste plus qu'a retaper une autre des 2 autres images
Bonjour à tous, et merci pour votre acharnement.
A voir votre enthousiasme pour m'aider, je ne peux que continuer à chercher de mon côté, et bien que je n'y connaisse rien au VBA, je me renseigne, je lis des tutos, mais ça ne m'avance pas beaucoup.

Cela dit, j'ai au moins réussi à modifier le code du "bascule pict-cell" de manière à étendre son action à toute la feuille (il suffisait de supprimer la partie "Target.Column = 1").
Reste à comprendre comment faire en sorte que le code ignore toute autre expression ne faisant pas référence à une image. Des idées ?

(Fichier modifié ci-joint, original en feuille 1, modif en feuille 2)
 

Fichiers joints

Dernière édition:

patricktoulon

XLDnaute Accro
Bonjour à tous, et merci pour votre acharnement.
A voir votre enthousiasme pour m'aider, je ne peux que continuer à chercher de mon côté, et bien que je n'y connaisse rien au VBA, je me renseigne, je lis des tutos, mais ça ne m'avance pas beaucoup.

Cela dit, j'ai au moins réussi à modifier le code du "bascule pict-cell" de manière à étendre son action à toute la feuille (il suffisait de supprimer la partie "Target.Column = 1").
Reste à comprendre comment faire en sorte que le code ignore toute autre expression ne faisant pas référence à une image. Des idées ?
ben a vrai dire je t'ai donné quelque chose d'assez abordable même pour un débutant
et visiblement tu n'a pas atteint ce niveau
il est alors pas sympa de ta part de sous entendre que personne s’intéresse a ton sujet sous prétexte que tu n'en comprends pas encore la mécanique
quand aux modifs que tu a fait elle prouve bien que tu n'a pas compris cette mécanique

dis moi un peu a quoi servirait la boucle de suppression dans l’événement change
sachant que quand il y a image il est pas possible de sélectionner et donc taper un texte qui déclencherait l’événement change :rolleyes:

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 Then
        If Target <> "" Then
            With ActiveSheet
                For Each pict In .Pictures
                    If pict.TopLeftCell.Address = Target.Address Then
                        pict.Delete
                    End If
                Next
d'autant plus que la demande secondaire qi est d'exclure ce qui ne serait pas un nom pour une image est le B à BA Du vba

donc mon conseil serait de t’attaquer a des choses plus simples disons les bases et progresser a ton rythme et ne pas culpabiliser les autres pour tes lacunes ;)

non pas sympa du tout !!!!;)
 

Varenshar

XLDnaute Nouveau
ben a vrai dire je t'ai donné quelque chose d'assez abordable même pour un débutant
et visiblement tu n'a pas atteint ce niveau
il est alors pas sympa de ta part de sous entendre que personne s’intéresse a ton sujet sous prétexte que tu n'en comprends pas encore la mécanique
quand aux modifs que tu a fait elle prouve bien que tu n'a pas compris cette mécanique

dis moi un peu a quoi servirait la boucle de suppression dans l’événement change
sachant que quand il y a image il est pas possible de sélectionner et donc taper un texte qui déclencherait l’événement change :rolleyes:

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 Then
        If Target <> "" Then
            With ActiveSheet
                For Each pict In .Pictures
                    If pict.TopLeftCell.Address = Target.Address Then
                        pict.Delete
                    End If
                Next
donc mon conseil serait de t’attaquer a des choses plus simples disons les bases

non pas sympa du tout !!!!;)
Je ne sous entend pas que personne s'intéresse à mon sujet, bien au contraire, je suis surpris par l'engouement qu'il provoque ;-)
Je n'ai effectivement pas compris la mécanique de ce code, ni d'aucun autre d'ailleurs. Je n'ai pas la prétention de devenir un expert VBA en quelques heures ^^, en revanche, la suppression de ce bout de code permet de l'appliquer à toute la feuille, c'est un fait et c'est ce que je veux (même si je ne sais pas comment ça fonctionne)
Le fait de sélectionner l'image la supprime et vide la cellule, la libérant ainsi pour une nouvelle saisie. (Par ailleurs, on peut aussi accéder à ladite cellule par d'autres moyens sans la sélectionner, y entrer une nouvelle donnée, changeant ainsi l'image affichée...)
Si l’événement change n'est pas adapté à mon besoin, qu'est-ce qui l'est?
Il est certain que ce topic n'est pas le lieu pour un cour complet sur le VBA, et ça n'est effectivement pas ma demande, je cherche juste une solution qui fonctionne (et que je comprenne un peu) pour une problème unique.

Dans tous les cas merci mon cher patricktoulon, ton titre d'XLDNaute impliqué n'est pas usurpé !
 
Dernière édition:

patricktoulon

XLDnaute Accro
re
avec mon fichier en exemple
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 And Target.Count = 1 Then
        If Target <> "" Then
            With ActiveSheet
                'pour le cas ou la cellule serait rensignée par vba
                For Each pict In .Pictures
                    If pict.TopLeftCell.Address = Target.Address Then
                        pict.Delete
                    End If
                Next

                For Each pict In .Pictures
                    If pict.Name = Target.Value Then p = True
                Next

                If p = True Then
                    .Pictures(Trim(Target.Text)).Copy
                    .Paste
                    With .Pictures(.Pictures.Count)
                        .Top = Target.Top + 1
                        .Left = Target.Left + 1
                        .Width = Target.Width - 2
                        .Height = Target.Height - 2
                        .Name = "img" & Target.Address(0, 0)
                        .OnAction = "Feuil1.clickcilck"
                    End With
                End If

            End With
        End If
    End If
    Target.Select
End Sub
normalement il tout ce qui correspond pas a fou,tour roi ne fera rien
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Allez encore une solution :
VB:
Private Sub WorkSheet_SelectionChange(ByVal Target As Range)
WorkSheet_Change Selection
End Sub

Private Sub WorkSheet_Change(ByVal Target As Range)
Dim s As Shape, t#
For Each s In Sheets("Images").Shapes
    If LCase(s.Name) = LCase(CStr(Target(1))) Then Exit For
Next
If s Is Nothing Then Exit Sub
s.Copy
Paste
Selection.Top = Target.Top
Selection.Left = Target(1, 2).Left
ActiveCell.Select 'désélectionne l'objet
t = Timer + 5: If t > 86400 Then t = 0 'temporisation de 5 secondes
While Timer < t: DoEvents: Wend
DrawingObjects.Delete
End Sub
A+
 

Fichiers joints

Varenshar

XLDnaute Nouveau
Alors là, chapeau, et un immense merci ! Et ça fonctionne dans mon propre fichier (Bouclier activé, en attente de lapidation) en supprimant la ligne qui m'ennuie (Je ne veux pas être limité à la 1ère colone)

J'essaie de comprendre ce que tu as ajouté:
Si le terme entré = le nom d'une image p=vrai
Si p=vrai : copie et colle l'image associée.

J'ai bon?

Je ne comprend pas grand chose de la syntaxe, j'essaie de traduire dans mon langage de non initié :p
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas