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
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
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))
-.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
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))
-.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
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.
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
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.
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