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技術解説」の記事

大量データにおける処理方法の速度王決定戦
遅い文字列結合を最速処理する方法について
大量VlookupをVBAで高速に処理する方法について
Withステートメントの実行速度と注意点
IfステートメントとIIF関数とMax関数の速度比較
スピルって速いの?スピルの速度について
1次元配列の下限インデックスを高速に変更する関数
レーベンシュタイン距離を求めるVBA(スピル対応)とセル数式
WorksheetFunction使用時のパフォーマンスへの影響について
Dirは限界!FSOは遅い!VBAファイル検索をWindows APIで爆速化
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について


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

電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
実績/予算ごとの3年間通算累計を出力|エクセル練習問題(2025-11-15)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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