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

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日: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メソッドの使い方には注意が必要です
WorksheetFunction.Matchで配列を指定した場合の制限について
マクロVBAの高速化・速度対策の具体的手順と検証
動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
大量データで処理時間がかかる関数の対処方法(SumIf)
大量データにおける処理方法の速度王決定戦
遅い文字列結合を最速処理する方法について
大量VlookupをVBAで高速に処理する方法について
Withステートメントの実行速度と注意点
IfステートメントとIIF関数とMax関数の速度比較


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

文字列結合&でコンパイルエラーになる理由|VBA技術解説(9月19日)
Byte配列と文字コード関数について|VBA技術解説(8月20日)
PowerQueryの強力な機能をVBAから利用する方法|VBA技術解説(8月4日)
練習問題31(セル結合を解除して値を埋める)|VBA練習問題(7月30日)
練習問題30(マトリックス→リスト形式)|VBA練習問題(7月25日)
Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説



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

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


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




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