基本上我是一个vba程序员,我遇到了VBA的复选框控件的严重问题。我必须根据用户选择选择和取消选中复选框。我相信这也是vb.net的一般性问题。
一些示例代码
sub chk3_Click()
if userform.chk3.value = true then
userform.chk4.value = true
userform.chk2.value = true
end if
end sub
sub chk4_click()
if userform.chk4.value = true then
userform.chk3.value=true
userform.chk1.value=true
end if
end sub
这是示例代码,我必须根据用户对复选框的选择打开其他复选框。但我面临的问题是它何时执行语句
userform.chk4.value = true in the sub chk3_click
它正在调用sub chk4_click sub并再次找到
userform.chk3.value=true in sub chk4_click(), invoking the sub chk3_click
我无法理解如何解决它。
我已经尝试了各种事件mousedown,mouseup和值更改后也没有工作。这些事件正在崩溃工具我不明白为什么但他们崩溃所以我只是忽略使用这些事件。
最后,我使用了一个在工作簿中全局定义的标志,并使用if条件我已经做了但是它看起来很糟糕的编码风格。任何人都可以帮我这些吗?
这是我为解决问题所做的工作。它有效,但我不认为它的编程风格很好。
dim i as integer
sub ch3_click()
if i = 0 then
i = 1
if userform.chk3.value=true then
userform.chk4.value =true
userform.chk2.value=true
end if
i = 0
end if
end sub
sub chk4_click
if i = 0 then
i = 1
if userform.chk4.value = true then
userform.chk3.value=true
userform.chk1.value=true
end if
i = 0
end if
end sub
非常感谢任何帮助。
答案 0 :(得分:1)
这实际上是解决问题的一种非常有效的方法,您只需要为i提供更具描述性的名称和类型,例如
Dim InClickEvent As Boolean
然后将点击事件代码更改为:
if Not InClickEvent then
InClickEvent = True
if userform.chk3.value=true then
userform.chk4.value =true
userform.chk2.value=true
end if
InClickEvent = False
end if
更好的是,如果您的VBA版本支持Try / Finally,我相信它确实如此,即使您在以下版本的代码中出现错误,也可以确保标记始终被清除:
if Not InClickEvent then
Try
InClickEvent = True
if userform.chk3.value=true then
userform.chk4.value =true
userform.chk2.value=true
end if
Finally
InClickEvent = False
End Try
end if
答案 1 :(得分:0)
查看Application.EnableEvents
sub chk3_Click()
Application.EnableEvents =false
if userform.chk3.value = true then
userform.chk4.value = true
userform.chk2.value = true
end if
Application.EnableEvents =true
end sub
sub chk4_click()
Application.EnableEvents =false
if userform.chk4.value = true then
userform.chk3.value=true
userform.chk1.value=true
end if
Application.EnableEvents =true
end sub