VBA – IIF声明与CDate(变体)
我刚刚开始学习三周前的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不是一个date…它应该由CDate函数的权利? 我错过了什么?
你不想使用IIf
这个(或几乎任何IMHO)。 问题是, IIf
不是一个“声明” – 这是一个function 。 这意味着所有的参数在传递给IIf
函数之前都要进行评估。 所以,它评估(按顺序):
IsError(QueryDate) "" DateDiff("d", CDate(QueryDate), Date) 'This is still evaluated if IsError returns True.
这意味着你会得到一个运行时错误,因为无论QueryDate
是否为错误,你都会调用DateDiff
。
IIf
不像其他语言中的三元expression式,所以你不能用它作为守卫子句。
像VBA的逻辑运算符一样, IIF
不具有短路语义 (不像C和系列)。 因此,错误情况的处理方式与If Then else
语句不同。
IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date))
这里即使IsError
返回true,包含CDate(QueryDate)
的第二种情况也会被计算 ,导致运行时错误。