1. はじめに
Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります。
その「ゆるさ」は、初心者にとっては優しさであり、
一方で実務では 再現性のない不具合 を生みやすい原因にもなります。
本記事では、VBAで頻繁に使われる Find関数の特徴と、
それを踏まえた代替検索手段について整理します。
2. Find関数の正体
Findは、VBA独自の検索関数ではありません。
Set c = Range("A:A").Find("ABC")
この処理は、Excel本体の検索機能(Ctrl+F)をそのまま呼び出しています。
つまり Find関数は、Excelの検索状態そのものを操作する命令です。
3. FindはExcel全体の検索状態を共有している
Find関数は、Ctrl+F の検索設定と完全に状態を共有しています。
これは一方向ではありません。
-
Ctrl+Fの設定 → VBAFindに影響 -
VBA
Findの引数 →Ctrl+Fの設定に影響
この相互作用が、Findを「扱いにくく感じさせる原因」です。
4. 数々の省略引数
Set c = Range("A:A").Find("ABC")
この1行は、実際には次の条件を暗黙に使用しています。
- 完全一致 / 部分一致
- 大文字 / 小文字区別
- 検索対象(値 / 数式)
- 検索方向 行 / 列
これらを記述しなかった場合、
直前のCtrl+F操作時、Find実行時の設定がそのまま反映されます。
つまり、通常の関数の引数と異なり、省略時の状態が定められていないのです。
よって、コードが同じでも結果が変わってしまいます。
5. Findのフィルター挙動について
Findは、フィルターで非表示になっている行も検索対象に含みます。
これはむしろ安全装置として働く仕様でしょう。
6. Findを安全に使うための最低条件
Findを使うなら、引数をすべて明示する必要があります。
Set c = Range("A:A").Find( _
What:="ABC", _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
MatchCase:=False _
)
これにより、
- 実行環境依存を排除
- UI操作の影響を遮断
できます。
※逆にVBAがExcelに影響してしまうことは避けられませんが
7. 代替としてのMatch関数
検索といえば Match関数 を思い浮かべる人も多いと思います。
pos = Application.Match(key, Range("A:A"), 0)
高速で強力な検索手段ですが、実務では注意が必要です。
問題点:
- 16桁数以上の数値で誤一致が起きる
- 一致しない場合はエラーを返す
IsErrorによる分岐を用いればエラーが返った場合の対応は可能です。
返るのは行数ではなく、範囲内で何番目のセルかであることに注意。
またApplication.MatchとApplication.WorkSheetFunction.Matchで
挙動が異なる点に気をつける必要があります。
8. テーブル(ListObject)を使った検索
データが表形式で管理されている場合、テーブル(ListObject)化も有効です。
テーブルの利点
- データ範囲が自動追従
- 見出し(列名)でアクセスできる
- 行番号・最終行取得を意識しなくてよい
例:特定列から値を探す
Sub Sample()
Dim lo As ListObject
Set lo = Sheet1.ListObjects("Table1")
Dim r As ListRow
For Each r In lo.ListRows
If r.Range(1, lo.ListColumns("Code").Index).Value = "ABC" Then
' 見つかった行
End If
Next r
End Sub
これは「検索」というより、構造化データへの参照に近い発想です。
- Excelの状態に影響されない
- 可読性が高い
- 保守しやすい
という実務向けの利点があります。
ただし上から順の一致確認のため、FindやMatchに比べ処理が遅くなります。
9. SQL(ADO)による検索
大量データや、検索条件が明確な場合は SQLが安定します。
SQL検索の特徴
- 完全一致が保証される
- 状態を持たない
- Excelの検索履歴とも無関係
概念例
SELECT *
FROM [Sheet1$]
WHERE Code = 'ABC'
VBAから実行すれば、
-
Findの状態問題 -
Matchの型問題 - フィルター状態
をすべて切り離した検索が可能であり、
複数の抽出条件を設定することも可能で、
大規模データを扱う場合に有効となります。
ただしVBAとは異なる、SQL独自の学習が必要です。
10. どれを選ぶべきか(使い分け)
| 手段 | 向いている場面 |
|---|---|
| Find | 単発・高速・Excel的検索 |
| Match | 単発・高速 |
| Table | 業務データ参照・保守重視 |
| SQL | 大量データ・複数条件検索・安定性重視 |
11. まとめ
- FindはExcel検索機能そのものでCtrl+Fと状態を共有している
- 問題は挙動ではなく明示されていない設定の「無自覚な使用」
結論として、検索は「複数の手段を使い分ける」
これが、
Excel VBAを安定して運用するための現実解です。