2015-03-13 86 views
1

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

代码块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

这是什么应用程序?访问? – Degustaf 2015-03-13 13:56:42

+2

我的第一个猜测是,每个控件都没有“值”属性,因此您正在循环的控件之一缺少它。尝试msgbox j.value,看看它是否出错,然后控制它出错。 – OpiesDad 2015-03-13 14:07:42

+0

要添加到@OpiesDad:在第二个示例中,'j.Value'总是被评估,如果'.Value'在例如'j.Enabled = False'时不可用,将会出错。在你的第一个例子中,这个问题被绕过 - 因此这是正确的方法。 – 2015-03-13 14:10:27

回答

1

VBA不是short circuit。这意味着整个表达式每次得到评估

所以这里

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

j.Value仅被评估IFj.Enabled And j.Tag = "4",一切都很好。

但这里

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

整个语句被 “立即” 评估。所以,你的收藏必须有一个没有Value属性的控件。由于该属性不存在,因此无法评估该语句。

1

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

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