【问题标题】:IF-statement or something more efficient?IF 语句或更有效的方法?
【发布时间】:2015-04-17 14:03:38
【问题描述】:

我有 3 个不同的变量,所有 3 个变量都可以有 2 个不同的值。每个组合都需要做其他事情。我可以将其全部放入 IF 语句中,但我想知道是否没有更优雅/更合适/更短的解决方案。这 3 个变量的值可以是 1 或 0(类似于二进制真值表)。

【问题讨论】:

  • 嵌套 if 语句是处理此决策树的最有效方式。
  • 到目前为止你测试了什么?
  • 好吧,我还没有测试过这个。我知道如何用 If 语句编写代码。我只是想知道是否有更好的解决方案。谢谢大家的快速反应。我将继续使用 if 语句 :o)
  • 如果您想知道您当前的解决方案是否是一个好的解决方案,您可以将功能齐全的真实代码提交给 Code Review。不过,请在发帖前花点时间阅读一下on topic 的内容。

标签: excel vba if-statement


【解决方案1】:

虽然严格来说它并不比二进制分支更高效(除非您可以预测参数的频率),但一种替代方法是使用 VBA 语法的特殊性并将其放入 Select Case 结构中:

Private Sub Example(one As Boolean, two As Boolean, three As Boolean)

    Select Case True
        Case one And Not two And Not three
            Debug.Print "Case 1"
        Case one And Not two And three
            Debug.Print "Case 2"
        Case one And two And Not three
            Debug.Print "Case 3"
        Case one And two And three
            Debug.Print "Case 4"
        Case two And Not three
            Debug.Print "Case 5"
        Case two And three
            Debug.Print "Case 6"
        Case three
            Debug.Print "Case 7"
        Case Else
            Debug.Print "Case 8"
    End Select

End Sub

它肯定比 If 替代方案更容易查看:

Private Sub Example2(one As Boolean, two As Boolean, three As Boolean)

    If one Then
        If two Then
            If three Then
                Debug.Print "Case 4"
            Else
                Debug.Print "Case 3"
            End If
        Else
            If three Then
                Debug.Print "Case 2"
            Else
                Debug.Print "Case 1"
            End If
        End If
    Else
        If two Then
            If three Then
                Debug.Print "Case 6"
            Else
                Debug.Print "Case 5"
            End If
        Else
            If three Then
                Debug.Print "Case 7"
            Else
                Debug.Print "Case 8"
            End If
        End If
    End If

End Sub

当我针对最坏的情况(单独运行,清除每次运行之间的即时窗口)进行基准测试时,性能差异仅为 20 毫秒(超过 100 万次迭代)。绝大多数性能提升将来自确定您评估变量的顺序 - 即哪些分支更有可能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2018-04-03
    • 2014-07-17
    • 2012-01-31
    • 2011-12-01
    • 2015-11-16
    • 2021-07-20
    相关资源
    最近更新 更多