XL 2010 inhiber evenement

cathodique

XLDnaute Barbatruc
Bonjour.

La solution de mon problème est surement simple mais je ne parviens pas à la trouver.

Je voudrais empêcher de cliquer dans des checkboxs tant que la combobox est vide, avec affichage d'une msgbox.
Ensuite, quand il y a quelque chose dans la combobox, au clic dans une checkbox, la seconde doit se bloquer et vice-versa.
On doit d'abord décocher l'une pour pouvoir cocher l'autre. Au décochage, il faudrait vider la combobox pour effectuer éventuellement un autre choix.
VB:
Private Sub CheckBox1_Click()
If ComboBox1 <> "" Then
      If CheckBox1.Value = True Then
      CheckBox2.Locked = True
   Else
      CheckBox2.Locked = False
   End If
Else
MsgBox "Action non permise!" & vbLf & vbLf & "Faites un choix dans la liste déroulante.", vbCritical + vbOKOnly, "REJET ACTION"
CheckBox1.Value = False
End If
End Sub
Mon est que je bloque sur le choix des différents évènements et bloquer l'affichage à 2 reprises de la msgbox.
J'ai essayé d'utiliser une variable booléenne mais je me suis emmêlé les pinceaux.

merci pour votre aide.

Bonne journée.
 

Pièces jointes

  • Gerer Evenement.xlsm
    17 KB · Affichages: 4
Solution
comment transformer une serie de checkbox en option button et les faires fonctionner à l'endroit et à l'envers
demo2.gif


VB:
Dim PreviousCTRL As Object
Private Sub CheckBox_Change(check, Optional OK = -2)
    If OK = -2 Then
        If Not ActiveControl Is check Then Exit Sub
        If Not PreviousCTRL Is Nothing Then PreviousCTRL.Value = Not check.Value
        Set PreviousCTRL = check
    Else
        Set PreviousCTRL = Nothing
        For Each ctrl In Me.Controls
            If TypeName(ctrl) = "CheckBox" Then If ctrl.Tag = "g1" Then ctrl.Value = check.Value
        Next
    End If
End Sub



Private Sub CheckBox1_Click()
    CheckBox_Change CheckBox1
End Sub

Private Sub CheckBox2_Click()
    CheckBox_Change CheckBox2
End Sub...

Dranreb

XLDnaute Barbatruc
Bonjour.
Dans les cas de figure où l'objet de la discussion s'applique, je déclare généralement une Private ExecInduite As Boolean. Pour inhiber l'évènement je fais ExecInduite = True devant le changement du contrôle concerné, ExecInduite = False derrière et généralement dans la ligne même derrière l'instruction Sub de sa prise en charge à inhiber : If ExcecInduite Then Exit Sub
 

cathodique

XLDnaute Barbatruc
Bonjour,

Excusez mon retard. Je vous remercie.

@Phil69970 ;), @patricktoulon ;), votre idée est identique. En effet, pour permettre qu'un seul choix les boutons d'options sont plus indiqués.
J'ai joint un fichier très simplifier. En fait, dans mon fichier on fait le choix d'une ou plusieurs activités avec un cas particulier (deux parmi ces checkboxs, ne peuvent être choisies ensembles).
Pour cela, j'ai voulu gardé les checkboxs.

@Dranreb ;), c'est exactement ce que je voulais mais je suis embrouillé. Je reprendrai ça un autre jour, trop fatigué aujourd'hui.

@dysorthographie ;), merci pour ta proposition. Je testerai et reviendrai aux nouvelles.

Merci à vous tous.

Bonne fin d'après-midi.
 

patricktoulon

XLDnaute Barbatruc
comment transformer une serie de checkbox en option button et les faires fonctionner à l'endroit et à l'envers
demo2.gif


VB:
Dim PreviousCTRL As Object
Private Sub CheckBox_Change(check, Optional OK = -2)
    If OK = -2 Then
        If Not ActiveControl Is check Then Exit Sub
        If Not PreviousCTRL Is Nothing Then PreviousCTRL.Value = Not check.Value
        Set PreviousCTRL = check
    Else
        Set PreviousCTRL = Nothing
        For Each ctrl In Me.Controls
            If TypeName(ctrl) = "CheckBox" Then If ctrl.Tag = "g1" Then ctrl.Value = check.Value
        Next
    End If
End Sub



Private Sub CheckBox1_Click()
    CheckBox_Change CheckBox1
End Sub

Private Sub CheckBox2_Click()
    CheckBox_Change CheckBox2
End Sub

Private Sub CheckBox3_Click()
    CheckBox_Change CheckBox3
End Sub

Private Sub CheckBox4_Click()
    CheckBox_Change CheckBox4, CheckBox4.Value
End Sub

lol ;) 🤣
 

cathodique

XLDnaute Barbatruc
Bonjour,
Par défaut tu défini la propriété Locked à True de tous tes CheckBox.

En suite tu affect CheckBoxxxx.Locked= not (listindex=-1) dans l'événement change du combobox.
J'ai d'abord essayé en mettant la proprièté Locked à true. Mais ne fonctionne pas. Je n'ai peut-être pas su suivre tes instructions.
Ensuite, sans succès j'ai locké les checkboxs via uersorm_initialise.
VB:
Private Sub ComboBox1_Change()
CheckBox1.Locked = Not (ComboBox1.ListIndex = -1)
CheckBox2.Locked = Not (ComboBox1.ListIndex = -1)

End Sub

Private Sub UserForm_Initialize()
ComboBox1.List = Array("Bon", "Pas Bon", "Acceptable")
CheckBox1.Locked = True
CheckBox2.Locked = True
End Sub
 

cathodique

XLDnaute Barbatruc
comment transformer une serie de checkbox en option button et les faires fonctionner à l'endroit et à l'envers
Regarde la pièce jointe 1197895

VB:
Dim PreviousCTRL As Object
Private Sub CheckBox_Change(check, Optional OK = -2)
    If OK = -2 Then
        If Not ActiveControl Is check Then Exit Sub
        If Not PreviousCTRL Is Nothing Then PreviousCTRL.Value = Not check.Value
        Set PreviousCTRL = check
    Else
        Set PreviousCTRL = Nothing
        For Each ctrl In Me.Controls
            If TypeName(ctrl) = "CheckBox" Then If ctrl.Tag = "g1" Then ctrl.Value = check.Value
        Next
    End If
End Sub



Private Sub CheckBox1_Click()
    CheckBox_Change CheckBox1
End Sub

Private Sub CheckBox2_Click()
    CheckBox_Change CheckBox2
End Sub

Private Sub CheckBox3_Click()
    CheckBox_Change CheckBox3
End Sub

Private Sub CheckBox4_Click()
    CheckBox_Change CheckBox4, CheckBox4.Value
End Sub

lol ;) 🤣
Bonjour @patricktoulon ;) ,

Merci beaucoup. Ta démo montre bien que ton code fonctionne correctement.
Cependant, le code plante.
J'ai mis dans propriété Tag des 2 Checkboxs concernées "g1".
J'ai supprimé ton mon code de l'userform, copié/collé ton code.
VB:
Dim PreviousCTRL As Object

Private Sub CheckBox_Change(check, Optional OK = -2)

    If OK = -2 Then

        If Not ActiveControl Is check Then Exit Sub

        If Not PreviousCTRL Is Nothing Then PreviousCTRL.Value = Not check.Value

        Set PreviousCTRL = check

    Else

        Set PreviousCTRL = Nothing
''**plante sur tout les lignes en-dessous sur ctrl "variable non définie"
        For Each ctrl In Me.Controls

            If TypeName(ctrl) = "CheckBox" Then If ctrl.Tag = "g1" Then ctrl.Value = check.Value

        Next

    End If

End Sub
J'ai remplacé la variable 'ctrl' par 'PreviousCTRL', on parvient à cocher les 2 checkboxs.
Au moment où je te réponds, je n'ai pas encore testé en déclarant la variable ctrl.

Merci bon journée.
 

cathodique

XLDnaute Barbatruc
Rebonjour @patricktoulon

En effet, la variable n'était pas déclarée et mes Checkboxs sont dans une Frame d'où la petite modification d'une ligne de code. Merci, c'est top. Manque juste le message d'information.
Stp, pourquoi Optional et que signifie OK = -2 ?
Merci.

Voici le code relatif au fichier joint au post#1 (pour un partage efficace)
VB:
Option Explicit
Dim PreviousCTRL As Object
Dim ctrl As Object

Private Sub CheckBox_Change(check, Optional OK = -2)
    If OK = -2 Then
'ActiveControl.ActiveControl parce que les checkboxs sont dans une Frame
        If Not ActiveControl.ActiveControl Is check Then Exit Sub
        If Not PreviousCTRL Is Nothing Then PreviousCTRL.Value = Not check.Value
        Set PreviousCTRL = check
    Else
        Set PreviousCTRL = Nothing
        For Each ctrl In Me.Controls
            If TypeName(ctrl) = "CheckBox" Then If ctrl.Tag = "g1" Then ctrl.Value = check.Value
        Next
    End If
End Sub

Private Sub CheckBox1_Click()
    CheckBox_Change CheckBox1
End Sub

Private Sub CheckBox2_Click()
    CheckBox_Change CheckBox2
End Sub

Bonne journée.
 

patricktoulon

XLDnaute Barbatruc
bonjour l'argument optional ok-2 c'est pour que je puisse m'en passer avec les 3 checkboxs
et donc procéder d'une façon et avec le 4 je l'envoie ce qui me permet de faire l'activation ou le contraire en rafale sur les 3 autres
en gros ça fait 4 event en un et un switch 2 modes
3 events pour check 1 à 3
1 event pour le 4
et par l'effet du not.visible au lieu de true ou false j'ai un switch de mode
donc dans le premier mode tu click ca coche et décoche le précédent
et dans le second ca fait le contraire ca decoche et coche le précédent
c'est assez simple comme astuce non ?
 

cathodique

XLDnaute Barbatruc
bonjour l'argument optional ok-2 c'est pour que je puisse m'en passer avec les 3 checkboxs
et donc procéder d'une façon et avec le 4 je l'envoie ce qui me permet de faire l'activation ou le contraire en rafale sur les 3 autres
en gros ça fait 4 event en un et un switch 2 modes
3 events pour check 1 à 3
1 event pour le 4
et par l'effet du not.visible au lieu de true ou false j'ai un switch de mode
donc dans le premier mode tu click ca coche et décoche le précédent
et dans le second ca fait le contraire ca decoche et coche le précédent
c'est assez simple comme astuce non ?
Honnêtement, je n'ai pas tout compris mais ça fonctionne.
Je cherche presque tout le temps à comprendre un minimum des codes qu'on me propose.
Pour pouvoir me débrouiller sur d'autres fichiers. Ce n'est pas toujours le cas.

Je n'avais pas besoin besoin de l'effet 'rafale', je n'ai donc pas utilisé le code ci-dessous
VB:
Private Sub CheckBox4_Click()
    CheckBox_Change CheckBox4, CheckBox4.Value
End Sub
Quelle est la partie du code dans la procédure (Private Sub CheckBox_Change) qui gère l'effet rafale que je n'utiliserai jamais (du moins dans ce fichier).

L'expérience fait toujours la différence. D'où aussi le nombre d'astuces que tu maitrises et la qualité de tes codes.

Merci beaucoup.
 

Statistiques des forums

Discussions
312 864
Messages
2 093 002
Membres
105 593
dernier inscrit
Damien49