Insérer un icone faisant parti d'un set d'icone depuis VBA

Re bonjour à tous,

Je souhaiterais savoir si depuis VBA il est possible d'insérer dans une cellule, un icone faisant parti d'un set d'icone, ceux de la mise en forme conditionnelle qui sont en set de 3 ou plus. (parce qu'ils sont joli ^^)

icones mise en forme

Et plus particulièrement l'icône de validation et de croix.

icones

par exemple en faisant l'action insert.object.icone.Id266 (c'est du grand n'importe quoi hein mais c'est parce que je suis débutant)

En fait je voudrais créer une macro évènement double clique.

Quand la case est vide le double clique = icone Validation Vert

Quand la case contient déjà l'icone validation vert alors croix rouge

et aussi l'inverse quand croix rouge alors validation vert.

J'ai réussi à faire ce que je voulais en faisant une macro qui attribut le chiffre 1 ou 2 en suivant la règle du dessus. et en ajoutant par dessus

la mise en forme conditionnelle de jeux d'icone, du coup mes 1 se transforment en croix rouge et les 2 en validation vert (comme je veux finalement)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    If Target.Value = "" Then 'si la cellule est vide alors
        Target.Value = 1 'valeur = 1

    Else 'Sinon

    If Target.Value = 1 Then 'si la cellule =1 alors
        Target.Value = 2 'valeur = 2

    Else 'Sinon

    If Target.Value = 2 Then 'si la cellule =2 alors
        Target.Value = 1 'valeur = 1

    End If
    End If
    End If

End Sub

alors désolé le code est très simpliste et pas du tout optimisé mais c'est avec mon niveau de compétence. (mais je suis content quand même ça marche)

Donc finalement vous allez me demander pourquoi je viens demander de l'aide si ça marche

bah du coup je souhaiterais directement dans ce code remplacer les valeur 1 et 2 par les icones validation et croix,

car dans ma mise en forme actuelle, quand on clique on voit le 1 se mettre dans la case puis ensuite se transformer en icone, ça fait bidouillage

J'ai regardé en enregistrant une macro et en mettant la mise en forme, pour espérer récupérer l'ID des icones, mais je n'y comprends pas grand chose.

Selection.FormatConditions.AddIconSetCondition
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1)
        .ReverseOrder = False
        .ShowIconOnly = False
        .IconSet = ActiveWorkbook.IconSets(xl3Symbols2)
    End With
    With Selection.FormatConditions(1).IconCriteria(2)
        .Type = xlConditionValuePercent
        .Value = 33
        .Operator = 7
    End With
    With Selection.FormatConditions(1).IconCriteria(3)
        .Type = xlConditionValuePercent
        .Value = 67
        .Operator = 7
    End With

ceci est le code de l'action effectué dans la toute première image (mise en forme/jeux d'icones/set)

De ce que je comprend de ce code c'est qu'il appelle un set

IconSets(xl3Symbols2)

puis selon les valeurs appelle l'icone du set

Selection.FormatConditions(1).IconCriteria(2)

j'ai essayé de coller bêtement à mon code

Target.FormatConditions(1).Iconcriteria(2) 

Mais bien évidemment ça ne marche pas j'imagine que c'est bien plus compliqué que ça.

Je vous met mon fichier en pièce jointe, dans toute la feuille l'évènement double clique met un 1 si vide ou 2 si déjà 1 puis de nouveau 1 si déjà 2. et dans la colonne B il y a la mise en forme qui transforme les 1 et 2 en icone.

Merci d'avance pour votre aide

14test-icones.xlsm (12.77 Ko)

Bonjour,

Pas certain qu'on puisse avoir les ID des icônes ..

En tout cas je vous invite à aller regarder ce sujet que j'ai résolu hier : https://forum.excel-pratique.com/excel/trie-par-date-tableau-croise-dynamique-157797#p976830

J'étais également confronté à cet aspect peu esthétique de la rentrée dans une cellule que j'ai contourné via l'utilisation du Cancel = True.

La partie du code qui va vous intéresser est :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Application.Intersect(Target, ActiveSheet.ListObjects("BDD").ListColumns(6).DataBodyRange.Resize(, 5)) Is Nothing Then
    If Target < 2 Then
        Target = Target + 1
        Else
        Target = 0
    End If
End If
Cancel = True
End Sub

Si vous double cliquez sur une des cellules comprenant les icônes, vous verrez que vous ne voyez rien en arrière plan, hormis dans la barre de formule.

Cdlt,

Edit : Un exemple en ajoutant l'instruction Cancel = True dans votre fichier.

ha oui et aussi, car finalement comme c'est juste le fait que le 1 et le 2 soit visible avant que les icones s'affichent qui m'ennuies.

j'ai essayé bêtement de mettre avant mon code application.screenupdating= False puis remettre True à la fin mais on voit toujours le chiffre se mettre.

après ça marche peut-être seulement sur des macros à cliquer(pour gagner du temps d'exécution) mais pas pour des évènements (en temps réel)?

Ha encore merci Ergotamine !!!

effectivement en ajoutant Cancel = true, je n'ai plus les chiffres qui s'affichent avant !! excellent ! ça me permet de garder mon code (dont je suis fier )

en fait c'est aussi un peu la fonction que je cherchais, mais je connaissais seulement screenupdating ...

je vais me renseigner sur cette fonction pour la comprendre

et grâce aux informations que vous m'avez données hier je vais aussi pouvoir réaliser cet évènement seulement sur une plage précise

Bonjour,

Un indice pour vous aider sur ce lien : https://docs.microsoft.com/fr-fr/office/vba/api/excel.worksheet.beforedoubleclick

Cancel : False lorsque l'événement se produit. Si la procédure événementielle définit cet argument avec la valeur True, l’action de double-clic par défaut n’est pas effectuée à la fin de cette procédure.

Le cancel annule donc l'opération de doubleclic mais pas l'action associée à la procédure qui se déroule AVANT le double clic (before_doubleclick).

Cdlt,

Rechercher des sujets similaires à "inserer icone faisant parti set vba"