VBA - IIF声明与CDate(变体)

Ben*_*rko 5 excel vba excel-vba

我刚刚三周前开始学习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
Run Code Online (Sandbox Code Playgroud)

但是在尝试使用IIF时遇到错误

IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date))
Run Code Online (Sandbox Code Playgroud)

因为VBA认为QueryDate不是一个日期......应该是CDate函数吗?我错过了什么?

Com*_*ern 6

你不想IIf用于此(或几乎任何恕我直言).问题是这IIf不是一个"陈述" - 它是一个功能.这意味着所有参数传递给IIf函数之前都要进行评估.所以,它评估(按顺序):

IsError(QueryDate)
""
DateDiff("d", CDate(QueryDate), Date)   'This is still evaluated if IsError returns True.
Run Code Online (Sandbox Code Playgroud)

这意味着您将收到运行时错误,因为DateDiff无论是否出错,您都将进行调用QueryDate.

IIf 不像其他语言中的三元表达式,因此您不能将它用于保护子句.


A.S*_*S.H 5

像VBA的逻辑运算符一样,IIF没有短路语义(与C和系列不同).因此,错误情况的处理方式与处理If Then else语句的处理方式不同.

IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date))
Run Code Online (Sandbox Code Playgroud)

这里即使IsError返回true,CDate(QueryDate) 也将评估包含的第二种情况,从而导致运行时错误.