Récupérer dans variables OptionButtons Actifs

cathodique

XLDnaute Barbatruc
Bonjour,

J'ai trouvé un code MichelXLD que je voudrais le transformer en fonction pour récupérer le caption des OptionButtons activées dans des variables.

VB:
Private Sub commandButton1_Click()
'lien du code https://www.excel-downloads.com/threads/ref-wiki-2-de-michelxld-ce-qui-touche-aux-userform.92357/
   
Dim Ctrl As Control
   Dim Valeur As String, Vr As Byte, Fx As Byte
   For Each Ctrl In Me.Controls
      If TypeOf Ctrl Is MSForms.OptionButton Then
      If Ctrl.Value = True Then
      Valeur = Valeur & Ctrl.Name & " = True " & Chr(10)
      Vr = Vr + 1
   Else
      Valeur = Valeur & Ctrl.Name & " =False " & Chr(10)
      Fx = Fx + 1
   End If
End If
Next
MsgBox Valeur & Chr(10) & Chr(10) & "Il y a " & Vr & " OptionButton cochés " & Chr(10) & _
       "et " & Fx & " OptionButton non cochés . "
End Sub
https://www.excel-downloads.com/threads/ref-wiki-2-de-michelxld-ce-qui-touche-aux-userform.92357/
Ce code fonctionne parfaitement.
Dans le fichier joint dans chaque Frame, à l'initialisation une OptionButton est activée par défaut.
J'ai donc 3 checkboxs, d'où 3 variables par exemple C1=OptionButton1.Caption, C2=OptionButton3.Caption, C3=OptionButton5.Caption

Comment obtenir par exemple Msgbox C1 & chr(10) & C2 & chr(10) & C3 & chr(10) via une fonction.

En vous remerciant par avance.

Bon week-end.
 

Pièces jointes

  • Caption Actif dans Variable.xlsm
    17.1 KB · Affichages: 18
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour PierreJean;),

Toujours un plaisir de lire tes réponses.
Merci pour ta proposition. Il me semble que mon idée du résultat dans un MsgBox était mauvaise.
En fait, je voudrais récupérer chaque caption (OptionButton.value=True) dans des variables différentes afin que je puisse les réutiliser dans d'autres procédures.
J'ai bien compris ton code. Il n'y a qu'une seule variable (Msg).
Dans mon cas je voudrais 3 variables distinctes.

Merci beaucoup.
 

Staple1600

XLDnaute Barbatruc
Re, Bonjour pierrejean;)

cathodique
1) code à copier dans un module de classe nommé: OptionButtonEventHandler
VB:
Private WithEvents m_optBut As MSForms.OptionButton

Public Sub AssignCheckBox(c As MSForms.OptionButton)
    Set m_optBut = c
End Sub

Private Sub m_optBut_Click()
    MsgBox "L' OptionButton: " + m_optBut.Caption + " a été cliqué!" & Chr(13) & "Son valeur est: " & m_optBut.Value
End Sub
2) Code à mettre dans l'userform
VB:
Option Explicit
' source:[SOF]5695459-240516//10|03
Private eventHandlerCollection As New Collection
Private Sub UserForm_Initialize()
Dim optBEventHandler As OptionButtonEventHandler, c As Control
For Each c In UserForm1.Controls
        If TypeName(c) = "OptionButton" Then
            Set optBEventHandler = New OptionButtonEventHandler
            optBEventHandler.AssignCheckBox c
            eventHandlerCollection.Add optBEventHandler
        End If
    Next
End Sub
 

cathodique

XLDnaute Barbatruc
Re, Bonjour pierrejean;)

cathodique
1) code à copier dans un module de classe nommé: OptionButtonEventHandler
VB:
Private WithEvents m_optBut As MSForms.OptionButton

Public Sub AssignCheckBox(c As MSForms.OptionButton)
    Set m_optBut = c
End Sub

Private Sub m_optBut_Click()
    MsgBox "L' OptionButton: " + m_optBut.Caption + " a été cliqué!" & Chr(13) & "Son valeur est: " & m_optBut.Value
End Sub
2) Code à mettre dans l'userform
VB:
Option Explicit
' source:[SOF]5695459-240516//10|03
Private eventHandlerCollection As New Collection
Private Sub UserForm_Initialize()
Dim optBEventHandler As OptionButtonEventHandler, c As Control
For Each c In UserForm1.Controls
        If TypeName(c) = "OptionButton" Then
            Set optBEventHandler = New OptionButtonEventHandler
            optBEventHandler.AssignCheckBox c
            eventHandlerCollection.Add optBEventHandler
        End If
    Next
End Sub
Merci beaucoup JM;), je n'ai encore atteint un bon niveau pour manipuler les modules de classe.
Merci quand même, je vais essayer de comprendre ton code et essayer de l'adapter à mon cas.

Bon week-end.:)
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Une fonction qui retourne un tableau contenant trois valeurs dont on pourra se servir comme on veut.

VB:
Function Options() As Variant
    Dim res(1 To 3) As String
    With UserForm1
        res(1) = Array(.OptionButton2.Caption, .OptionButton1.Caption)(-(.OptionButton1))
        res(2) = Array(.OptionButton4.Caption, .OptionButton3.Caption)(-(.OptionButton3))
        res(3) = Array(.OptionButton6.Caption, .OptionButton5.Caption)(-(.OptionButton5))
    End With
    Options = res
End Function

Par exemple MsgBox Join(Options(), " ; ")

dim opt1 as string
opt1 = Options(1)

Bonne journée
 

Staple1600

XLDnaute Barbatruc
Re, Bonjour Roblochon

cathodique

Il y a pas grand chose à adapter
Sur quel classeur j'ai testé avant de poster le code VBA à ton avis ;)?
Il suffit de suivre les consignes de mon précédent message et cela doit fonctionner comme cela fonctionne sur mon pc avec ton fichier ;)
 

cathodique

XLDnaute Barbatruc
Re, Bonjour Roblochon

cathodique

Il y a pas grand chose à adapter
Sur quel classeur j'ai testé avant de poster le code VBA à ton avis ;)?
Il suffit de suivre les consignes de mon précédent message et cela doit fonctionner comme cela fonctionne sur mon pc avec ton fichier ;)
Oui tu as testé sur le fichier joint que j'ai monté juste pour illustrer mon problème.
Je dois donc parvenir à adapter sur mon véritable formulaire.
Merci beaucoup.
 

cathodique

XLDnaute Barbatruc
Bonjour,

Une fonction qui retourne un tableau contenant trois valeurs dont on pourra se servir comme on veut.

VB:
Function Options() As Variant
    Dim res(1 To 3) As String
    With UserForm1
        res(1) = Array(.OptionButton2.Caption, .OptionButton1.Caption)(-(.OptionButton1))
        res(2) = Array(.OptionButton4.Caption, .OptionButton3.Caption)(-(.OptionButton3))
        res(3) = Array(.OptionButton6.Caption, .OptionButton5.Caption)(-(.OptionButton5))
    End With
    Options = res
End Function

Par exemple MsgBox Join(Options(), " ; ")

dim opt1 as string
opt1 = Options(1)

Bonne journée
Merci beaucoup Roblochon;), Je pense que ta proposition résoudra mon problème.
Je m'y mettrai ce soir car une obligation familiale m'oblige à sortir tout l'après-midi.

Encore Merci.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
J'ai fait ça, moi :
VB:
Private Sub CommandButton1_Click()
'lien du code https://www.excel-downloads.com/threads/ref-wiki-2-de-michelxld-ce-qui-touche-aux-userform.92357/
   Dim Frm As MSForms.Control, OBn As MSForms.Control, T() As String, N&
   Dim Vr As Byte, Fx As Byte
   For Each Frm In Me.Controls
      If TypeOf Frm Is MSForms.Frame Then
         N = N + 1: ReDim Preserve T(1 To N)
         For Each OBn In Frm.Controls
            If TypeOf OBn Is MSForms.OptionButton Then If OBn.Value Then T(N) = Frm.Name & ": " & OBn.Caption: Exit For
            Next OBn: End If: Next Frm
   MsgBox Join(T, "," & vbLf) & "."
End Sub
 

cathodique

XLDnaute Barbatruc
Bonjour.
J'ai fait ça, moi :
VB:
Private Sub CommandButton1_Click()
'lien du code https://www.excel-downloads.com/threads/ref-wiki-2-de-michelxld-ce-qui-touche-aux-userform.92357/
   Dim Frm As MSForms.Control, OBn As MSForms.Control, T() As String, N&
   Dim Vr As Byte, Fx As Byte
   For Each Frm In Me.Controls
      If TypeOf Frm Is MSForms.Frame Then
         N = N + 1: ReDim Preserve T(1 To N)
         For Each OBn In Frm.Controls
            If TypeOf OBn Is MSForms.OptionButton Then If OBn.Value Then T(N) = Frm.Name & ": " & OBn.Caption: Exit For
            Next OBn: End If: Next Frm
   MsgBox Join(T, "," & vbLf) & "."
End Sub
Bonsoir Dranreb;),
Merci beaucoup. Avec toutes vos propositions, je pense pouvoir m'en sortir pour le reste.

Bonne soirée.
 

Discussions similaires

Statistiques des forums

Discussions
312 192
Messages
2 086 054
Membres
103 110
dernier inscrit
Privé