哪种方式更快? 如果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)从数组中循环的任何其他“简单”的方法?
- Case声明应该尽可能减less处理器尝试改变命令位置的次数。 这样做会导致浪费时钟周期,直到引用正确的命令为止。 除非你正在写一些需要极其优化的东西,否则你不会注意到其中的差别。
- 我倾向于个案陈述,因为他们更容易阅读。 (less阅读=>更易于阅读)
- 如果这是您正在使用的确切数据,您可以将值分割为“_”,并将最后一个数字“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”时快几倍。
- 复制单元格下的单元格与常量值(见截图) – excel
- 将excel数据导入访问
- VBA根据其dynamic第一行值隐藏和取消隐藏列
- Access / Excel VBA – 删除显示警报和消息
- 如何使用Excel VBA函数获取一系列单元格来单独计算而不是全部显示相同的值?
- 如何将SQL表格数据导出到Excel工作表?
- VBA for Excelmacros在Windows 10下不再正常工作
- 格式化包含HTML以导入到Excel的CSV文件
- Excel 2013:我需要Sheet1 Col D = Sheet2 Col D如果Sheet1 Col B = Sheet 2 Col A,否则Sheet1 Col D是昨天的date