簡體   English   中英

VBA - IIF聲明與CDate(變體)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM