非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

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 ワークシート関数利用

スポンサーリンク

 - Excel, VBA