2015-03-13 93 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」屬性決不會被找到。