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

use*_*250 8 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

问题:

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

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

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

jti*_*ley 13

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

  • + 1我同意.差异几乎可以忽略不计.因为第2点,我甚至更喜欢"Select Case" (3认同)
  • 运行一个循环1,000,000次,其中有`i Mod 3`作为选择:`if elseif`比`case`语句运行整整3秒.这不是一个优化的好地方 - 为了便于阅读 (3认同)

Baz*_*nga 4

对于一些项目来说,这并不重要。对于较大的阵列,请使用 switch。 更多技术细节请参见此处。

  • 理想情况下,这应该是一条评论:) (2认同)
  • @DougGlancy:您使用的是哪个 Excel 版本?我在 VBA Excel 2010 中有 Switch 函数。尽管我发现 Switch 函数比 Select Case 更复杂。所有这些版本的 Excel 2000/XP/2003/2007/2010 都有它。 (2认同)
  • @SiddharthRout 我每天都会学到一些新东西!今天我学会了在断言之前先检查一下……我希望如此。我认为 switch 只是一个 Access SQL 的东西,就 Office 而言。谢谢。 (2认同)
  • swith 用于替换多个 If 语句,但仅适用于单值答案,而 select case 可以在每个答案中执行代码。另一个选项是“选择”,它不适合这个问题,但仍然很高兴知道。 (2认同)