【问题标题】:VBA - IIF Statement with CDate(variant)VBA - 带有 CDate(变体)的 IIF 语句
【发布时间】:2017-02-23 23:33:43
【问题描述】:

我三周前刚开始学习 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 不是一个日期......它应该是由 CDate 函数,对吗?我错过了什么?

【问题讨论】:

  • 变体可以是一切。你检查过它的内容吗?

标签: excel vba


【解决方案1】:

您不想为此使用IIf(或几乎所有恕我直言)。问题是IIf 不是一个“声明”——它是一个函数。这意味着所有参数在传递给IIf 函数之前 进行评估。因此,它评估(按顺序):

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

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

IIf 不像其他语言中的三元表达式,所以不能用于保护子句。

【讨论】:

  • 有趣,我不知道。感谢您的详尽解释!
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢!我想我认为这似乎很有效,但我错了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2020-07-28
相关资源
最近更新 更多