为什么vba的IIf函数会报错?

在介绍vba中的iif函数之前,我们先来认识下excel中的IF函数。

一、Excel中的IF函数

Excel中的IF函数可以根据条件判断结果的不同输出不同的结果。

它的语法如下

IF(logical_test, value_if_true, [value_if_false])

其中参数logical_test表示逻辑判断的条件

value_if_true表示logical_test 的结果为 TRUE 时,您希望返回的值。

value_if_false表示logical_test 的结果为 FALSE 时,您希望返回的值。

其中logical_test,value_if_true参数是必须的,value_if_false的参数可以省略。

二、VBA中的IIF函数

在VBA中也有一个跟IF函数功能类似的函数,它叫IIF函数。

它的语法如下:

IIf(expr, truepart, falsepart)

它的作用也是根据expr的条件判断结果,返回不同的结果。

如果expr的条件为True,则返回truepart所表示的部分,否则返回falsepart的部分。

乍看之下,会误以为IIF函数和Excel中的IF函数是一样的,没有什么区别。

但是实际上它们还是有区别的。

三、IF函数和IIF函数的差异

为了解释它们之间的区别,让我们来看个案例。

如下图所示为某公司近两年的产品的销量

由于存在2018年或者2019年没有销量的情况,为了计算近两年的销量同比,在D列用IF函数进行了判断,只有近两年都有数据存在的情况下才计算同比。

=IF(AND(LEN(C2)>0,LEN(B2)>0),(C2-B2)/B2,””)

相同的问题,我们用vba中的iif函数来计算同比,代码如下:

Sub QQ1722187970()
    Dim oWK As Worksheet
    Set oWK = Excel.ActiveSheet
    With oWK
        For i = 2 To .Range("a65536").End(xlUp).Row
            .Cells(i, "e") = IIf(Len(.Cells(i, "b")) > 0 And Len(.Cells(i, "c")) > 0, (.Cells(i, "c") - .Cells(i, "b")) / .Cells(i, "b"), "")
        Next i
    End With
End Sub

当运行上述代码时,会弹出如下所示的“除数为零”的错误提示:

单击调试,监视变量I的值会发现i=4时,也就是在第4行的时候出现了这个错误提示:

观察第4行可以发现,由于2018年的销量为空,所以在计算同比的时候除以一个空值,就弹出了“除数为零”的提示。

但是在IIF函数的expr参数部分我们明明有进行条件判断,只有在2018年和2019年都有值的时候,才计算同比。

在Excel中的IF函数不会出错,到了vba中竟然报错了。

原因在于vba中的iif函数,无论expr条件判断的结果是什么,truepart 参数和falsepart参数部分的表达式都会进行计算一遍。而excel中if函数的条件判断为True时,才会计算truepart 部分,条件判断为False时,不会计算truepart 部分。

这就是IIF函数和IF函数的最大区别。

所以今后在设计VBA代码时,务必要留意IIF函数的使用。

如果使用了IIF函数,要考虑IIF函数的条件真和条件假的部分的表达式是否可能产生错误。

       

仅有1条评论 发表评论

  1. 陈晓 /

    同感同感。

发表评论