在介绍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函数的条件真和条件假的部分的表达式是否可能产生错误。
同感同感。