和/或VBA中的组合

时间:2015-03-13 13:45:22

标签: vba or-operator and-operator

我很担心'和' '或'陈述一起工作。 我正试图将(某事或某事)声明作为“和/或”的一部分。声明却无法弄清楚逻辑 以下两个代码块说明了这个问题。 第一个工作正常。第二个工作正常运行错误438失败:"对象不支持此属性或方法"。错误是指"如果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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

VBA不short circuit。这意味着整个表达式每次都进行评估

所以这里

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

j.Value只会被评估 IF j.Enabled And j.Tag = "4",一切都很好。

但是这里

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

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