VBA code to suppress the the control.Click() Sub /

2019-08-20 02:47发布

OK. This is driving me nuts. I'm still getting a perpetual loop. My previous question got me so far >>> Using VBA code to modify OptionButton.value is activating the control.Click() Sub

I've rewritten some example code to try and nut this out. I've set up a Boolean 'handler' as per other suggestions (eg: Suppress events in UserForms). (I've called it SwitchOnEventResponder)

When it gets to the code that is causing the click event to fire, the handler flips back to True (which allows a value change to activate the _Click() sub) just as the OptionsDLG.OptionButton2.Value = True statement executes. WHY?

Code in the module:

Sub StartDLG()
Call changeframe(135)
'code to change the UserForm (to hide the text box)
Call PopulateText
OptionsDLG.Show
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then Cancel = True
End Sub

Sub PopulateText()
' Populates text box with initial text
OptionsDLG.TextBox1.Value = "Enter your msg here"
End Sub

Sub changeframe(FormH As String)

OptionsDLG.Height = FormH
OptionsDLG.Label1.Visible = False
OptionsDLG.TextBox1.Visible = False
End Sub

UserForm "OptionsDLG" code:

Public SwitchOnEventResponder As Boolean

Private Sub UserForm_Initialize()
        Me.SwitchOnEventResponder = True
End Sub

Private Sub OptionButton2_Change()
        MsgBox "Me.SwitchOnEventResponder = " & Me.SwitchOnEventResponder
        If Me.SwitchOnEventResponder = False Then
            Exit Sub
        End If
    End Sub

Private Sub OptionButton1_Click()

 Unload Me
 Call changeframe(135)
 'code to change the UserForm
 Call PopulateText
 OptionsDLG.Show

End Sub

Private Sub OptionButton2_Click()
 If Me.SwitchOnEventResponder = False Then
            Exit Sub
 End If

 Unload Me

 Call PopulateText

 Me.SwitchOnEventResponder = False
 MsgBox "Me.SwitchOnEventResponder = " & Me.SwitchOnEventResponder
 OptionsDLG.OptionButton1.Value = False
 OptionsDLG.OptionButton2.Value = True '<< This is where the loop starts. grrrr
 Me.SwitchOnEventResponder = True
 OptionsDLG.Show
End Sub

' This runs when the Ok button is clicked
Private Sub OK_Click()
    If OptionButton1.Value = True Then MsgBox "HAPPY"
    If OptionButton2.Value = True Then MsgBox "HAPPIER"
End Sub

' This runs when the cancel button is clicked
Private Sub Cancel_Click()
    ' Show the main dialogue
    Stop
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
            If CloseMode = 0 Then Cancel = True
End Sub

1条回答
Anthone
2楼-- · 2019-08-20 03:33

In order to understand the problem it will help to change your MsgBox message

MsgBox "Me.SwitchOnEventResponder = " & Me.SwitchOnEventResponder & vbCrLf & "OptionsDLG.SwitchOnEventResponder = " & OptionsDLG.SwitchOnEventResponder

enter image description here

Me refers to the current instance of an Object. Calling Unload Me will remove this instance from the Userforms collection. When you set a variable or control on a Userform that is not Loaded a new UserForm is auto-instantiated. The original instance of the Userform Me does not refer to the the new Instance of the UserForm.

Changing Me.SwitchOnEventResponder = False to OptionsDLG.SwitchOnEventResponder = False will solve the problem.

I prefer to create a new instance of the Userform before unloading the current instance. Using a With statement will ensure that all the variables and controls are fully qualified to the correct instance.

With New OptionsDLG
    .SwitchOnEventResponder = False
    .OptionButton1.Value = False
    .OptionButton2.Value = True
    .SwitchOnEventResponder = True
    .Show
End With

Unload Me
查看更多
登录 后发表回答