Autres Gestion de treize OptionButton dans un Frame1 d'UserForm1

Webperegrino

XLDnaute Impliqué
(Excel 2003)

Bonjour le Forum,

Dans un UserForm j’ai placé un Frame1 contenant un premier CommandButton1 à action spécifique et douze autres qui auront la même réaction (CommandButton2 à CommandButton13).

Dans le code VBA j’y ai mis un :
For i= 2 to 13 pour ne pas multiplier cette macro sous forme de « Private Sub OptionButton2_Click() à Private Sub OptionButton13_Click() ».

Voici la codification actuelle qui fonctionne si je clique sur le pourtour du Frame1 :

VB:
Private Sub Frame1_Click()
Dim i As Integer
If Me.Controls("OptionButton1").Value = True Then
  ActiveCell = ""
End If
For i = 2 To 13
  If Me.Controls("OptionButton" & i).Value = True Then
    ActiveCell = Me.ListBox1 & Chr(10) & Me.Controls("OptionButton" & i).Caption
  End If
Next i
Unload Me
End Sub
Le problème est que pour sortir de l’userform il me faut cliquer sur le bord du Frame1.
Je voudrais sortir de l’Userform dès qu’un ctrl.Value passe en True.
Pour cela comment modifier la composition macro ci-dessus pour appliquer le « Unload Me » dès qu’un des OptionButton passe en True ou me faut-il faire 12 fois ceci en changeant le n° du CommandButton, de 2 à 13 -que je voudrais éviter- ?

VB:
Private Sub OptionButton2_Click()
For Each ctrl In UserForm1.Frame1.Controls
  If ctrl.Value = True Then ActiveCell = Me.ListBox1 & Chr(10) & ctrl.Caption
Next
Unload Me
End Sub
et ainsi jusqu'à OptionButton13.

Merci
Webperegrino
 

ChTi160

XLDnaute Barbatruc
Bonjour Webperegrino
peut etre avec un exit for dans la boucle
soit:
VB:
 ActiveCell = Me.ListBox1 & Chr(10) & Me.Controls("OptionButton" & i).Caption :Exit For
non teste.
jean marie
 

Webperegrino

XLDnaute Impliqué
Le Forum,
Bonjour Jean-Marie (ChTi160),
Merci d'avoir si vite répondu.
ActiveCell = "" : Exit For
... ainsi que ... & ctrl.Caption : Exit For
... ne me donnent pas plus de résultat : il faut toujours cliquer sur le bord du Frame pour appliquer la macro.
A vrai dire ce n'est pas trop gênant mais il faut à chaque fois cliquer de cette manière pour revenir dans la feuille Excel.
Henri (Webperegrino)
 

eriiiic

XLDnaute Barbatruc
Bonjour,

Si tu veux sortir sur l'action d'un des optionbutton il faut tous les traiter, pas le choix.
A tester faute de fichier fourni :
VB:
Private Sub OptionButton1_Click()
    traiterOpt 1
End Sub

Private Sub OptionButton2_Click()
    traiterOpt 2
End Sub

Private Sub OptionButton3_Click()
    traiterOpt 3
End Sub

Private Sub traiterOpt(opt As Long)
    If opt = 1 Then
        ActiveCell = ""
    Else
        ActiveCell = Me.ListBox1 & Chr(10) & Me.Controls("OptionButton" & opt).Caption
    End If
    Unload Me
End Sub
eric
 

ChTi160

XLDnaute Barbatruc
Re
(pas d Ordi)
je ne comprends pas pourquoi tu utilises la procedure Click du frame?
tu pourrais utiliset une Class avec tes OptionButton
et via cette class gerer les actiin sur tes OptionButton.
essaye de mettre un fichier exemple de ce que tu as et ce que tu veux (avec explications)
edit :bonsoir Eric
jean marie
 

Webperegrino

XLDnaute Impliqué
Le Forum, Jean-Marie,
Bonsoir Éric,
Éric, c'est exactement ce que j'avais appliqué une fois pour l'OptionButton1 et la même programmation pour les douze suivant, mais je cherchais une limitation de création de lignes de VBa... et ça fonctionnait bien.
Jean-Marie, j'essaie de créer un fichier simplifié avec cela et reviens vers vous.
Et pour répondre à la question #5 : ... sinon, après un choix d'OptionButton dans le Frame, l'UserForm reste à l'écran et la macro ne se poursuit pas pour modifier le contenu de ActiveCell. En cliquant sur le Frame, on sort de l'Userform, ActiveCell est changé en conséquence du choix. Ça fonctionne mais c'est un peu "lourd" à la longue après multi-saisies.

Pour faire une réduction des lignes VBA, j'ai aussi pensé à l'étude de fin des OptionButton1 à 13 du style :
slig=Right(OptionButton.name,2)'ok si deux chiffres
If Not IsNumeric(slig) Then slig= Right(slig,1)'correction si entre 1 et 9
Lig=Vla(slig)
Webperegrino
 

Webperegrino

XLDnaute Impliqué
Absolument Éric, c'est ce que j'avais aussi placé avec succès.
Autrement, j'ai aussi remplacé mon contenu Frame1 par une deuxième ListBox et ai indiqué "sortir de l'Userform et placer dans ActiveCell" dès qu'un choix dans ListBox : ça fonctionne très bien sans bouton Validation.
Donc dans le cas d'un Frame1 cliquer sur le bord du Frame1 ou cliquer sur un bouton Validation reviendront au même : après choix dans Frame1 cliquer ailleurs pour sortir.
Donc je crois que je vais abandonner les OptionButton et utiliser une deuxième ListBox c'est plus pratique.
Merci en tout cas de vous être penchés tous les deux sur cette programmation d'OptionButton.
Webperegrino
 

ChTi160

XLDnaute Barbatruc
Re
pas evident de comprendre le but de la procedure.
tu ne peux normalement avoir qu un seul OptionButton a True dans le frame
et tu recuperes la ligne selectionnee dans une ListBox
le tout tu le mets dans une cellule(ActiveCell)
j attends le fichier
avec un module de Class
tu aurais un truc du genre
VB:
ActiveCell=IIf(Optb.Name =“OptionButton1”, “” ,Me.ListBox1 & Chr(10) & OptB.Caption)
jean marie
 

ChTi160

XLDnaute Barbatruc
Re
Ok
Pas d ordi , avant lundi.
peut etre quelqu un va passer par la lol
si non je regarde cela des que possible.
jean marie
 

Webperegrino

XLDnaute Impliqué
Excellent, Jean-Marie,
Aucune urgence car cet exercice est pour me permettre d'augmenter mes connaissances dans la pratique des OptionButton.
Mon fichier original fonctionne déjà très bien avec listbox2 ou appui en bas du Frame sous choix n° 13.
C'était juste pour limiter le nombre de "clics" à l'usage...
Merci encore et bon week-end,
Webperegrino
 

BOISGONTIER

XLDnaute Barbatruc
Bonsoir,

Une autre façon de faire simplement des boutons d'options avec une ListBox

VB:
Private Sub UserForm_Initialize()
Me.ListBox1.List = [Couleur4].Value
Me.ListBox2.List = [Options].Value
End Sub

Private Sub ListBox2_Click()
  MsgBox Me.ListBox2
End Sub

Boisgontier
 

Fichiers joints

Discussions similaires


Haut Bas