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)的第二种情况也会被计算 ,导致运行时错误。