1

我对“和”“或”语句如何协同工作感到困惑。我正在尝试使(某事或某事)语句作为“和”语句的一部分工作,但无法弄清楚逻辑问题由以下两个代码块说明。第一个工作正常..第二个失败,运行时错误 438:“对象不支持此属性或方法”。该错误是指“If j.Enabled...”行。在我看来,两者都应该运行..谁能详细说明为什么不是这样?

代码块 1(运行)

Private Sub Fini_cbn_Click()
Dim j As Control
For Each j In Controls
    If j.Enabled = True And j.Tag = "4" Then
        If j.Value = "<NA>" Or j.Value = "" Then
            j.BackColor = &HFFFF&
            Else
            j.BackColor = &H80000005
        End If
    End If
Next j
End Sub

代码块 2(失败)

Private Sub Fini_cbn_Click()
Dim j As Control
For Each j In Controls
    If j.Enabled = True And j.Tag = "4" And (j.Value = "<NA>" Or j.Value = "") Then
        j.BackColor = &HFFFF&
        Else
        j.BackColor = &H80000005
    End If
Next j
End Sub
4

2 回答 2

1

VBA 不会短路。这意味着每次都会评估整个表达式。

所以在这里

If j.Enabled = True And j.Tag = "4" Then
    If j.Value = "<NA>" Or j.Value = "" Then

j.Value只得到评估,如果 j.Enabled And j.Tag = "4"一切都很好。

但在这儿

If j.Enabled = True And j.Tag = "4" And (j.Value = "<NA>" Or j.Value = "") Then

整个语句被“立即”评估。因此,您的集合中必须有一个没有Value属性的控件。由于该属性不存在,因此无法评估该语句。

于 2015-03-13T14:12:47.377 回答
1

在第二个版本中,为每个控件执行完整的 if 语句。因此,如果有任何控件没有 value 属性,则 if 语句的“j.value”部分被评估,但该控件没有该属性。

在第一个版本中,我猜您只设置了标签并启用了具有“值”属性的控件。所以永远不会尝试找到“j.value”属性。

于 2015-03-13T14:10:51.390 回答