哪种方式更快? 如果elseif或select大小写

对于下面的代码,

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)不pipe效率如何,在这种情况下我应该使用哪种方法,以便更好的编码。

3)从数组中循环的任何其他“简单”的方法?

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

只有几个项目,没关系。 对于较大的arrays,请使用开关。 更多的技术细节在这里。

正如Bazinga所说,只有less数项目没有关系。 无论如何,你应该在这种情况下添加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 

这应该更快,更可读。

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

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

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