我刚刚在三周前才开始学习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函数来对吗?我想念什么?

最佳答案

您不想为此使用IIf(或几乎所有恕我直言的东西)。问题在于IIf不是“语句”-它是一个函数。这意味着所有参数在传递给IIf函数之前都要经过评估。因此,它评估(按顺序):

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

这意味着您将获得运行时错误,因为无论DateDiff是否是错误,您都将调用QueryDate
IIf与其他语言中的三元表达式不同,因此不能将其用于保护子句。

关于excel - VBA-带CDate(变体)的IIF语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42428165/

10-09 17:17