哪种方式更快?如果是elseif或select case

时间:2012-07-24 22:49:27

标签: excel vba excel-vba

对于以下代码,

If Sheets("sheet1").Range("A1").Value = "option_1" Then
    Sheets("sheet1").Range("A1").Value = "option_2"
ElseIf Sheets("sheet1").Range("A1").Value = "option_2" Then
    Sheets("sheet1").Range("A1").Value = "option_3"
ElseIf Sheets("sheet1").Range("A1").Value = "option_3" Then
    Sheets("sheet1").Range("A1").Value = "option_4"
...
End IF

Select Case Sheets("sheet1").Range("A1").Value
    Case Is = "option_1"
        Sheets("sheet1").Range("A1").Value = "option_2"
    Case Is = "option_2"
        Sheets("sheet1").Range("A1").Value = "option_3"
    Case Is = "option_3"
        Sheets("sheet1").Range("A1").Value = "option_4"
    ...
End Select

问题:

1)我想知道哪种方式会更快。如果可能的话,技术细节可以解释一下吗?

2)无论效率如何,在这种情况下我应该使用哪种方法,以获得更好的编码。

3)从数组中圈出值的任何其他“简单”方法?

6 个答案:

答案 0 :(得分:12)

  1. Case语句应该最小化处理器尝试更改其命令位置的次数。这样做会导致浪费时钟周期,直到引用正确的命令。除非你正在写一些需要极其优化的东西,否则你不会注意到它们之间的区别。
  2. 我倾向于案例陈述,因为它们更容易阅读。 (少阅读=>更易于阅读)
  3. 如果这是您正在使用的确切数据,您可以将值拆分为“_”并将最后一个数字“mod”增加到可能的最高值。将琴弦组合在一起以获得结果。

答案 1 :(得分:4)

对于一些项目,没关系。对于较大的阵列,请使用开关。 More of the technical details here.

答案 2 :(得分:2)

正如Bazinga所说,对于一些项目来说,没关系。无论如何,你应该在这种情况下添加With ... end With语句:

With Sheets("sheet1").Range("A1")
If .Value = "option_1" Then
 .Value = "option_2"
ElseIf .Value = "option_2" Then
 .Value = "option_3"
ElseIf .Value = "option_3" Then
 .Value = "option_4"
...
End If
End With

这应该更快,更易读。

答案 3 :(得分:0)

有点太晚了,但在具体的例子中,最快的应该是将选项存储为数字,并在需要时增加它。单元格的自定义数字格式可以更改为"option_"0;;;,以显示作为选项_#的数字。

在几乎所有情况下,我都希望Select Case只是稍慢一点,并且编译成与If Else语句非常相似的东西。

在两个例子中并非如此,因为它们的确略有不同。在第一个示例中,每个If语句都将查找Sheet" sheet1"并获取Range" A1"的值,但Select Case示例在开头只获取该值一次,然后比较该值。当单元格值不是" option_1"时,这会导致Select Case示例快几倍。

答案 4 :(得分:0)

而不是必须输入所有可能性,为什么不这样做。 (假设下一个项目总是1加上最后一个项目)

Public Sub Test()
    With ThisWorkbook.Worksheets("Sheet1").Range("A1")
        .Value = "option_" & Val(Mid(.Value, InStrRev(.Value, "_") + 1)) + 1
    End With
End Sub

这是更可靠,更有效的,并且无需无限代码即可进入无限远。

答案 5 :(得分:0)

我运行了多个方案,使用简单的“ for循环”和“ mod”函数将“ IF”语句与“ Case”语句进行了比较。这些方案在检查的记录数和条件数(ifElse的数量/案例的数量)方面有所不同。下表显示了方案以及每个方案的结果。请注意,表中提到的速度是100次运行的平均值。

我们可以看到“ IF”语句和“ Case”语句在性能上几乎相似。 “ IF”语句略微胜过“ Case”语句(快5%)。

enter image description here

Excel版本:Office 365 1908版内部版本11929.20300

使用的处理器:Intel i9-9900K