10

对于以下代码,

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)从数组中圈出值的任何其他“简单”方法?

4

6 回答 6

15
  1. Case 语句应该最小化处理器尝试更改其命令位置的次数。这样做会导致它浪费时钟周期,直到引用正确的命令。除非您正在编写需要极度优化的东西,否则您不会注意到其中的差异。
  2. 我倾向于案例陈述,因为它们更容易阅读。(少读=>更容易阅读)
  3. 如果这是您使用的确切数据,您可以拆分“_”上的值并将最后一位“mod”增加为可能的最高值。将字符串重新组合在一起以获得结果。
于 2012-07-24T22:58:27.917 回答
4

For just a few items, it doesn't matter. For larger arrays, use switch. More of the technical details here.

于 2012-07-24T22:53:50.133 回答
3

正如 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

这应该更快,更具可读性。

于 2015-11-02T08:12:33.773 回答
2

我使用简单的“for loop”和“mod”函数运行了多个场景,将“IF”语句与“Case”语句进行了比较。检查的记录数和条件数(# of ifElse/# of case)不同。下表显示了场景和每个场景的结果。请注意,表中提到的速度是 100 次运行的平均值。

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

在此处输入图像描述

Excel 版本:Office 365 版本 1908 build 11929.20300

使用的处理器:英特尔 i9-9900K

于 2019-09-15T22:24:59.147 回答
0

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

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

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

于 2016-10-25T16:25:21.217 回答
0

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

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

这更可靠、更高效,并且会变得无穷无尽,而无需无穷无尽的代码行。

于 2018-01-09T04:41:22.837 回答