我很担心'和' '或'陈述一起工作。 我正试图将(某事或某事)声明作为“和/或”的一部分。声明却无法弄清楚逻辑 以下两个代码块说明了这个问题。 第一个工作正常。第二个工作正常运行错误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
答案 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
属性的控件。由于该属性不存在,因此无法评估该语句。