2012-07-05 22 views
0

對於自定義對象,我想測試兩個條件。首先是該物體是不是什麼。如果是,請輸入該塊。如果對象不是什麼,我想對對象的某個屬性進行測試,並且只有在通過該測試時才進入該對象。VBA:錯誤使用或(在IF-THEN語句)時拋出,第一個條件測試,如果對象是什麼

因此,聲明將通過類似於:

If myObject Is Nothing Or myObject.myInt > x Then 
    'Perform my task 
End If 

如果myObject的是其實沒什麼,這將引發一個錯誤,因爲當它測試的第二個條件,它會嘗試訪問該ISN一個對象的屬性在那裏。

我已經在過去曾與

大多數語言就懶得來測試或陳述的第二個條件,如果它發現的第一個條件是真實的,所以你可以用寫上一行離開。 VBA似乎不允許這樣做。有沒有什麼等價的方法可以寫出這個聲明,而不訴諸於:

If myObject Is Nothing Then 
    'Perform my task 
ElseIf myObject.myInt > x Then 
    'Perform my task 
End If 

編輯的CLARITY

回答

4

您可以創建一個標誌:

PerformTheTask = False 

If myObject Is Nothing Then 
    PerformTheTask = True 
ElseIf myObject.myInt > x Then 
    PerformTheTask = True 
End If 

If PerformTheTask Then 
    'Perform my task 
End If 
+0

謝謝,DJ,這可能是最有效的方式,它不會把任務放在一個單獨的子程序中(我認爲這是過度殺傷,它只有幾行) – Swiftslide

1

它不會幫助你解決你的代碼的問題,但我想我會包括一個指向短的維基百科頁面 - 電路話務員評價:

http://en.wikipedia.org/wiki/Short-circuit_evaluation

它包含一個常見語言的常用操作符的有用表格,將它們分類爲遵守短路語義還是總是熱切地評估。在VBA的具體基地,他們確認操作數AndOr確實熱切評估。

+0

很高興知道這不是我的想象。有趣的閱​​讀,即。 – Swiftslide

+0

@Swiftslide FWIW,這也很讓人吃驚,我認爲VBA未實現短路'和'或'或'... – reuben

+0

這很有趣。我一直認爲,一旦你學習了語法,所有的編程語言都以相同的方式運行。這讓我想起了學習C++和指針,當我知道在此之前,是爪哇:/ – Swiftslide

1

雖然這是一個有點不尋常,你也可以做到以下幾點:

Select Case True 
    Case myObject Is Nothing, myObject.myInt > x 
     'Perform task 
End Select 

選擇隱性的比較將使用短路計算。 「或」不會。

+1

通過*可能*我的意思是這是可能的,而不是它的一定是個好主意:) – mkingston

+0

最後,它可能不是唯一的原因如果你或其他人可能會回到它並發現它不清楚,一個好主意是。 – mkingston

+0

這對從來不曾這樣做......不過,+1指出這個古怪的結構,並給予其他人的機會,再次強調,不可讀這樣的代碼是一個重大的痛苦一起工作相當該死的好理由。 –

相關問題