【问题标题】:Runtime Error 438 in a For Loop checking Userform Control ValuesFor 循环检查用户窗体控件值中的运行时错误 438
【发布时间】:2020-01-16 22:06:24
【问题描述】:

我有一个用户窗体,上面有 132 个控件对象。用户填写表单,然后单击“确认”按钮运行一个宏,该宏使用提交的信息来做出决定。下图。我写了一个 If 语句来检查: 如果没有在顶部输入名称,则不要运行宏;如果未选中任何复选框,则不要运行宏。我发现 If 语句在几乎所有选中和未选中框的组合中都能发挥作用。如果它发现任何一个复选框被选中,则它结束 For Loop 并继续执行宏。

这是我的用户表单图像的链接:

这是质量门 If 语句,当我收到错误时,星号** 行会突出显示:

    Dim cCont As Control
    Dim datacheck As Boolean
    datacheck = False
    If ProductName.Value <> "" Then
        For Each cCont In AddNewPage.Controls
            **If TypeName(cCont) = "CheckBox" And cCont.Value = True Then**
                datacheck = True
                Exit For
            End If
        Next cCont
    End If

   If datacheck = True Then
     'very long, hopefully unrelated macro
    Else
        MsgBox ("Please name the part, then click at least one" & Chr(13) & "checkbox. These are _
           the parameters to be audited.")
   End If

问题是,如果我只选中底部三个组中的复选框,我会收到运行时错误 438。如果我只选中顶部组中的复选框,或者如果我选中来自顶部组和底部组,但如果我只选中底部组中的复选框,则不会。

我无法识别顶部复选框和底部复选框之间的区别。属性似乎都是一样的,所以我不知道为什么一个复选框会抛出错误而另一个不会。

【问题讨论】:

  • 所有控件都有Value属性吗?
  • 是的,据我所知。我一一确保在他们的属性字段中输入默认的 False 。并且在非常相似的函数的以下 For 循环中,我没有收到此错误。
  • 错误 438 表示 Value 不是成员,因此您肯定确实拥有没有 Value 属性的控件。查看屏幕截图,我看到一堆 Label 控件 - 这些是主要候选者 =)
  • 好吧,我没想到。有道理,谢谢!

标签: excel vba


【解决方案1】:
If TypeName(cCont) = "CheckBox" And cCont.Value = True Then

问题在于 VBA 的 And 运算符没有短路,因此对于每个 cCont 都系统地评估这两个条件,这可能包括没有的 Label 控件Value 属性。

您可以嵌套条件以实现AndAlso 运算符在 VB.NET 中的短路行为:

If TypeName(cCont) = "CheckBox" Then
    'we're looking at a CheckBox control
    If cCont.Value Then
        '...
    End If
End If

【讨论】:

  • 刚刚测试了一下,没有出现错误。谢谢!我可以在 3 分钟内接受答案。你知道它为什么会这样吗?或者为什么它适用于一个复选框而不适用于另一个?
  • 它适用于所有复选框。您正在迭代所有控件,其中包括 Label 控件。 MSForms.Label 没有 Value 属性。
  • 好的,我没有将标签对象视为控件。我想它取决于它检查复选框而不是标签对象的顺序,并且它没有在顶部组中收到错误,因为 For 循环在到达标签之前结束。
  • 我相信迭代的顺序将取决于将控件添加到表单的 Controls 集合中的顺序,但我不认为以任何方式指定或保证 - 最好不要假设。
猜你喜欢
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多