对于以下代码,
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)从数组中圈出值的任何其他“简单”方法?
答案 0 :(得分:12)
答案 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)