Bloquer temporairemnt evements de checkbox

bibbip35

XLDnaute Occasionnel
Bonjour le forum

Est-ce qu'il est possible de désactiver temporairement les evenements d'une checkbox

Mon problème est que j'ai des Optionbuttons qui agisse sur des checkbox ( Qui les coche selon valeurs d'une feuille excel )
Mais en parallèle , pour mon application j'ai crée une procédure checkBox1_Click qui des que je valide les options buttons
lance la procèdure ... que je ne veux pas qu'elle soit appliquée

Est-ce que le checkbox_click est la bonne solution ? pour validation d'une Check box

J'ai bien essayé le code suivant mais cela ne fonctionne pas !

Application.EnableEvents = False ' => désactive les événements

'Le code ...

Application.EnableEvents = True ' => réactive les événements


Auriez vosu une idée ?

Merci à tous

Bibbip35
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Application.EnableEvents n'a d'incidence que sur les évènements Excel.
Je ne connais pas de moyen d'impacter les évènements MSForms.
Pour y pallier je déclare généralement une Private ExecInduite As Boolean
Je fais ExecInduite = True avant d'induire inévitablement l'exécution de la Sub qui ne doit pas jouer, au début de laquelle je fais If ExecInduite Then Exit Sub.
 

jmfmarques

XLDnaute Accro
Comme son nom l'indique : l'objet Application est Excel et non un Userform
Sa propriété enableevents est celle de l'objet Application. :)
Tu peux toujours (rien ne l'interdit) utiliser une variable booléenne générale, la passer à true pour "inhiber" et ne pas exécuter les instructions d'une procédure évènementielle si à true, puis la repasser à false ensuite.
Mais relis mon message précédent en ce qui concerne la modification de l'état d'une checkbox.
cette modification génère DEUX évènements distincts (change ET Click)
Il est possible de s'en sortir malgré tout, mais au prix d'une petite usine à gaz déconseillée.

EDIT : salut Dranreb (croisés).
attention toutefois à ce que j'expose plus haut en ce qui concerne le changement d'état d'une checkbox. :)
 

laurent950

XLDnaute Accro
Bonjour Dranred et jmfmarques,

@Dranreb Merci tu es vraiment très agréable de répondre toujours avec une grande précision et surtout d'expliquer et de prendre le temps de comprendre et de ciblé la réponse à apporté avec exemple et synthèse très poussé pour que l'utilisateur puisse appliquer un code dans sa meilleur méthode et pas ce mélanger. tes codes sont d'une très grande qualités. Alors Merci (Pour m'avoir répondu et aussi beaucoup aidé depuis les nombreuses années ou j'ai évolué avec vous ici sur ce forum :D )

@jmfmarques Merci aussi à toi de m'apporté des réponse avec précision à beaucoup de mes diverses interrogations. Vous avez aussi l'avantage d'avoir une très grande connaissance en programmation Excel VBA sur l'ensemble de cette application qui fait partie des plus complexe du marché... Alors je vous remercie aussi de m'avoir répondu et de me répondre très souvent aussi et de me permettre de m'amélioré :D )

Laurent950
 

bibbip35

XLDnaute Occasionnel
Merci à tous pour vos retour

Par contre , je suis désolé mais je n'ai pas compris ce que je pouvais faire sachant que le code est le suivant

Private Sub CheckBox52_Click()

If CheckBox52.Value = True Then

' Désactiver evenements CheckBox 52

OptionButton17.Value = False
OptionButton18.Value = False
OptionButton19.Value = False
Sheets("Cotation_Pose CMS TOP").Range("H68").Value = 4

' Activer evenements CheckBox 52

Merci
 

Dranreb

XLDnaute Barbatruc
Déclarez en tête de votre module Private CBx52Désactivée As Boolean
Dans votre procédure :
VB:
Private Sub CheckBox52_Click()
If CBx52Désactivée Then Exit Sub
If CheckBox52.Value Then
   CBx52Désactivée = True
   OptionButton17.Value = False
   OptionButton18.Value = False
   OptionButton19.Value = False
   Sheets("Cotation_Pose CMS TOP").Range("H68").Value = 4
   CBx52Désactivée = False
   End If
Remarque: la propriété Value d'une CheckBox est déjà un Boolean, alors inutile d'utiliser un opérateur de comparaison (arithmétique de surcroît, alors que les Boolean ont ceux qui leurs sont propres) pour en déterminer une expression Boolean
D'autant que
True = True c'est True,
False = True c'est False, alors
CheckBox52.Value = True C'est CheckBox52.Value tout seul simplement.
 
Dernière édition:

bibbip35

XLDnaute Occasionnel
J'ai essayé mais sans succès...
Par contre , je ne comprends pas qu'un evenement se declare
quant je click sur OptionButton1 qui passe la checkbox1.value= false

Alors que j'utilise un checkbox1.click ...

Je suis un peu perdu ...
 

Dranreb

XLDnaute Barbatruc
Mettre un point d'arrêt au début de la procédure et suivre en pas à pas. On doit fatalement tomber sur l'instruction qui provoque son appel récursif.
Je parlais d'abord d'un nom plus général: ExecInduite. Ce n'est peut être pas seulement la CheckBox1_Click qui doit être inhibée par le test mais aussi et même surtout peut être d'éventuelles OptionButtonX_Change par exemple.
j'ai des Optionbuttons qui agisse sur des checkbox
 
Dernière édition:

bibbip35

XLDnaute Occasionnel
jmfmarques Merci j'ai relu , mais je suis désolé je ne comprends pas comment m'en sortir ...
Il faut que j'utilise pour la checkbox l'evenements change ?

Dranreb , l'instruction qui fait l'appel est
OptionButton17.Value = False
OptionButton18.Value = False
OptionButton19.Value = False
Qui modifie l’état des checkbox ( 8 au total )

MERCI
 

jmfmarques

XLDnaute Accro
Ce n'est pas dans les procédures évènementielles Change et Click, qu'il faut remettre à false la booléenne, mais mettre cette dernière à True juste avant la modification d'état de la checkbox et la remettre à false immédiatement après, selon ce "schéma" (exemple) :

VB:
Private non As Boolean

Private Sub CheckBox1_Change()
  If non Then Exit Sub
  MsgBox "change" 'ne s'afichera que SI action directe sur la textbox
End Sub

Private Sub CheckBox1_Click()
 If non Then Exit Sub
 MsgBox "click" 'ne s'afichera que SI action directe sur la textbox
End Sub

Private Sub CommandButton1_Click()
  non = True
  CheckBox1.Value = Not CheckBox1.Value
  non = False ' c'est là qu'on relibère
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
311 709
Messages
2 081 779
Membres
101 816
dernier inscrit
Jfrcs