2017-02-23 59 views
5

我刚开始学习VBA三周前,所以随时批评我的代码。VBA - IIF声明与CDate(变体)

我想用IIF语句做什么。如果语句中:

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功能正确吗?我错过了什么?

+0

变体可以是一切。你有没有检查过它的内容? – RuDevel

回答

6

你不想使用IIf这个(或几乎任何恕我直言)。问题是IIf不是一个“声明” - 它是一个函数。这意味着所有参数在之前被评估为,它们被传递给IIf函数。所以,它的计算结果(按顺序):

IsError(QueryDate) 
"" 
DateDiff("d", CDate(QueryDate), Date) 'This is still evaluated if IsError returns True. 

这意味着你将得到一个运行时错误,因为你会被调用DateDiff不管是否QueryDate是一个错误。

IIf不像其他语言中的三元表达式,因此您不能将其用于警卫子句。

+0

有趣的是,我不知道。谢谢你的详细解释! –

5

就像VBA的逻辑运算符一样,IIF没有short-circuiting semantic(与C和family不同)。因此,错误情况的处理方式与If Then else声明不同。

IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date)) 

这里即使IsError返回true,其包括CDate(QueryDate)将被评估,导致运行时错误的第二种情况。

+1

谢谢!我想我认为这看起来很有效率,但我错了! –