XL 2010 Une ComboBox interactive

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

J’ai une ComboBox avec 5 items. Quand je choisis un de ces items, pour qu’il se passe quelque chose (ici, apparition ou pas d’une image) je dois le valider en cliquant sur un CommandButton (petit bouton vert immédiatement à droite de la ComboBox).
Si l’image apparaît, le nom de l’item dans la liste est automatiquement précédé par "No". Si on reclique sur le bouton vert, l’image est occultée et le nom de l’item n’est plus précédé par "No".
Ça marche très bien, mais pour y arriver j’ai dû me servir de 2 fonctions. Ce qui est un peu "lourd" d’un point de vue programmation.

Pourrait-on parvenir au même résultat d’une manière plus élégante ?
 

Pièces jointes

  • Liste Combo.xlsm
    330.9 KB · Affichages: 15

Dranreb

XLDnaute Barbatruc
Bonsoir.
Ce sont les procédures appelées qui me paraissent lourdes plutôt que le fait de les utiliser. Mais je pense que je n'en aurais pas eu besoin, je l'aurais peut être fait comme ça :
Dans ThisWorkbook :
VB:
Option Explicit
Private Sub Workbook_Open()
   Hoja1.ComboChx.List = [Liste_ComboChx].Value
   End Sub
Dans Hoja1 :
VB:
Option Explicit
Private Sub Bouton_ComboChx_Click()
   Dim ChxCombo As Byte, Shp As Shape
   ChxCombo = ComboChx.ListIndex + 1
   Set Shp = Me.Shapes(Replace(Me.ComboChx.Text, "No ", ""))
   Shp.Visible = Not Shp.Visible
   [Liste_ComboChx].Rows(ChxCombo).Value = IIf(Shp.Visible, "No ", "") & Shp.Name
   Me.ComboChx.List = [Liste_ComboChx].Value
   Me.ComboChx.ListIndex = ChxCombo - 1
   End Sub
 

patricktoulon

XLDnaute Barbatruc
bonjour

tu click sur un item et si la shape portant le nom de l'item est invisible elle devient visible et l'item prend le préfixe "No_" et inversement le tout géré dans la combochx
j'ai quand même remis le bouton vert pour tout remettre a zéro mais bon la gestion d'image ("No_/"") peut se faire au click sur combo
 

Pièces jointes

  • Liste Combo.xlsm
    333.4 KB · Affichages: 9

Magic_Doctor

XLDnaute Barbatruc
Bonjour Dranreb, patricktoulon,

D'abord un grand merci pour vos réponses.
Je ne suis pas parvenu à utiliser la proposition de patricktoulon. En revanche, celle de Dranreb m'a particulièrement étonné par sa concision. En somme :
VB:
Private Sub Bouton_ComboChx_Click()
'Dranreb

Dim ChxCombo As Byte, Shp As Shape
 
   ChxCombo = ComboChx.ListIndex + 1
   Set Shp = Me.Shapes(Replace(Me.ComboChx.Text, "No ", ""))
   
   Shp.Visible = Not Shp.Visible
   [Liste_ComboChx].Rows(ChxCombo).Value = IIf(Shp.Visible, "No ", "") & Shp.Name
   Me.ComboChx.List = [Liste_ComboChx].Value
   Me.ComboChx.ListIndex = ChxCombo - 1
 
End Sub
remplace tout simplement :
VB:
Private Sub Bouton_ComboChx_Click()

Dim ChxCombo As Byte
   
    ChxCombo = ComboChx.ListIndex + 1
   
    Select Case ChxCombo
        Case 1 '"Pizza"
            Actualiser_ComboChx 1, 1
        Case 2 '"Banana"
            Actualiser_ComboChx 2, 2
        Case 3 '"Asado"
            Actualiser_ComboChx 3, 3
        Case 4 '"Malabar"
            Actualiser_ComboChx 4, 4
        Case 5 '"Calisson"
            Actualiser_ComboChx 5, 5
    End Select
   
End Sub
--------------------------------------------------------------------
Function RemplacerCaracteres$(LeTexte$, nouveau$, ParamArray supprimer() As Variant)

Dim i As Integer

    For i = 0 To UBound(supprimer())
        LeTexte = Replace(LeTexte, supprimer(i), nouveau) 'supprime les caractères spécifiés
    Next i
   
    RemplacerCaracteres = LeTexte

End Function
'

Function NbOc(chaine As String, Ch As String, Optional RC As Boolean = False) As Long

    If RC Then
        NbOc = (Len(chaine) - Len(Replace(chaine, Ch, "", , , 0))) / Len(Ch)
    Else
        NbOc = (Len(chaine) - Len(Replace(chaine, Ch, "", , , 1))) / Len(Ch)
    End If
   
End Function
-------------------------------------------------------------------------------
Public compt(1 To 5) As Byte '5 compteurs : 1 compteur pour chacun des 5 items modifiables de la liste de la ComboBox "ComboChx"
----------------------------------------------------------------------------

Sub Compteurs(n As Byte, x As Byte)
'Administre tous les compteurs de la feuille
'- n : numéro du compteur
'- x : incrémentation
'job75

    compt(n) = IIf(IsNumeric(Evaluate("Compteur" & n)), Evaluate("Compteur" & n), 0)
    compt(n) = IIf(compt(n) < x, compt(n) + 1, 1)
    ActiveWorkbook.Names.Add Name:="Compteur" & n, RefersTo:=compt(n), Visible:=False
   
End Sub
------------------------------------------------------------------------------------

Sub Actualiser_ComboChx(pos As Byte, Optional compteur As Byte = 0)
'Actualisation la liste de la ComboBox "ComboChx" après avoir sélectionné et validé l'item "Item" / "No Item"
'- pos : position de l'item sélectionné dans la liste de la ComboBox "ComboChx"
'- compteur : le numéro du compteur associé à l'un des items de la ComboBox "ComboChx" si on veut le modifier
'Magic_Doctor

Application.ScreenUpdating = False

Dim dico As Object, i As Byte, item$, listeoptions As Variant, c As Range

    Set dico = CreateObject("Scripting.Dictionary")
    listeoptions = Application.Transpose([Liste_ComboChx].Value) 'dresse la liste de tous les items mémorisés, après dernières modifications, de la ComboBox "ComboChx"
       
    If compteur = 0 Then GoTo Fin 'l'item ne doit pas être modifié ("compteur" est donc omis en paramétrage)
   
        Compteurs compteur, 2 'attribution du compteur ("compteur") correspondant à l'item choisi si on veut qu'il soit modifiable
        item = listeoptions(pos) 'récupère, suivant sa position ("pos"), le nom de l'item dans la matrice
       
    '********************************************************* Actualisation de la ComboBox "ComboChx" **********************************************************
        For Each c In [Liste_ComboChx] '"Liste_ComboChx" est la plage nommée (occultée) sur la feuille qui reçoit tous les items de la liste de la ComboBox "ComboChx"
            If item = c Then
                If compt(compteur) = 1 Then
                    c = "No " & item
                ElseIf compt(compteur) = 2 Then
                    If NbOc(c.Value, "No") > 0 Then c = RemplacerCaracteres(item, "", "No ")
                End If
            End If
        Next
    '************************************** Dresse la liste, dans la ComboBox "ComboChx", de tous les items modifiés ou pas *************************************
        listeoptions = Application.Transpose([Liste_ComboChx].Value)
   
        For i = 1 To UBound(listeoptions) 'rempli le dictionnaire ("dico") avec les éléments de la matrice "listeoptions"
            dico(listeoptions(i)) = ""
        Next
        Sheets("Hoja1").ComboChx.List = dico.keys  'dresse la liste de la ComboBox "ComboChx" à partir du dictionnaire
        Sheets("Hoja1").ComboChx.ListIndex = pos - 1 'sélection de l'item (qu'il soit "item" ou "No item") de la liste de la ComboBox "ComboChx"
   
Fin:
    '*********************************** L'événement, après toute cette mise en scène, peut enfin commencer ************************************
   
    'Événements pour le 1er item de la liste de la ComboBox "ComboChx"
    If pos = 1 Then ActiveSheet.Shapes("Pizza").Visible = IIf(compt(compteur) = 1, True, False) 'l'image apparaît ou pas
   
    'Événements pour le 2ème item de la liste de la ComboBox "ComboChx"
    If pos = 2 Then ActiveSheet.Shapes("Banana").Visible = IIf(compt(compteur) = 1, True, False) 'l'image apparaît ou pas
   
    'Événements pour le 3ème item de la liste de la ComboBox "ComboChx"
    If pos = 3 Then ActiveSheet.Shapes("Asado").Visible = IIf(compt(compteur) = 1, True, False) 'l'image apparaît ou pas
   
    'Événements pour le 4ème item de la liste de la ComboBox "ComboChx"
    If pos = 4 Then ActiveSheet.Shapes("Malabar").Visible = IIf(compt(compteur) = 1, True, False) 'l'image apparaît ou pas
   
    'Événements pour le 5ème item de la liste de la ComboBox "ComboChx"
    If pos = 5 Then ActiveSheet.Shapes("Calissons").Visible = IIf(compt(compteur) = 1, True, False) 'l'image apparaît ou pas

[C2500].Select: Application.ScreenUpdating = True

End Sub
Fichtre ! Et bravo !

Dans ma requête initiale, pour faire simple (erreur de ma part), je n'ai mis que des apparitions et occultations d'images. Dans mon projet, c'est un peu plus tordu ; raison pour laquelle dans la macro "Actualiser_ComboChx" il y a un paramètre optionnel. En fait dans la liste de la ComboBox il y a 3 sortes d'items :
- items comme ceux proposés en début de fil : on valide l'item | une image apparaît | le nom de l'item est précédé de "No".
- deuxième type d'items : exactement comme les précédents, mais au lieu d'une image qui apparaît ou disparaît, c'est une application qui s'ouvre ou se ferme.
- troisième type d'items (d'où le paramétrage optionnel) : on valide l'item, un USF apparaît, le nom de l'item n'est pas modifié (pas de "No" qui précède son nom dans la liste). On ferme l'USF directement à partir de celui-ci (petite croix en haut à droite de l'USF).
 

Discussions similaires

Statistiques des forums

Discussions
312 099
Messages
2 085 273
Membres
102 846
dernier inscrit
gilles45