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. case ステートメントの方が読みやすいので、私は case ステートメントに傾倒しています。(読みにくい => 読みやすい)
  3. これが使用している正確なデータである場合は、「_」で値を分割し、最後の桁を「mod」可能な最大値にインクリメントできます。文字列を結合して結果を取得します。
于 2012-07-24T22:58:27.917 に答える
4

ほんの数項目の場合は問題ありません。より大きな配列の場合は、スイッチを使用してください。 技術的な詳細については、こちらをご覧ください。

于 2012-07-24T22:53:50.133 に答える
0

少し遅すぎますが、特定の例では、オプションを数値として保存し、必要に応じてインクリメントするのが最速です。"option_"0;;;セルのカスタム数値形式は、数値が option_# として表示されるように変更できます。

ほとんどの場合Select Case、少しだけ遅くなり、If Else ステートメントと非常によく似たものにコンパイルされると思います。

2 つの例では、実行することがわずかに異なるため、これは当てはまりません。最初の例では、各 If ステートメントはシート "sheet1" を検索し、Range "A1" の値を取得しますが、このSelect Case例では、その値を最初に 1 回だけ取得してから、その値を比較します。これによりSelect Case、セルの値が「option_1」でない場合、例が数倍速くなるはずです。

于 2016-10-25T16:25:21.217 に答える