哪个if语句在VBA中执行得更快?

时间:2017-10-10 12:50:29

标签: excel vba excel-vba

在VBA中,以下哪个if语句会表现更好?

上下文:我正在寻找一个条目的工作表。

if [condition1] and [condition2] and [condition3] then
    *do something*
end if

if [condition1] then
    if [condition2] then
        if [condition3] then
            *do something*
        end if
    end if
end if

我的直觉说第二个陈述,因为它只需要在进行下一次迭代之前检查一个初始条件,但是这样吗? 还有,有更好的方法吗?

3 个答案:

答案 0 :(得分:7)

这里的link可能会有所帮助。

一般来说,第二个会因为简单的原因而执行得更快:如果第一个条件失败,则不会检查其他两个。在第一种方法中,它必须评估所有三个条件。在其他编程语言中,您有短路,这是在第二种方法中实现的(在VBA中必须以这种方式完成,因为没有短路)。

答案 1 :(得分:7)

  

我们应该忘记小的效率,大约97%的时间说:过早优化是所有邪恶的根源。然而,我们不应该在关键的3%中放弃我们的机会。

     

- 唐纳德克努特

假设没有任何条件产生副作用,基本上归结为:

If True And True And False Then

然后你过度思考它并且可能过度优化而没有任何有意义的性能提升。不要试图从代码中挤出每纳秒,并编写易于阅读,维护,调试和扩展的代码:如果代码中的任何地方存在性能瓶颈,那么&#39 ;不在这里

  

背景信息:我正在寻找一个条目的工作表。

请参阅遍历工作表,查找条目 是您的瓶颈。与工作表交互比与内存数组交互慢几百甚至几千倍。

是的,因为您正在编写昂贵的代码,缺少短路有所作为,但不是因为短路更有效率使用布尔逻辑 - 它会产生[潜在的重大]差异,因为您将有条件地避免昂贵的工作表读取

如果这听起来很矛盾,那你就不明白我的观点:布尔逻辑短路对已经有效的代码的性能影响基本上无关紧要

继续,尝试转储Range您正在迭代(并且您是使用For还是For Each循环进行转换?There's a massive difference between the two,具体取决于您正在做什么)进入2D数组,然后使用For循环迭代它并查找您的条目。我承诺比分离条件以模拟短路的任何事情都要显着提高性能。

或者,或许可以重新评估是否需要迭代任何东西。如果您正在寻找条目,并且根据您的数据的样子,您可以合并"条件列"到一个并使用Application.WorksheetFunction.Match来定位条目而不写任何循环或条件。

答案 2 :(得分:1)

第二种格式是实施速度更快。

通过在即时窗口中尝试以下命令,您可以看到vba没有进行短路评估:

if 1=0 and 1/0 then ?"Short Circuit"
if 1=1 or 1/0 then ?"Short Circuit"

如果vba像其他语言一样操作,那么您将收到Short Circuit消息。相反,你得到错误:
enter image description here

当然,我会将你推荐给Mat's Muganswer,因为在内存中读取一个范围比直接读取一张图片要快得多。

我会将您的answer转介给另一个关于如何读取/写入数组和单元格的问题