VBA

find関数とvlookupはどちらが早いか

記事内に商品プロモーションを含む場合があります

このページでわかること

find関数とworksheetfunctionのvlookup関数の
どちらの処理速度が早いか

マクロの処理速度の測り方

結論
vlookupの圧勝です笑
でもfind関数を使わないといけない場面もあります。

覚えること

  1. マクロの処理速度の測り方
  2. find関数の使い方
  3. worksheetfunctionの使い方
  4. vlookup関数の使い方

こんにちはhokkyokunです。

表やデータベースから値を取り出すのに
find関数を愛用しているのですが、
vlookupでも全然できるよなって思い、

じゃあどっちが早いか確かめてみようと思いました。

マクロの処理速度の測り方

マクロの処理速度を計るには
time関数を使います

構文:time

引数無しです。戻り値は現在の時間です。

time関数を使って
処理の開始時間と終了時間を取得し、
その差を処理時間として計算します。

下記にお試しのプログラムをご紹介します。
ひたすら無駄な作業をさせられるマクロちゃん・・

Sub 速度計測()
Dim startTime, endTime As Date
Dim i, j As Long

'処理開始時間
startTime = Time

'6万回ひたすら〇を入力させます。
For i = 1 To 60000
    ActiveSheet.Cells(i, "D").Value = "○"
Next i

'6万回ひたすら入力した文字を消させます。
For i = 1 To 60000
    ActiveSheet.Cells(i, "D").Value = ""
Next i

'処理終了時間
endTime = Time

'処理の開始時間、終了時間
'(処理の終了時間)-(処理の開始時間)=処理時間
Debug.Print startTime
Debug.Print endTime
Debug.Print Format(endTime - startTime, "hh:nn:ss")
End Sub

処理速度計測は
何か面白いアイデア浮かんだら単独で記事書きます

WorksheetFunctionを利用したvlookup関数のマクロ

超重要機能、WorksheetFunctionです。
普段使っているエクセルの関数をVBA上で使うことができます。

僕はMax関数を使って特定の範囲の最大値をよく取得してます。

構文:WorksheetFunction.関数名(引数)

VBAがわかる形で書かないとダメです。

例えば
エクセルシート上で関数を書くとき
VLOOKUP(A2,設定リスト!A:B,2,FALSE)
みたいに書きますが、これでは読み取れません

vlookup(cells(2,1),worksheets(“設定リスト”).columns(“A:B”),2,0)
と書きます。
A2や設定リストやFALSEはオブジェクト(範囲やシート名)やBloolean形と認識してくれないのです。

この辺りはちょっとややこしいかもしれませんが、
範囲などは普段マクロで書いている方法で指定しましょう。

この辺り、別で記事作成します。
いかに今回のプログラムご紹介します。

Sub vlookup速度()
Dim startTime, endTime As Date '開始時間、終了時間
Dim table As ListObject '参照する表をテーブル化
Set table = ThisWorkbook.Worksheets("設定リスト").ListObjects(1)

'測定開始
startTime = Time

Dim Val As String 'vlookupで取得した値の代入先
Dim i, j As Long

'6万回表から値を取得し、転記する×10セット・・・
For j = 1 To 10
    For i = 2 To 60001
        Val = Application.WorksheetFunction.VLookup(Cells(i, 1), table.DataBodyRange, 2, 0)
        ThisWorkbook.Worksheets("表").Cells(i, "B").Value = Val
    Next i
    
    '6万回転記した値を消す
    For i = 2 To 60001
        ThisWorkbook.Worksheets("表").Cells(i, "B").Value = ""
    Next i
Next j

'終了時間
endTime = Time

'結果をメッセージボックスで表示
MsgBox ("開始:" & startTime & vbCrLf & _
        "終了:" & endTime & vbCrLf & _
        "処理時間:" & Format(endTime - startTime, "hh:nn:ss"))
End Sub

コメントで説明は入れてますが、
流れとしては
シート1に「表」、シート2に「設定リスト」を用意し、
「設定リスト」からvlookupで値を取得し、「表」に転記します。

6万回表から値を取得、転記、それをまた消す
という作業を10セットさせます

なんでこんな遅いんだ笑
外出先でやったからかな?
まあこんな感じでした。

find関数を使ったマクロ

find関数も重要な関数です。
特定の範囲から一致する範囲を取得できます。
値以外にも背景の色とかでも取得できるので
データからお目当てのものをとってくるのに、頼れる相棒です。

ここでは書ききれないくらい色々機能もありますし、
大事な関数なので、別記事でご紹介します。

簡単にお話しすると

構文:検索する範囲のオブジェクト.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

戻り値は範囲です。
引数盛沢山ですが、
大事なのはwhatとLookAt
他は指定しなくても何とかなります。

what:省略できません。何を検索するかを指定します。
LookAt:完全一致か不完全一致か、検索するときは完全一致がいいと思います。

プログラムはこんな感じです。
基本的な構造は上記のVlookup速度計測と変わりません。

Sub find関数速度()
Dim startTime, endTime As Date '開始時間、終了時間
Dim table As ListObject '参照する表をテーブル化
Set table = ThisWorkbook.Worksheets("設定リスト").ListObjects(1)

'測定開始
startTime = Time

Dim Val As String 'vlookupで取得した値の代入先
Dim i, j As Long
Dim srcRng As Range '検索範囲
Dim fndRng As Range '検索範囲から取得する範囲
Set srcRng = table.ListColumns("果物").DataBodyRange

'6万回表から値を取得し、転記する×10セット・・・
For j = 1 To 10
    For i = 2 To 60001
    
        'Find関数を使ってwhat部分の値と完全一致の範囲を取得する
        Set fndRng = srcRng.Find(what:=ThisWorkbook.Worksheets("表").Cells(i, "A").Value, lookat:=xlWhole)
        
        'Find関数で取得した値の一つ右のセルの値を代入
        Val = fndRng.Offset(, 1).Value
        ThisWorkbook.Worksheets("表").Cells(i, "B").Value = Val
    Next i
    
    '6万回転記した値を消す
    For i = 2 To 60001
        ThisWorkbook.Worksheets("表").Cells(i, "B").Value = ""
    Next i
Next j

'終了時間
endTime = Time

'結果をメッセージボックスで表示
MsgBox ("開始:" & startTime & vbCrLf & _
        "終了:" & endTime & vbCrLf & _
        "処理時間:" & Format(endTime - startTime, "hh:nn:ss"))
End Sub

何かがおかしい笑

こんなに遅くはならないと思いますが、なんでだ・・

ともかく、処理としてはworksheetfunction圧勝です。

まとめ

単純に表から値をとってくるにはWorksheetFunctionを使うのがいいと思います。
コード数も少なくなるし、なじみのある関数を使う方が安心ですし。

それでもFind関数の優秀さは信じて疑いません!

Find関数は値以外にも数式やコメントでも検索できます。
また、背景色や文字列の半角全角、大文字小文字、検索の方向も変えられます。

大事なのはいろいろな方法を知っていること。
そして状況によって適切な方法を選べることだと思います。

ではでは