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函数吗?我错过了什么?
你不想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 不像其他语言中的三元表达式,因此您不能将它用于保护子句.
像VBA的逻辑运算符一样,IIF没有短路语义(与C和系列不同).因此,错误情况的处理方式与处理If Then else语句的处理方式不同.
IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date))
Run Code Online (Sandbox Code Playgroud)
这里即使IsError返回true,CDate(QueryDate) 也将评估包含的第二种情况,从而导致运行时错误.
| 归档时间: |
|
| 查看次数: |
373 次 |
| 最近记录: |