1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

知らないと怖いExcelVBAの穴4~Find関数の不確実性~

Last updated at Posted at 2026-01-06

1. はじめに

Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります。

その「ゆるさ」は、初心者にとっては優しさであり、
一方で実務では 再現性のない不具合 を生みやすい原因にもなります。

本記事では、VBAで頻繁に使われる Find関数の特徴と、
それを踏まえた代替検索手段について整理します。

2. Find関数の正体

Findは、VBA独自の検索関数ではありません。

VBA
Set c = Range("A:A").Find("ABC")

この処理は、Excel本体の検索機能(Ctrl+F)をそのまま呼び出しています。

つまり Find関数は、Excelの検索状態そのものを操作する命令です。

3. FindはExcel全体の検索状態を共有している

Find関数は、Ctrl+F の検索設定と完全に状態を共有しています。

これは一方向ではありません。

  • Ctrl+F の設定 → VBA Find に影響

  • VBA Find の引数 → Ctrl+F の設定に影響

この相互作用が、Findを「扱いにくく感じさせる原因」です。

4. 数々の省略引数

VBA
Set c = Range("A:A").Find("ABC")

この1行は、実際には次の条件を暗黙に使用しています。

  • 完全一致 / 部分一致
  • 大文字 / 小文字区別
  • 検索対象(値 / 数式)
  • 検索方向 行 / 列

これらを記述しなかった場合、
直前のCtrl+F操作時、Find実行時の設定がそのまま反映されます。
つまり、通常の関数の引数と異なり、省略時の状態が定められていないのです。

よって、コードが同じでも結果が変わってしまいます。

5. Findのフィルター挙動について

Findは、フィルターで非表示になっている行も検索対象に含みます。
これはむしろ安全装置として働く仕様でしょう。

6. Findを安全に使うための最低条件

Findを使うなら、引数をすべて明示する必要があります。

VBA
Set c = Range("A:A").Find( _
    What:="ABC", _
    LookIn:=xlValues, _
    LookAt:=xlWhole, _
    SearchOrder:=xlByRows, _
    MatchCase:=False _
)

これにより、

  • 実行環境依存を排除
  • UI操作の影響を遮断

できます。

※逆にVBAがExcelに影響してしまうことは避けられませんが

7. 代替としてのMatch関数

検索といえば Match関数 を思い浮かべる人も多いと思います。

VBA
pos = Application.Match(key, Range("A:A"), 0)

高速で強力な検索手段ですが、実務では注意が必要です。

問題点:

  • 16桁数以上の数値で誤一致が起きる
  • 一致しない場合はエラーを返す

IsErrorによる分岐を用いればエラーが返った場合の対応は可能です。
返るのは行数ではなく、範囲内で何番目のセルかであることに注意。

またApplication.MatchApplication.WorkSheetFunction.Match
挙動が異なる点に気をつける必要があります。

8. テーブル(ListObject)を使った検索

データが表形式で管理されている場合、テーブル(ListObject)化も有効です。

テーブルの利点

  • データ範囲が自動追従
  • 見出し(列名)でアクセスできる
  • 行番号・最終行取得を意識しなくてよい

例:特定列から値を探す

VBA
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の状態に影響されない
  • 可読性が高い
  • 保守しやすい
    という実務向けの利点があります。

ただし上から順の一致確認のため、FindMatchに比べ処理が遅くなります。

9. SQL(ADO)による検索

大量データや、検索条件が明確な場合は SQLが安定します。

SQL検索の特徴

  • 完全一致が保証される
  • 状態を持たない
  • Excelの検索履歴とも無関係

概念例

VBA
SELECT *
FROM [Sheet1$]
WHERE Code = 'ABC'

VBAから実行すれば、

  • Findの状態問題
  • Matchの型問題
  • フィルター状態

をすべて切り離した検索が可能であり、
複数の抽出条件を設定することも可能で、
大規模データを扱う場合に有効となります。

ただしVBAとは異なる、SQL独自の学習が必要です。

10. どれを選ぶべきか(使い分け)

手段 向いている場面
Find 単発・高速・Excel的検索
Match 単発・高速
Table 業務データ参照・保守重視
SQL 大量データ・複数条件検索・安定性重視

11. まとめ

  • FindはExcel検索機能そのものでCtrl+Fと状態を共有している
  • 問題は挙動ではなく明示されていない設定の「無自覚な使用」

結論として、検索は「複数の手段を使い分ける」

これが、
Excel VBAを安定して運用するための現実解です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?