ExcelVBAでFindメソッドを使って超高速検索方法
2021/12/02
以前、Excelのシート内検索を高速化させるために関数との組み合わせについて書きました。これが一番速いと思っていたのですが関数との組み合わせという点がちょっと引っかかっていました。
ところが100%VBAで同じくらい高速検索ができることがわかり今回紹介します。
使ったデータは郵便局サイトの郵便番号ダウンロードページから全国データをもらって使いました。124,500行もの大量データなのでこのようなテストをするときに最適です。
ソースコード
ソースコードはこちらです。2行目のFind
メソッドを使った行が高速検索のコードになります。C列の郵便番号から7320009を検索します。詳細の解説は後述します。
Dim c As Range Set c = Range("C:C").Find(What:="7320009", LookAt:=xlWhole) If Not c Is Nothing Then MsgBox c(1, 5) & c(1, 6) & c(1, 7) MsgBox c.Offset(0, 4) & c.Offset(0, 5) & c.Offset(0, 6) c.EntireRow.Select Else MsgBox "見つかりません" End If
実行結果
上記を実行すると、まず以下のようなメッセージボクスが2回現れます。郵便番号7320009の住所ですね。ちゃんと検索されたことが確認できるかと思います。なぜ2回メッセージボックスを出したかと言うと2通りのやり方があるからです。
最後にその箇所を選択するようにもしました。
解説
それでは解説です。
まずFindメソッドを使った検索は以下のとおりです。What
で検索キーワードを指定し、LookAt=xlWhole
で完全一致を示しています。ちなみに部分一致で検索したい場合はxlPart
を指定します。
Set c = Range("C:C").Find(What:="7320009", LookAt:=xlWhole)
この行で検索ヒットしかたどうかを判別します。
If Not c Is Nothing Then
次にメッセージボックスですが、以下の1行目はC列を1列目としてカウントするのでG,H,I列を連結した文字列を表示させます。2行目のOffset
はC列を0としているので同じくG,H,I列を連結した文字列となります。どちらか好きな方を使えばよろしいかと。
MsgBox c(1, 5) & c(1, 6) & c(1, 7) MsgBox c.Offset(0, 4) & c.Offset(0, 5) & c.Offset(0, 6)
最後に行を選択状態にする方法は以下の通りです。EntireRow
は行全体を示します。ちなみにc.EntireRow.Delete
とやると行ごと削除されます。
c.EntireRow.Select
ExcelVBAで検索速度勝負!Findメソッド vs ワークシート関数利用
スポンサーリンク