Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5687 / 13645 ツリー ←次へ | 前へ→

【49454】If と Select の使い分けについて 多摩川 07/6/5(火) 15:54 質問[未読]
【49460】Re:If と Select の使い分けについて Kein 07/6/5(火) 18:35 発言[未読]
【49475】Re:If と Select の使い分けについて 多摩川 07/6/6(水) 8:11 お礼[未読]

【49454】If と Select の使い分けについて
質問  多摩川  - 07/6/5(火) 15:54 -

引用なし
パスワード
   皆さま,こんにちは。

1つの変数(「n」とします)が条件によって
n = 1 になったり,
n = 2 になったりするとします。
この n の値によって呼び出すプロシージャが異なるとします。
この場合,

If n = 1 Then
  Call aaa
ElseIf n = 2 Then
  Call bbb
End If

だったり,

Select Case n
  Case 1
   Call aaa
  Case 2
   Call bbb
End Select

とも表すことができると思います。
今,実際に作成中のマクロは,Call ステートメントだけではなく,前後にも色々書かれた長文です。
できるだけ少ない行数にしたいので If の方で進めようと思ったのですが,処理速度も重要と思い,以下のようなテスト行いました。

Sub test1()
  Dim st() As Double
  Dim i As Long
  Dim n As Long
  Dim j As Long
  Dim m As Long
  n = 1
  m = 1

  With ThisWorkbook.Sheets(1)
    .Cells(1, 1).Value = "Ifの場合"
    .Cells(1, 2).Value = "Selectの場合"

    For j = 1 To 10

      ReDim Preserve st(m): st(m) = Timer
      If n = 1 Then
        For i = 1 To 10000
          .Cells(1 + j, 1).Value = _
          .Cells(1 + j, 1).Value + i
        Next i
      End If
      .Cells(1 + j, 1) = Timer - st(m)
      m = m + 1

      ReDim Preserve st(m): st(m) = Timer
      Select Case n
        Case 1
          For i = 1 To 10000
            .Cells(1 + j, 2).Value = _
            .Cells(1 + j, 2).Value + i
          Next i
      End Select
      .Cells(1 + j, 2) = Timer - st(m)
      m = m + 1

    Next j
  End With
End Sub

結果的には If の方が処理時間も短く,少ない行数で収まるため,今回は If を使おうと判断したのですが,どちらを使用する方が適切なのでしょうか?
今回の疑問に関わらず,マクロを作成するうえで処理速度優先の考え方で良いのでしょうか?


長々と失礼しました。
変な質問ですが,どなたかアドバイスをいただけないでしょうか?
よろしくお願いいたします。

【49460】Re:If と Select の使い分けについて
発言  Kein  - 07/6/5(火) 18:35 -

引用なし
パスワード
   結論から言うと、If構文もSelect Case構文も "場面に応じて適切に使い分ける"
ということにしかなりません。例えばよく出てくる「何々の判定は真か偽か」なら
問題なくIF構文になりますね。しかも =True を省略することすらできるので

If IsEmpty(Range("A1").Value) Then

などと短く出来ます。分かりにくいかどうかは"慣れ"の問題でしょう。
他方、Select Case の方が適切、と思われるのは

Dim Ret As String

Select Case Range("A1").Value
  Case Is > 0: Ret = "1以上100以下"
  Case Is > 100: Ret = "101以上1000以下"
  Case Is > 1000: Ret = "1001以上10000以下"
  Case Is > 10000: Ret = "10001以上"
End Select

のように、多くの条件判定をしなければならない場面です。
これをIF〜ElseIf〜ElseIf・・と繋げて書くのは、出来ないわけではないけど
回答者のサンプルコードで見かけるケースは少ないです。ベテランは使わない
ということです。

>マクロを作成するうえで処理速度優先の考え方で良いのでしょうか?
仕事で使うことを前提にするなら、優先順位の一番目は「安定性」です。
これは誰も異存がないと思います。次に速度と可読性が、同じ程度に考慮
されるべきだと思います。
他の板で以前、"コンマ何秒速くなった"と言って鬼の首をとったように自慢
している人もいましたが、マニアの陥りやすい症状だと思いました。
ちなみに、膨大な計算処理などを高速にやりたい場合、VB系言語は全く不利です。
浮動小数点演算で、CやOBJECT-PASCAL(Delphi)の倍以上の時間がかかるそうです。

【49475】Re:If と Select の使い分けについて
お礼  多摩川  - 07/6/6(水) 8:11 -

引用なし
パスワード
   ▼Kein さん:
おはようございます。
詳しく説明していただき,ありがとうございました。
大変参考になりました。
速度優先の症状に陥るところでした。
仰るとおり,「安定性」これに尽きますね!

使い分けについては,今後もこちらのサイトで Kein さんも含め,常連の回答者さん達の例を数多く拝見させていただいてものにしていきたいと思います。

5687 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free