Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何循环通过UserForm上的复选框?_Excel_Vba - Fatal编程技术网

Excel 如何循环通过UserForm上的复选框?

Excel 如何循环通过UserForm上的复选框?,excel,vba,Excel,Vba,通过选择OptionButton,我希望活动表单上的所有复选框都取消选择和取消选中 我可以使用For-Each循环取消选择,但这不适用于取消选中框。我得到一个错误: chB.Value=对象变量或未设置块变量 如何解决这个问题 或者: UserForm上可能有一个更改事件,该事件表示如果复选框已启用=False,则值=False 这样我就不必在每个选项按钮上都输入For-Each循环。我尝试了UserForm\u Change Sub和UserForm\u Click,但似乎没有任何效果。您从未

通过选择OptionButton,我希望活动表单上的所有复选框都取消选择和取消选中

我可以使用For-Each循环取消选择,但这不适用于取消选中框。我得到一个错误:

chB.Value=对象变量或未设置块变量

如何解决这个问题

或者:

UserForm上可能有一个更改事件,该事件表示如果复选框已启用=False,则值=False


这样我就不必在每个选项按钮上都输入For-Each循环。我尝试了UserForm\u Change Sub和UserForm\u Click,但似乎没有任何效果。

您从未将任何内容分配给
chb
(我不确定您是否需要使用该变量)。你可以做:

For Each ctrl In Me.frm9301_Equipment.Controls
    ctrl.Enabled = False
    ctrl.Value = False
Next ctrl
只有当所有控件都是复选框时,这才有效。如果不是这样,那么只需添加一些If/then逻辑:

For Each ctrl In Me.frm9301_Equipment.Controls
    If TypeName(ctrl) = "CheckBox" Then
        ctrl.Enabled = False
        ctrl.Value = False
    End If
Next ctrl

下面大卫的回答解决了你的问题。另外,在初始的
if
语句中,您不需要显式地测试
True
False
。改为使用:
如果Me.optB_9201而不是Me.optB_9251而不是Me.optB_9301,那么
。我写了一篇可能会引起兴趣的文章。这很有魅力。谢谢David:)我在发布之前尝试了你的第一个选项,但这对我来说并不奏效,尽管所有控件都是复选框。但是你的第二个选择使用了TypeName解决了这个问题!!如果第一个选项不起作用,那么表单包含一些不是复选框的控件(文本框、组合框、选项按钮、列表框等,甚至标签也是userform上的控件)。很高兴它对你有用!这是一个很大的帮助,谢谢。请务必注意,如果TypeName(ctrl)=“CheckBox”一行区分大小写@PGCodeRider字符串比较总是区分大小写的,除非您使用
选项Compare Text
@PGCodeRider我知道这是肯定的,而且您本身并没有错,但我们不能将每个答案都作为一个机会来掌握新手开发人员可能遇到的每一个潜在问题——几乎,如果不是每种语言都按大小写清楚地对待字符串的话。不考虑这一点几乎肯定是每个开发人员学到的第一堂课,即使是自学的。这就是为什么VBA有LCASE和UCASE函数,为什么python有lower()和upper()方法,为什么C#有ToLower()等等:)
For Each ctrl In Me.frm9301_Equipment.Controls
    If TypeName(ctrl) = "CheckBox" Then
        ctrl.Enabled = False
        ctrl.Value = False
    End If
Next ctrl