XL 2021 Colorer 1ère ligne Combobox (vba)

Claudinedu13

XLDnaute Nouveau
Bonjour, j'ai une combobox dans un formulaire

Function items_civilites()
ComboBox2.AddItem "..."
ComboBox2.AddItem "Monsieur"
ComboBox2.AddItem "Madame"
ComboBox2.AddItem "Société"
End Function

Est il possible de colorer la première ligne ...
 
Solution
C'est pas simple ces ImageCombo.
J'ai récupéré l'item choisi sur l'évènement Click(), je ne sais pas le récupérer sur l'évènement Change().
J'ai fourni les images créées à partir du texte en cellule.

Dudu2

XLDnaute Barbatruc
Bonjour,
Non. Sauf a recourir à un artifice de superposition d'un Label coloré sur le 1er Item (si toujours "Monsieur") lorsque la ComboBox est déployée (on le sait en gérant un flag ON/OFF sur l'évènement DropButtonClick) et à gérer le clic dessus. Un peu tordu mais faisable !
Ou alors peut-être une ImageCombo avec du texte en image.
 
Dernière édition:

jcf6464

XLDnaute Occasionnel
Bonjour Claudinedu13 et le forum,
Je vous souhaite une bonne année 2024 avec la santé,

En cherchant un peut sur internet l'on trouve

bonne continuation jc
 

Claudinedu13

XLDnaute Nouveau
Bonjour Claudinedu13 et le forum,
Je vous souhaite une bonne année 2024 avec la santé,

En cherchant un peut sur internet l'on trouve

bonne continuation jc

Merci , j'ai testé mais ça colore touts les éléments du combobox.
 

Dudu2

XLDnaute Barbatruc
C'est pas simple ces ImageCombo.
J'ai récupéré l'item choisi sur l'évènement Click(), je ne sais pas le récupérer sur l'évènement Change().
J'ai fourni les images créées à partir du texte en cellule.
 

Pièces jointes

  • Classeur ImageCombo.xlsm
    41.3 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
bonsoir à tous
je peux jouer moi aussi ?
on prend un userform on lui met une combo
et pour la demo j'ajoute un bouton
1704308827944.png


dans le module de userform
VB:
Private Sub ComboBox1_Change()
MsgBox ComboBox1.Value
End Sub

Private Sub CommandButton1_Click()
transcomB.transforme ComboBox1, Me
End Sub

Private Sub UserForm_Initialize()
ComboBox1.List = [A1:A15].Value
End Sub

mais au dessus de ce code on va lui ajouter
VB:
Dim transcomB As New ComBoTransform

voila notre userform est prêt

maintenant on ajoute un module cl"asse "a notre projet
on le nommera "ComboTransform"

et on lui colle ce code
VB:
Option Explicit
Public WithEvents drpb As msforms.Label
Public WithEvents ItemX As msforms.Label
Public WithEvents formX As UserForm
Public uf As Object
Public framm As Object
Public comBB As Object
Public fait As Boolean
Dim cl(0 To 100) As New ComBoTransform
Public Function transforme(comb As Object, uf)
    Dim i&, Fram, It, dropbutton
    If Me.fait Then Exit Function
    fait = True
    Set Fram = uf.Controls.Add("Forms.Frame.1", "fond")
    Set dropbutton = uf.Controls.Add("Forms.Label.1", "dropbutton")
    comb.ShowDropButtonWhen = 0
    With dropbutton
        .Height = comb.Height - 1
        .Width = 13
        .Caption = "V"
        .Font.Bold = True
        .Left = comb.Left + comb.Width - .Width - 2
        .Top = comb.Top
        .TextAlign = 2
        .BorderStyle = 1
    End With
    comb.Width = comb.Width - 15
    With Fram
        .Width = comb.Width + 15
        .Left = comb.Left
        .Height = comb.ListRows * 13
        .Top = comb.Top + comb.Height
        .ScrollBars = 2
        .Visible = False
        .BorderStyle = 1
        For i = 0 To comb.ListCount - 1
            With cl(i)
                Set .drpb = dropbutton
                Set .uf = uf
                Set .framm = Fram
                Set .comBB = comb
                Set .formX = uf
            End With
            Set It = .Controls.Add("Forms.Label.1", "It" & i)
            With It
                .Caption = comb.List(i)
                .Width = Fram.Width
                .Height = 13
                .BorderStyle = 0
                .BackColor = Array(vbGreen, vbYellow)(Abs(i Mod 2 = 0))
                .Top = 15 * i
          .Left = 2
          .Font.Name = "verdana"
           End With
            Set cl(i).ItemX = It
        Next
        .ScrollHeight = comb.ListCount * (It.Height + 2)
    End With
End Function

Private Sub formX_Click(): framm.Visible = False: End Sub
Private Sub drpb_Click(): framm.Visible = True: framm.ScrollTop = 0: End Sub
Private Sub ItemX_Click(): comBB.Value = ItemX.Caption: framm.Visible = False: End Sub
bon be voila on a notre combobizarrebox 😂
demo.gif
 

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,
Absolument pas compris le principe.
C'est un Frame avec des Labels ? Et c'est le Frame qui est scrollé.
Ok, intéressant. Ce qui serait cool serait d'en faire un utilitaire générique.
Pour le faux DropDown bouton en Label, un "q" en Wingdings 3 ça fait le symbole
1704311479689.png
.

Et pourquoi faut-il un module de classe pour le Transforme ? Pour l'isoler ?
Le code en UserForm devrait suffire, non ?
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonsoir @Dudu2

le principe
1 userform , un combobox , un bouton

je declare une instance de ma classe
je rempli le .list dans le initialise
dans le change de la combo j'affiche un message avec la valeur selectionnée dans la combo

dans le bouton j'appelle ma fonction pour transformer ma combo

dans ma fonction
je declare mes events et mes variable ( controls jumelé j'en ai déjà parlé)
je crée une frame dimensinné au height de la combo* le listrows(pour garder le même listrows
je lui met une scroll vertical a cette frame
elle est dimentionné a la largeur de la combo original
je boucle j'ajoute mes labels dans la frame (jaune ou vert 1 sur 2)
je les inscrit dans les instances de classe
j'ai donc les events
sur l'event dropbutton(bouton de substitution du vrai) j'affiche la frame
sur l'event des labels qui ont pour caption les valeur des items de la combo j'envoie leur caption dans le .value de la combo originale
terminé un peu de cei et de cela
ca me permet de garder mon event change (ou autre d'ailleurs) dans mon userform
en fait ma classe est juste une telecommande avec la reproduction des items dans la frame avec des labels
terminé j'ai ma combo en couleur
en fait c'est juste le dropbutton et la fenêtre enfant de la combo qui sont substitués
et tu t'en sert normalement dans ton userform avec l' event change
pas tres compliqué pour un barbatruc comme toi ,j'ai fait ça à l'arrache en 15 minutes
 

Pièces jointes

  • combofun.xlsm
    26 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
Bonjour @patricktoulon,
Absolument pas compris le principe.
C'est un Frame avec des Labels ? Et c'est le Frame qui est scrollé.
Ok, intéressant. Ce qui serait cool serait d'en faire un utilitaire générique.
Pour le faux DropDown bouton en Label, un "q" en Wingdings 3 ça fait le symbole Regarde la pièce jointe 1187649.

Et pourquoi faut-il un module de classe pour le Transforme ? Pour l'isoler ?
Le code en UserForm devrait suffire, non ?
ouais j'ai eu la fleme de qhercher le caractère
non disons la classe te libère le userform tu t'ocupe de rien
tu lance la fornction transforme et tu continue a te servir de ta combo dans le userform comme si de rien etait
 

Dudu2

XLDnaute Barbatruc
disons la classe te libère le userform tu t'ocupe de rien
C'est sûr, et c'est plus "élégant".
Comme c'est une question qui revient souvent, ça pourrait faire l'objet d'une ressource en ajustant les hauteurs approximativement selon la Font.Size à moins de pouvoir récupérer la hauteur de la DropDown area en mode éclair en API. Je crois qu'on avait fait ça pour le Scroll ComboBox.
 

Statistiques des forums

Discussions
312 216
Messages
2 086 351
Membres
103 195
dernier inscrit
martel.jg