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,

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
Bonjour,
Ayant pris le temps de comprendre et adapter les différents codes proposés.
Je n'ai pas bien compris la syntaxe de la ligne ci-dessous, surtout la 2ème parenthèse.
Cependant, j'ai bien compris que res(1) prend le caption de OptionButton1.
res(1) = Array(.OptionButton2.Caption, .OptionButton1.Caption)(-(.OptionButton1))

Merci par avance.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Pour VBA True = -1 False = 0

-.OptionButton1 = -True ou -False suivant son état
-True = --1 = 1
-False = -0 = 0
Array(0) => première valeur du tableau
Array(1) => deuxième valeur du tableau

J'ai mis -(.OptionButton1) à cause du point et pour enfermer la condition dans des parenthèses mais ce n'est pas absolument nécessaire ici puisque .Optionsbutton1 retourne sa valeur par défaut (True ou False). Pour une condition plus complexe, il faudra mettre les parenthèses.

Cette forme est l'équivalent d'un IIF(cond;resultat1;resultat2). Mais je n'ai jamais apprécié le IIF pour des raisons qui n'ont plus cours aujourd'hui, que cette forme permet plus de possibilités et qu'enfin les vieilles habitudes ont du mal à mourir.

Autre exemple : on a 3 boutons d'options nommés opt1 à opt3 et dont on veut connaître lequel est sélectionné.
VB:
Function Options()
    Options = (Opt1 * -1) + (Opt2 * -2) + (Opt3 * -3)
End Function

Bonne cogitation


Bonjour,
Ayant pris le temps de comprendre et adapter les différents codes proposés.
Je n'ai pas bien compris la syntaxe de la ligne ci-dessous, surtout la 2ème parenthèse.
Cependant, j'ai bien compris que res(1) prend le caption de OptionButton1.
res(1) = Array(.OptionButton2.Caption, .OptionButton1.Caption)(-(.OptionButton1))

Merci par avance.
 

cathodique

XLDnaute Barbatruc
Bonjour,

Pour VBA True = -1 False = 0

-.OptionButton1 = -True ou -False suivant son état
-True = --1 = 1
-False = -0 = 0
Array(0) => première valeur du tableau
Array(1) => deuxième valeur du tableau

J'ai mis -(.OptionButton1) à cause du point et pour enfermer la condition dans des parenthèses mais ce n'est pas absolument nécessaire ici puisque .Optionsbutton1 retourne sa valeur par défaut (True ou False). Pour une condition plus complexe, il faudra mettre les parenthèses.

Cette forme est l'équivalent d'un IIF(cond;resultat1;resultat2). Mais je n'ai jamais apprécié le IIF pour des raisons qui n'ont plus cours aujourd'hui, que cette forme permet plus de possibilités et qu'enfin les vieilles habitudes ont du mal à mourir.

Autre exemple : on a 3 boutons d'options nommés opt1 à opt3 et dont on veut connaître lequel est sélectionné.
VB:
Function Options()
    Options = (Opt1 * -1) + (Opt2 * -2) + (Opt3 * -3)
End Function

Bonne cogitation
Merci beaucoup. Toute ma gratitude pour tes explications.

C'est très clair maintenant.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonjour,

Avec ce code invariant, on récupère dans la BD tous les type de contrôle (TextBox,ComboBox,Cases Options, Cases à cocher)
Contrainte: les titres de la BD sont les noms des contrôle du formulaire.


VB:
Private Sub bt_valider_Click()
       For Each c In Me.Controls
          nom_control = c.Name
          If nom_control <> "CléCherchée" And nom_control <> "Enreg" Then
            col = Application.Match(nom_control, [titre], 0)
            Select Case TypeName(c)
              Case "TextBox", "ComboBox"
                tmp = Me(nom_control)
                If IsNumeric(tmp) Then
                  If InStr(tmp, " ") > 0 Then   tmp = "'" & tmp      Else      tmp = CDbl(tmp)
                End If
                If IsDate(tmp) Then tmp = CDate(tmp)
                f.Cells(ligneEnreg, col) = tmp
              Case "CheckBox"
                 tmp = Me(nom_control)
                 f.Cells(ligneEnreg, col) = tmp
              Case "Frame"
                For Each opt In c.Controls
                  If opt.Value = True Then f.Cells(ligneEnreg, col) = opt.Caption
                Next opt
              Case "ListBox"
                For i = 0 To Me(nom_control).ListCount - 1
                  If Me(nom_control).Selected(i) = True Then
                    temp = temp & Me(nom_control).List(i) & ";"
                  End If
                Next i
                f.Cells(ligneEnreg, col) = temp
            End Select
         End If
      Next c
End Sub


Boisgontier
 

cathodique

XLDnaute Barbatruc
Bonjour,

Avec ce code invariant, on récupère dans la BD tous les type de contrôle (TextBox,ComboBox,Cases Options, Cases à cocher)
Contrainte: les titres de la BD sont les noms des contrôle du formulaire.


VB:
Private Sub bt_valider_Click()
       For Each c In Me.Controls
          nom_control = c.Name
          If nom_control <> "CléCherchée" And nom_control <> "Enreg" Then
            col = Application.Match(nom_control, [titre], 0)
            Select Case TypeName(c)
              Case "TextBox", "ComboBox"
                tmp = Me(nom_control)
                If IsNumeric(tmp) Then
                  If InStr(tmp, " ") > 0 Then   tmp = "'" & tmp      Else      tmp = CDbl(tmp)
                End If
                If IsDate(tmp) Then tmp = CDate(tmp)
                f.Cells(ligneEnreg, col) = tmp
              Case "CheckBox"
                 tmp = Me(nom_control)
                 f.Cells(ligneEnreg, col) = tmp
              Case "Frame"
                For Each opt In c.Controls
                  If opt.Value = True Then f.Cells(ligneEnreg, col) = opt.Caption
                Next opt
              Case "ListBox"
                For i = 0 To Me(nom_control).ListCount - 1
                  If Me(nom_control).Selected(i) = True Then
                    temp = temp & Me(nom_control).List(i) & ";"
                  End If
                Next i
                f.Cells(ligneEnreg, col) = temp
            End Select
         End If
      Next c
End Sub


Boisgontier
Bonjour,

Merci beaucoup Jacques;). Fichier très très intéressant à rajouter à ma biblio.
Excellente journée.
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 915
Membres
101 837
dernier inscrit
Ugo