Microsoft 365 Ruban Combobox récupérer l'item

bonoboas

XLDnaute Occasionnel
Bonjour tout le monde,

Je me permets de venir vers vous pour de l'aide sur une ligne de commande pour récupérer l'item d'un combobox.

Je souhaiterais utiliser un combobox dans un ruban pour le choix et un bouton valider pour actionner la macro tributaire du choix.

Je vous joins le fichier.

Merci d'avance pour votre aide.
 

Pièces jointes

  • Combobox.xlsm
    17.7 KB · Affichages: 10

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Pourquoi passer par un bouton Valider ?
J'ai respecté ce choix dans le fichier joint.
Sur Evènement Change du combobox du rubban le texte de l'élément choisit est retenu en variable de module
Dans Validconsult je vous ai mis un exemple d'utilisation avec Select Case, préférable à une succession de if then else.

Cordialement
 

Pièces jointes

  • Ruban-Combobox.xlsm
    24.1 KB · Affichages: 6

fanch55

XLDnaute Barbatruc
Bonjour à tous, j'arrive en retard ( salut @Hasco )
A mettre dans un module :
VB:
Dim Cbconsult_Text As String
Dim Ruban As IRibbonUI
'Callback for CBconsult onChange
Sub CBconsult_Change(control As IRibbonControl, text As String)
    Cbconsult_Text = text
    If Not Ruban Is Nothing Then Ruban.InvalidateControl "Validation"
End Sub
Sub Validconsult(ByVal control As IRibbonControl)
    MsgBox "Texte du combobox : " & Cbconsult_Text
End Sub
Sub Get_Visible(control As IRibbonControl, ByRef returnedVal)
    If control.ID = "Validation" Then
        returnedVal = Cbconsult_Text <> vbNullString
    End If
End Sub
Sub Load_Ribbon(ribbon As IRibbonUI)
    Set Ruban = ribbon
End Sub

A mettre dans le Xml du classeur :
HTML:
<customUI     xmlns="http://schemas.microsoft.com/office/2009/07/customui"
           onLoad="Load_Ribbon">
    <ribbon >
      <tabs>
        <!-- Consultation  -->
        <tab id = "Consultationonglet" label="Consultation" insertBeforeQ="TabHome">
            <group id="Consultationgroup" label="Courriel de consultation">
                <comboBox   id="CBconsult"
                         label="Choix du courriel :"
                    sizeString="MMMMMMMMMMMMMMMMMMMMM"
                      onChange="CBconsult_Change">
                    <item id="consult_01" label="Courriel consultation par lot"/>
                    <item id="consult_02" label="Courriel consultation BET acoustique"/>
                    <item id="consult_03" label="Courriel entreprise retenu"/>
                    <item id="consult_04" label="Courriel proposition de rendez-vous"/>
                    <item id="consult_05" label="Courriel confirmation de rendez-vous"/>
                    <item id="consult_06" label="Courriel remerciement d'avoir répondu"/>
                    <item id="consult_07" label="Courriel non retenu"/>
                </comboBox>
                <button    id="Validation"
                    label="Valider"
                 onAction="Validconsult"
                     size="large"
                    image="Validate"
               getVisible="Get_Visible"/>
            </group>
        </tab>
      </tabs>
    </ribbon>
</customUI>

Classeur joint avec les codes et le xml
 

Pièces jointes

  • Combobox.xlsm
    20.1 KB · Affichages: 7

Lolote83

XLDnaute Barbatruc
Bonjour à tous,
Je suis intéressé pour comprendre comment l'onglet "Consulation" a été créé, cela apporte un plus et de nombreuses possibilités.
Rien n'apparait dans le code VBA
@fanch55 , comment faire
A mettre dans le Xml du classeur :
Ou trouver cette information.
Je vois dans la partie du code donné, la liste qui rempli le combobox, mais comment y accéder ?
Merci pour votre retour
@+ Lolote83
 

fanch55

XLDnaute Barbatruc
Bonjour à tous,
Je suis intéressé pour comprendre comment l'onglet "Consulation" a été créé, cela apporte un plus et de nombreuses possibilités.
Rien n'apparait dans le code VBA
@fanch55 , comment faire

Ou trouver cette information.
Je vois dans la partie du code donné, la liste qui rempli le combobox, mais comment y accéder ?
Merci pour votre retour
@+ Lolote83
Télécharger l'éditeur Customui ci-dessous qui est plus complet et moins crispant que celui de Microsoft :
lancer celui-ci et faire "ouvrir" le classeur concerné, vous aurez accès à la partie xml du ruban .
 

fanch55

XLDnaute Barbatruc
Sinon pour le fun:
items du combobox dans le code plutôt que dans le Xml ( ce qui permet d'éviter de mettre à jour le Xml en cas d'évolution de la liste ... )
VB:
Dim Cbconsult_Text As String
Dim Ruban As IRibbonUI
Sub CBconsult_Change(control As IRibbonControl, text As String)
    Cbconsult_Text = text
    If Not Ruban Is Nothing Then Ruban.InvalidateControl "Validation"
End Sub
Sub Validconsult(ByVal control As IRibbonControl)
    MsgBox "Texte du combobox : " & Cbconsult_Text
End Sub
Sub Get_Visible(control As IRibbonControl, ByRef returnedVal)
    If control.ID = "Validation" Then
        returnedVal = Cbconsult_Text <> vbNullString
    End If
End Sub
Sub CBconsult_GetItemCount(control As IRibbonControl, ByRef returnedVal)
    returnedVal = Choix_Courriel
End Sub
Sub CBconsult_GetItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
    returnedVal = Choix_Courriel(index)
End Sub
Sub Load_Ribbon(ribbon As IRibbonUI)
    Set Ruban = ribbon
End Sub
Function Choix_Courriel(Optional ByVal index As Integer = -1)

Dim List_Courriel: List_Courriel = Array( _
    "Courriel consultation par lot", _
    "Courriel consultation BET acoustique", _
    "Courriel entreprise retenu", _
    "Courriel proposition de rendez-vous", _
    "Courriel confirmation de rendez-vous", _
    "Courriel remerciement d'avoir répondu", _
    "Courriel non retenu")
    
    If index = -1 Then
        Choix_Courriel = UBound(List_Courriel)
    Else
        Choix_Courriel = List_Courriel(index)
    End If
        
End Function

HTML:
<customUI     xmlns="http://schemas.microsoft.com/office/2009/07/customui"
           onLoad="Load_Ribbon">
    <ribbon >
      <tabs>
        <!-- Consultation  -->
        <tab id = "Consultationonglet" label="Consultation" insertBeforeQ="TabHome">
            <group id="Consultationgroup" label="Courriel de consultation">
                <comboBox   id="CBconsult"
                         label="Choix du courriel :"
                    sizeString="MMMMMMMMMMMMMMMMMMMMM"
                      onChange="CBconsult_Change"
                  getItemCount="CBconsult_GetItemCount"
                  getItemLabel="CBconsult_GetItemLabel"/>
                <button    id="Validation"
                        label="Valider"
                     onAction="Validconsult"
                         size="large"
                        image="Validate"
                   getVisible="Get_Visible"/>
            </group>
        </tab>
      </tabs>
    </ribbon>
</customUI>
 

bonoboas

XLDnaute Occasionnel
Bonjour,

Pourquoi passer par un bouton Valider ?
J'ai respecté ce choix dans le fichier joint.
Sur Evènement Change du combobox du rubban le texte de l'élément choisit est retenu en variable de module
Dans Validconsult je vous ai mis un exemple d'utilisation avec Select Case, préférable à une succession de if then else.

Cordialement
Bonjour Hasco,
Pour répondre à votre question, le bouton valider sert à lancer plusieurs fois la même macro.
Merci pour votre retour, c'est une succession de if then else que je souhaite faire, j'ai essayé votre exemple sur votre fichier et cela fonctionne très bien. Je vous joins le fichier. Cependant, je ne comprends pas, en copiant collant le code XML et le module sur mon fichier de travail, ça ne fonctionne pas, le MsgBox CBX_Item n'affiche rien. Est-ce que vous avez une idée ? Merci
 

Pièces jointes

  • Ruban-Combobox Hasco.xlsm
    18.6 KB · Affichages: 6

bonoboas

XLDnaute Occasionnel
Sinon pour le fun:
items du combobox dans le code plutôt que dans le Xml ( ce qui permet d'éviter de mettre à jour le Xml en cas d'évolution de la liste ... )
VB:
Dim Cbconsult_Text As String
Dim Ruban As IRibbonUI
Sub CBconsult_Change(control As IRibbonControl, text As String)
    Cbconsult_Text = text
    If Not Ruban Is Nothing Then Ruban.InvalidateControl "Validation"
End Sub
Sub Validconsult(ByVal control As IRibbonControl)
    MsgBox "Texte du combobox : " & Cbconsult_Text
End Sub
Sub Get_Visible(control As IRibbonControl, ByRef returnedVal)
    If control.ID = "Validation" Then
        returnedVal = Cbconsult_Text <> vbNullString
    End If
End Sub
Sub CBconsult_GetItemCount(control As IRibbonControl, ByRef returnedVal)
    returnedVal = Choix_Courriel
End Sub
Sub CBconsult_GetItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
    returnedVal = Choix_Courriel(index)
End Sub
Sub Load_Ribbon(ribbon As IRibbonUI)
    Set Ruban = ribbon
End Sub
Function Choix_Courriel(Optional ByVal index As Integer = -1)

Dim List_Courriel: List_Courriel = Array( _
    "Courriel consultation par lot", _
    "Courriel consultation BET acoustique", _
    "Courriel entreprise retenu", _
    "Courriel proposition de rendez-vous", _
    "Courriel confirmation de rendez-vous", _
    "Courriel remerciement d'avoir répondu", _
    "Courriel non retenu")
  
    If index = -1 Then
        Choix_Courriel = UBound(List_Courriel)
    Else
        Choix_Courriel = List_Courriel(index)
    End If
      
End Function

HTML:
<customUI     xmlns="http://schemas.microsoft.com/office/2009/07/customui"
           onLoad="Load_Ribbon">
    <ribbon >
      <tabs>
        <!-- Consultation  -->
        <tab id = "Consultationonglet" label="Consultation" insertBeforeQ="TabHome">
            <group id="Consultationgroup" label="Courriel de consultation">
                <comboBox   id="CBconsult"
                         label="Choix du courriel :"
                    sizeString="MMMMMMMMMMMMMMMMMMMMM"
                      onChange="CBconsult_Change"
                  getItemCount="CBconsult_GetItemCount"
                  getItemLabel="CBconsult_GetItemLabel"/>
                <button    id="Validation"
                        label="Valider"
                     onAction="Validconsult"
                         size="large"
                        image="Validate"
                   getVisible="Get_Visible"/>
            </group>
        </tab>
      </tabs>
    </ribbon>
</customUI>
Bonjour fanch55,
Merci pour votre retour, l'idée de cette macro est de générer un publipostage de courriel via Excel. Chaque item appelle une macro. Je trouve que la solution de select case convient le mieux. Je rencontre un autre problème, lorsque copie-colle le code sur mon fichier de travail la variable CBX_Item n'est plus reconnue, j'ai d'autres combobox. Est ce que vous avez une idée ?. Merci encore pour votre retour.
 

Pièces jointes

  • Ruban-Combobox Hasco.xlsm
    18.6 KB · Affichages: 5
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Le fichier fonctionne très bien chez moi.
mettez des points d'arrêt dans votre code, s'il s'arrête là c'est que tout est ok. Vous pourrez faire F8 (pas à pas) et voir le contenu de vos variables locales en affichant la fenêtres des variables locales.(menu affichage)
1667828483054.png


Si cela ne fonctionne pas, enregistrez le classeur, fermer le et rouvrez le puis essayez AVANT d'ouvrir la fenêtre de code.
Si ça fonctionne seulement quand vous n'avez rien modifié dans le code alors voyez ces pages de Ron de Bruin sur la perte de l'état du ruban :
Téléchargez son fichier : Loss of Ribbon state.zip il contient un exemple de ce qu'il faut faire pour corriger ce probème

sinon je ne vois pas.

Cordialement
 

bonoboas

XLDnaute Occasionnel
Re,
Voici le screen
1667829806331.png


Je n'ai aucune erreur,
Lorsque je clique sur le combobox, j'ai bien le CBX_Item qui s'affiche

Lorsque je clique sur Valider

1667829739302.png


il perd la variable CBX_Item,

il fait directement Case Else et affiche "Veuillez choisir votre courriel"

Est-ce que vous avez une idée ?

Merci
 

fanch55

XLDnaute Barbatruc
Bonjour fanch55,
Merci pour votre retour, l'idée de cette macro est de générer un publipostage de courriel via Excel. Chaque item appelle une macro. Je trouve que la solution de select case convient le mieux. Je rencontre un autre problème, lorsque copie-colle le code sur mon fichier de travail la variable CBX_Item n'est plus reconnue, j'ai d'autres combobox. Est ce que vous avez une idée ?. Merci encore pour votre retour.
L'Editor et Excel travaillant avec le même fichier, il y a un ordre à respecter lors de la modification du Xml :
Il faut sauvegarder celui-ci avant toute modification dans le code d'Excel comme il faut réouvrir le xml après avoir modifié Excel ( le dernier à sauvegarder gagne et écrase ce que l'autre a pu faire...)
 
Dernière édition:

fanch55

XLDnaute Barbatruc
Chaque item appelle une macro
No problem avec les items dans le code :
VB:
Sub Validconsult(ByVal control As IRibbonControl)
    MsgBox "Texte du combobox : " & Cbconsult_Text

Dim Macro_Courriel: Macro_Courriel = Array( _
    "Macro_0", _
    "Macro_1", _
    "Macro_2", _
    "Macro_3", _
    "Macro_4", _
    "Macro_5", _
    "Macro_5")
    
    For i = 0 To Choix_Courriel
        If Cbconsult_Text = Choix_Courriel(i) Then
            MsgBox "i=" & i & ", je vais donc lancer la sub " & Macro_Courriel(i)
            Application.Run Macro_Courriel(i)
            Exit For
        End If
    Next
    

End Sub
Sub Macro_0()
    MsgBox "macro_0"
End Sub
Sub Macro_1()
    MsgBox "macro_1"
End Sub
 

Discussions similaires

Réponses
22
Affichages
676

Statistiques des forums

Discussions
312 214
Messages
2 086 309
Membres
103 174
dernier inscrit
OBUTT