2017-02-23 67 views
5

我剛開始學習VBA三週前,所以隨時批評我的代碼。VBA - IIF聲明與CDate(變體)

我想用IIF語句做什麼。如果語句中:

Dim rng_ModPlanStart as range 
Dim QueryDate as Variant 

Set rng_ModPlanStart = ThisWorkbook.ActiveSheet.Range("AH2:AH" & LastCell) 
rng_ModPlanStart(1).Offset(-1, 0).Value = "Module Planned Start" 

    For Each cl In rng_ModPlanStart 
     QueryDate = Application.VLookup(ActiveSheet.Range("E" & cl.Row), Sheets("Chamber Schedule").Range("B:U"), 20, False) 
     If Not ((IsError(QueryDate))) Then 
     cl.Value = DateDiff("d", CDate(QueryDate), Date) 
     End If 
    Next cl 

但我在嘗試使用IIF像

IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date)) 

因爲VBA認爲QueryDate時出錯不是日期......它應該由CDate功能正確嗎?我錯過了什麼?

+0

變體可以是一切。你有沒有檢查過它的內容? – RuDevel

回答

6

你不想使用IIf這個(或幾乎任何恕我直言)。問題是IIf不是一個「聲明」 - 它是一個函數。這意味着所有參數在之前被評估爲,它們被傳遞給IIf函數。所以,它的計算結果(按順序):

IsError(QueryDate) 
"" 
DateDiff("d", CDate(QueryDate), Date) 'This is still evaluated if IsError returns True. 

這意味着你將得到一個運行時錯誤,因爲你會被調用DateDiff不管是否QueryDate是一個錯誤。

IIf不像其他語言中的三元表達式,因此您不能將其用於警衛子句。

+0

有趣的是,我不知道。謝謝你的詳細解釋! –

5

就像VBA的邏輯運算符一樣,IIF沒有short-circuiting semantic(與C和family不同)。因此,錯誤情況的處理方式與If Then else聲明不同。

IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date)) 

這裏即使IsError返回true,其包括CDate(QueryDate)將被評估,導致運行時錯誤的第二種情況。

+1

謝謝!我想我認爲這看起來很有效率,但我錯了! –