【问题标题】:Which is optimum to use: nested if statements or single if statement with multiple 'AND' conditions in VBA? [duplicate]哪个最适合使用:嵌套 if 语句或 VBA 中具有多个“AND”条件的单个 if 语句? [复制]
【发布时间】:2014-10-13 08:58:52
【问题描述】:

我正在用 VBA 为 MS Excel 编写一个宏。在子例程中,我有一组要执行的特定任务要满足的条件。从运行时间和内存的角度来看,以下哪种方法是最佳的?

方法一:

If condition_1 then
  If condition_2 then
     If condition_3 then
       ....
     End If
  End If
End If

方法二:

If condition_1 And condition_2 And ..... then
  ....
End If

如果我有任何条件的 Else 语句,我必须采用方法 1 来实现它。但是我没有针对任何条件的 Else 语句,因此这两种方法在完成任务方面处于同等水平。我只是想知道在运行时和内存方面哪个更好?

【问题讨论】:

  • 第一个更好。 VBA 不支持短路。 (although a Select Case may sometimes speed things up)
  • @vba4all 感谢您的帮助。即使我在代码中将条件明确定义为boolean 变量,它不会短路吗?
  • VBA 中没有短路 :)
  • @Sathish 无关紧要 - 它总是会检查每个表达式。所以方法 1 绝对是更好的解决方案,同样关于空检查等。
  • 使用 and 方法,vba 会评估每个条件,因此速度较慢,但​​通常您甚至不会看到任何差异(取决于条件)。另外,考虑方法 Select Case...

标签: vba excel if-statement


【解决方案1】:

即使您没有Else 声明,您的第一种方法仍然是更好的方法。

后者将评估每个condition_X,而第一个将在其中一个条件失败时跳过进一步检查。

你可以自己测试一下

Sub Main()
    If Check1 And Check2 Then
    End If
End Sub

Function Check1()
    Debug.Print "exec Check1"
    Check1 = False
End Function

Function Check2()
    Debug.Print "exec Check2"
    Check2 = True
End Function

您应该看到,即使 Check1 返回 false,Check2 正在被评估......这证明了这一点。

【讨论】:

  • 谢谢。这解决了我的问题。但是,一旦条件之一是False,第二种方法是否也会退出?我假设在第二种方法中,程序内部遵循方法1。是真的吗?
  • 那是错误的。它的工作方式类似于 IIF() 评估每个条件。
  • 除此之外,在方法 1 中,您应该首先使用最高失败率,以尽量减少正在评估的以下条件。在通过Year()Month()Day() 比较三年日期中的随机日期的抽象情况下,您应该首先检查Day(),因为评估次要条件的机会只有约 30 分之一。那么对于Month(),只有 12 分之一的机会评估最终条件(Year() 1 in 3),而这三个条件都可能匹配。
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2014-08-13
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
相关资源
最近更新 更多