VBA技術解説
IfステートメントとIIF関数とMax関数の速度比較

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2019-06-23 最終更新日:2019-07-09

IfステートメントとIIF関数とMax関数の速度比較


マクロVBA 速度比較

マクロVBAの実行速度比較はとても良く読まれている人気記事となっていますが、
そのほとんどは配列やDictionaryを使った少し高度なVBAでの比較が多くなっています。


今回は極めて基本的な、大小比較して大きい方を返すという処理において、
Ifステートメント、VBA関数のIIF関数、シート関数のMax関数
これらの処理速度を比較検証してみます。

どのような順位になるかは、VBAをある程度経験している人なら想像できると思います。
しかし実際にどれくらいの速度差があるかは良くわからないものです。
このような基本的かつ処理時間の短い処理の速度は気にしない事が多いと思います。
そこで、改めて実測し確認しておこうというという事です。

IfとIIFとMaxの比較マクロVBAコード

Option Explicit

Sub TestRun()
  Dim i As Long
  Dim ary(1 To 5, 1 To 9) As Double
  For i = 1 To 5
    'a>b
    DoEvents
    ary(i, 1) = func_if(1, 2)
    DoEvents
    ary(i, 4) = func_iif(1, 2)
    DoEvents
    ary(i, 7) = func_max(1, 2)
    'a<b
    DoEvents
    ary(i, 2) = func_if(2, 1)
    DoEvents
    ary(i, 5) = func_iif(2, 1)
    DoEvents
    ary(i, 8) = func_max(2, 1)
    'a=b
    DoEvents
    ary(i, 3) = func_if(1, 1)
    DoEvents
    ary(i, 6) = func_iif(1, 1)
    DoEvents
    ary(i, 9) = func_max(1, 1)
  Next
  Range("B3:J7") = ary
  MsgBox "完了"
End Sub

Function func_if(ByVal a As Long, ByVal b As Long) As Double
  Dim c As Long
  Dim i As Long
  Dim t As Double
  t = Timer
  
  For i = 1 To 10000000
    If a > b Then
      c = a
    Else
      c = b
    End If
  Next
  
  func_if = Timer - t
End Function

Function func_iif(ByVal a As Long, ByVal b As Long) As Double
  Dim c As Long
  Dim i As Long
  Dim t As Double
  t = Timer
  
  For i = 1 To 10000000
    c = IIf(a > b, a, b)
  Next
  
  func_iif = Timer - t
End Function

Function func_max(ByVal a As Long, ByVal b As Long) As Double
  Dim c As Long
  Dim i As Long
  Dim t As Double
  t = Timer
  
  For i = 1 To 10000000
    c = WorksheetFunction.Max(a, b)
  Next
  
  func_max = Timer - t
End Function

マクロVBAコードの解説は必要ないと思います。

念の為、大小比較の3パターン(a>b , a<b , a=b)で実行しています。
1,000万回の実行となっています。
PCで各種実行中のサービス等頭の影響を考えて、5回実行しています。
最初は1億回くらいでやろうとしたら、さすがに時間がかかかりすぎてしまいました(笑)。

結果は順次配列に入れておいて、最後にシートに出力しています。

IfとIIFとMaxの実行速度の実測値

Ifステートメント IIF関数 Max関数
a>b a<b a=b a>b a<b a=b a>b a<b a=b
1回目 0.13 0.17 0.12 0.95 0.95 1.18 31.13 31.66 31.90
2回目 0.17 0.11 0.22 1.21 0.98 1.19 32.29 32.41 32.34
3回目 0.11 0.20 0.16 0.97 1.05 1.22 32.29 32.52 31.89
4回目 0.11 0.17 0.11 1.00 1.16 0.97 31.99 32.56 31.98
5回目 0.11 0.11 0.20 0.96 0.95 1.23 33.32 32.16 32.06
平均 0.13 0.15 0.16 1.02 1.02 1.16 32.20 32.26 32.03
全平均 0.15 1.06 32.17
※数値は秒数です。

順位は予想通りだと思います。
筆者としては、意外にIIF関数が速いという印象でした。
単純な処理の割には実測値にかなりバラツキが出ていますが10%程度は誤差としてとらえてください。

VBAにはMAx関数が無いので、比較としてWorksheetFunction.Maxを使いましたが、
さすがにこれが遅いのは仕方ないところです。
ただし遅いと言っても1,000万回での話です。
数万回程度では体感速度が変わることは無いでしょう。
10万行程度のデータで1行につき複数回の比較が必要な場合は、やはり遅くなってしまうので使用は避け他方が良いでしょう。
WorksheetFunctionをWithに指定したりオブジェクト変数にSetして使う事で、若干は早くすることができますが、
上記と同じ処理では25秒くらいまでしか速くなりません。

今回は、大小比較して大きい方を返すという処理でしたが、
変数aに既に値が入っていて、変数bと比較して大きい方を変数aに入れるという処理の場合であれば、
Ifステートメントでは、a>bの場合は代入を実行しなくて良いので、さらに平均時間の差は開きます。

最後に

IfステートメントではマクロVBAコードが5行必要となり、
いかにも長く無駄な感じを受けてしまうかもしれませんが、しかしこれは必要な記述です。
1行で記述する書き方として、
If a > b Then c = a Else c = b
このような記述もできますが、あまりお勧めしません。
デバッグもいずらいですし、何より保守性が悪くなってしまいます。
しかし、
単なる大小比較でさえ色々な書き方があるという事は覚えておいた方が良いでしょう。
今回の検証では処理速度としてかなり差が出ましたが、
大量に繰り返す必要が無く速度を気にする必要がない場合も多いものです。
IIF関数やMax関数はVBAコードがすっきりして読みやすくなる効果があります。



同じテーマ「マクロVBA技術解説」の記事

エクセルVBAのパフォーマンス・処理速度に関するレポート
VBAのFindメソッドの使い方には注意が必要です
マクロVBAの高速化・速度対策の具体的手順と検証
動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
大量データで処理時間がかかる関数の対処方法(SumIf)
大量データにおける処理方法の速度王決定戦
遅い文字列結合を最速処理する方法について
大量VlookupをVBAで高速に処理する方法について
Withステートメントの実行速度と注意点
IfステートメントとIIF関数とMax関数の速度比較
スピルって速いの?スピルの速度について


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ