Excelスキルアップコレクション
           〜 Something U Want 〜


Google  

WWW を検索
Excelスキルアップコレクション内 を検索
 @     Top  >     Excel VBA スキルアップコレクション Topics  >     (06) VBAでExcel関数を使用した方が高速処理できる場合がある

 
(06) VBAでExcel関数を使用した方が高速処理できる場合がある

 A列にランダムな数字が大量に並んでいて、この中から最大値を調べる必要があるとします。

 どのようなプログラムが高速でしょうか?

 次の2つのプログラムを作成しパフォーマンス比較します。
[ プログラム1 ]

 1行目:  Public Sub Sample_GetMaxValue_01()
 2行目:  
 3行目:      Dim lp As Long
 4行目:      Dim maxV As Double
 5行目:      
 6行目:      ' セル"A1"の値を最大値の初期値とする。
 7行目:      maxV = Range("A1").Value
 8行目:      
 9行目:      ' 2行目〜65536行目までA列のセルを参照する。
10行目:      For lp = 1 To 65536
11行目:          With Range("A1").Offset(lp - 1, 0)
12行目:              ' 最大値が見つかるたびに随時maxVを更新する。
13行目:              If maxV < .Value Then
14行目:                  maxV = .Value
15行目:              End If
16行目:          End With
17行目:      Next
18行目:  
19行目:      ' 見つかった最大値をメッセージボックスで表示する。
20行目:      MsgBox maxV
21行目:  
22行目:  End Sub
[ プログラム2 ]

 1行目:  Public Sub Sample_GetMaxValue_02()
 2行目:  
 3行目:      Dim lp As Long
 4行目:      Dim maxV As Double
 5行目:      
 6行目:      ' A列から最大値を探す。
 7行目:      maxV = Application.Max(Range("A:A"))
 8行目:  
 9行目:      ' 見つかった最大値をメッセージボックスで表示する。
10行目:      MsgBox maxV
11行目:  
12行目:  End Sub
簡単にプログラムについて説明します。
[ プログラム1 ]は、仕様を満たす最もスタンダードなプログラムです。
[ プログラム2 ]VBAからExcelの関数を利用する例です。Excelの関数とは、次のようにExcelのセルにて呼び出すことができる関数のことを言っています。VBAからExcelのMAX() 関数を利用するには、先頭に「Application.」を付与するだけです。
以下がプログラム実行結果です。[ プログラム1 ][ プログラム2 ]も同じ結果になります。
実行計測結果を以下に示します。
プログラム測定結果[秒]
14
21以下

 [ プログラム1 ][ プログラム2 ]の大きな違いは処理時間です。[ プログラム1 ]は4秒程度かかりますが、[ プログラム2 ]は1秒以内で結果が得られます。[ プログラム1 ]ではループ処理にてA列に存在する1行目〜65536行目の全セルを参照する必要がある為、時間を要するプログラムになっています。[ プログラム2 ]は、A列全体を参照していることに違いはありませんが、ループ処理が不要なので、[ プログラム1 ]に比べて高速に結果を得ることができます。

 結果が示す通り、VBAからExcel関数を利用することで、期待以上のパフォーマンス向上を得られる場合があります。実行環境により測定結果には違いが生まれますが、これら2つのプログラムの速度比率はほぼ同程度なものが得られるでしょう。

 VBAからExcel関数を利用する場合、Excel関数の引数は何もRangeオブジェクトである必要はありません。VBAで使う配列変数でも機能します。

 1行目:  Public Sub Sample_GetMaxValue_03()
 2行目:  
 3行目:      Dim lp As Long
 4行目:      Dim maxV As Long
 5行目:      
 6行目:      ' 配列変数を用意する。
 7行目:      Dim arr(5) As Long
 8行目:      arr(0) = 2
 9行目:      arr(1) = 10
10行目:      arr(2) = 14
11行目:      arr(3) = -8
12行目:      arr(4) = 0
13行目:      arr(5) = 3
14行目:  
15行目:      ' 配列変数の中から、最大値を探す。
16行目:      maxV = Application.Max(arr)
17行目:  
18行目:      ' 見つかった最大値をメッセージボックスで表示する。
19行目:      MsgBox maxV
20行目:  
21行目:  End Sub
ページの先頭へ