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のパフォーマンス・処理速度に関するレポート

ExcelのマクロVBAは遅い・重いと良く言われることが多いようですが、マクロVBAが遅い・重いのではなく、その書かれたVBAコードが遅いのです。正しい高速化・速度対策をしたコードなら、それほど遅くはありません。むしろ、巨大なスプレッドシートを扱っている事を考えれば、驚異的なパフォーマンスとも言えるのです。
VBAのFindメソッドの使い方には注意が必要です
・1.処理速度が遅い ・2.指定オプションがシート操作とリンクしている ・「値」で検索した場合は、表示形式に依存した検索になる ・最後に
マクロVBAの高速化・速度対策の具体的手順と検証
マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。特に、以下はぜひお読みください。
動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
動的配列を使い様々な処理をした後にシートへ出力しようとしたとき、縦横が違っている為そのまま出力できません、そもそも、動的配列の要素数をRedimで変更できるのは、最下位の次元のみになります。2次元配列の場合、ReDimmyArray(2,10) ReDimmyArray(2,11) これはOKですが、
大量データで処理時間がかかる関数の対処方法(SumIf)
・大量データで処理時間がかかるサンプルデータ ・普通にマクロVBAコ-ドを書いた場合 ・指定範囲を絞ってみる ・配列を使って書いてみる ・アルゴリズムを考えてみる ・Dictionary(連想配列)を使う ・大量データで処理時間がかかる関数の対処方法の最後に
大量データにおける処理方法の速度王決定戦
VBAで自動化したが、大量データ処理に時間がかかってしまう… そんな悩みが非常に多いようです、そこで、各種処理方法の速度比較を行い、どの処理方法が最も速いかを検証します。つまり、処理方法の速度王決定戦です。検証する題材としては、最も一般的な集計で行います。
遅い文字列結合を最速処理する方法について
VBAは遅い… よく聞くことですが、確かに普通にコード記述しているととても遅いことがあります、その代表の一つに、文字列結合があります、文字列結合を最速処理する方法について解説します。そもそも文字列結合は、なぜ遅いのか、String型(可変長文字列)についての基礎知識が必要です。
大量VlookupをVBAで高速に処理する方法について
大量データ同士のVlookup処理は、非常に時間のかかる処理となります、マクロVBAで、これを高速に処理する方法について、VBAコードを示し解説します。ワークシート上の関数の場合 シートに関数を入れる場合は、以下を参照してください。【奥義】大量データでの高速VLOOKUP 以下の表で検証します。
Withステートメントの実行速度と注意点
・マクロVBAのテストコード(Worksheet) ・マクロVBAのテストコード(Range) ・Withステートメントの注意点 ・最後に
IfステートメントとIIF関数とMax関数の速度比較
スピルって速いの?スピルの速度について
・速度検証に使う関数 ・速度検証に使うシート ・スピルの速度を検証するVBAコード ・スピルの速度を検証した結果 ・スピルの速度の最後に


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

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
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)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


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


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