このページでわかること
find関数とworksheetfunctionのvlookup関数の
どちらの処理速度が早いか
マクロの処理速度の測り方
結論
vlookupの圧勝です笑
でもfind関数を使わないといけない場面もあります。
覚えること
- マクロの処理速度の測り方
- find関数の使い方
- worksheetfunctionの使い方
- 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関数は値以外にも数式やコメントでも検索できます。
また、背景色や文字列の半角全角、大文字小文字、検索の方向も変えられます。
大事なのはいろいろな方法を知っていること。
そして状況によって適切な方法を選べることだと思います。
ではでは