[英]VBA - IIF Statement with CDate(variant)
我剛剛三周前開始學習VBA,所以請隨意批評我的代碼。
我想使用IIF
語句來做If語句中的內容:
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函數嗎? 我錯過了什么?
你不想使用IIf
(或幾乎任何恕我直言)。 問題是IIf
不是一個“聲明” - 它是一個功能 。 這意味着所有參數在傳遞給IIf
函數之前都要進行評估。 所以,它評估(按順序):
IsError(QueryDate)
""
DateDiff("d", CDate(QueryDate), Date) 'This is still evaluated if IsError returns True.
這意味着您將收到運行時錯誤,因為無論QueryDate
是否為錯誤,您都將調用DateDiff
。
IIf
不像其他語言中的三元表達式,因此您不能將它用於保護子句。
與VBA的邏輯運算符一樣, IIF
沒有短路語義 (與C和系列不同)。 因此,錯誤情況的處理方式與If Then else
語句的處理方式不同。
IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date))
這里即使IsError
返回true, 也將評估包含CDate(QueryDate)
的第二種情況,從而導致運行時錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.