Existe t'il l'équivalent de Change pour un Userform ?
C'est à dire une façon d'actualiser.
Par exemple, j'ai ce code :
VB:
Private Sub UserForm_Initialize()
If OptionButton1 = False Then
Frame3.BackColor = RGB(255, 0, 0)
End If
Ça fonctionne bien à l'ouverture du Userform, mais ce n'est ensuite plus actif. Comment faire pour que cette commande soit réactivée pendant l'affichage du Userform sans avoir à le ré-ouvrir ?
Private Sub Frame1_Click()
OptionButton1 = False
Frame1.BackColor = RGB(255, 255, 255)
End Sub
Private Sub OptionButton1_Click()
If OptionButton1 Then Frame1.BackColor = RGB(255, 0, 0)
End Sub
Private Sub UserForm_Activate()
OptionButton1 = False
Frame1.BackColor = RGB(255, 255, 255)
End Sub
Private Sub Frame1_Click()
Call ChangeColor
End Sub
Private Sub OptionButton1_Click()
Call ChangeColor
End Sub
Private Sub UserForm_Activate()
Call ChangeColor
End Sub
Private Sub ChangeColor()
Select Case OptionButton1.Value
Case True: Frame1.BackColor = RGB(255, 0, 0)
Case False: Frame1.BackColor = RGB(255, 255, 255)
End Select
End Sub
Je vous remercie de vos réponses.
Les procédures que vous m'indiquez, je les avais déjà testées. Je souhaitais que le changement se fasse automatiquement, sans avoir à cliquer sur le contrôle.
Ça ne me convient donc pas.
J'ai trouvé la solution en biaisant, à savoir que je recharge le Userform à la suite d'un clic sur un autre OptionButton. Comme ceci :
VB:
Private Sub OptionButton2_Click()
UserForm_Initialize
End Sub
En plus je n'avais probablement pas bien compris le problème : je croyais qu'il fallait changer la couleur de fond du cadre Frame3 en fonction de l'état du bouton-radio OptionButton1, à chaque fois que celui-ci changeait d'état...
Oui, tu as raison, je me suis mal exprimé.
Ce que je voulais dire, c'est ne pas avoir à cliquer sur le frame à chaque fois.
Mais j'ai m'impression que ce n'est pas tout à fait faisable car je me suis heurté à un autre problème.
Il me semble que je devrais plutôt passer par les Checkbox pôur ce que je veux réaliser.
Je reviendrai pour cette seconde partie donc, si je n'arrive pas à avancer.
Merci.
A+ et bonne journée.
Je reste sur cette discussion car il s'agit du même projet.
Lone-wolf (ou quelqu'un d'autre évidemment ),
Comment raccourcir ce code ?
VB:
Private Sub OptionButton1_Click()
If OptionButton1 = True Then Label10.BackColor = 16744576: OptionButton1.Font.Bold = True: OptionButton1.BackColor = 16761024
End Sub
Private Sub OptionButton2_Click()
If OptionButton2 = True Then Label10.BackColor = 16744576: OptionButton2.Font.Bold = True: OptionButton2.BackColor = 16761024
End Sub
Private Sub OptionButton9_Click()
If OptionButton9 = True Then Label11.BackColor = 16744576: OptionButton9.Font.Bold = True: OptionButton9.BackColor = 16761024
End Sub
Private Sub OptionButton10_Click()
If OptionButton10 = True Then Label12.BackColor = 16744576: OptionButton10.Font.Bold = True: OptionButton10.BackColor = 16761024
End Sub
Il y a encore une bonne quinzaine de boutons.
Les Labels et les Frames ne sont pas les mêmes.
Pour les gérer par Frame, j'ai utilisé ce code, qui me contrarie tout de même dans le sens où je suis obligé de cliquer dans le Frame pour actualiser, d'où ma question du début.
VB:
Private Sub Frame4_Click()
Dim Ctrl As Variant
For Each Ctrl In Array(OptionButton8, OptionButton9)
If Ctrl.Value = True Then
Ctrl.BackColor = 16761024 'RGB(255, 0, 140)
Else: Ctrl.BackColor = 16744576: Ctrl.Font.Bold = False
End If
Next
End Sub
Et j'ai fait ça pour chaque Frame.
Il y en a 7...
Là aussi, on devrait pouvoir raccourcir non ?
Je ne pense pas qu'un fichier soit nécessaire, mais j'en ferai un si vous en ressentez le besoin.
Il y a encore une bonne quinzaine de boutons.
Les Labels et les Frames ne sont pas les mêmes.
Pour les gérer par Frame, j'ai utilisé ce code, qui me contrarie tout de même dans le sens où je suis obligé de cliquer dans le Frame pour actualiser, d'où ma question du début.
VB:
Private Sub Frame4_Click()
Dim Ctrl As Variant
For Each Ctrl In Array(OptionButton8, OptionButton9)
If Ctrl.Value = True Then
Ctrl.BackColor = 16761024 'RGB(255, 0, 140)
Else: Ctrl.BackColor = 16744576: Ctrl.Font.Bold = False
End If
Next
End Sub
Et j'ai fait ça pour chaque Frame.
Il y en a 7...
Là aussi, on devrait pouvoir raccourcir non ?
A mon avis, ce que tu as mis dans ta procédure Framex_Click() devrait être, au mieux, dans la procédure d'initialisation du UserForm.
En suite faire pour chaque bouton-radio comme je l'ai indiqué précédemment.
Certes, c'est relativement long à écrire, mais au niveau exécution ça devrait être plus rapide car les différentes procédures de mise en forme s'exécuteront uniquement pour les boutons-radio changeant d'état.
Et pour compléter, je pense qu'il serait également mieux de définir, pour chaque OptionButton de ton UserForm, directement lors de la création de ton UserForm :
- le BackColor à rouge (ou bleu-violet, ou la couleur que tu veux),
- le BackStyle à transparent (sauf pour ceux que tu veux actifs dès le chargement de ton UserForm),
- le Font.Bold à false (sauf pour ceux que tu veux actifs dès le chargement de ton UserForm).
En suite, comme je disais, pour chaque OptionButton tu crées la même procédure :
VB:
Private Sub OptionButton1_Change()
'
With OptionButton1
If .Value Then
.BackStyle = 1
.Font.Bold = True
Else
.BackStyle = 0
.Font.Bold = False
End If
End With
End Sub
Merci de vous intéresser à mon problème.
Voici un fichier avec ce que j'ai déjà fait.
Je pense que ça rejoint ce que préconise Marcel, seulement le code me semble long.
En tout cas tout fonctionne, mis à part qu'il faille cliquer à nouveau dans le Frame 3 par exemple pour réinitialiser, si on a cliqué sur plusieurs OptionButtons ( de 1 à 7)
Et puisqu'on y est, comment éviter les décimales à ralllonge dans la Listbox2 ?
J'ai essayé différentes choses, comme Round() par exemple, mais sans succès.