【VBAリファレンス|実務向け】検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)|Excel VBA

スポンサーリンク

なぜFindメソッドの検索が突然失敗するのか?

Excel VBAで最もよく使われるメソッドの一つが「Findメソッド」です。特定の文字列や数値をセル範囲から探す際に非常に便利ですが、実務の現場では「昨日まで動いていたマクロが、今日突然エラーになる」というトラブルが後を絶ちません。

この原因の多くは、Findメソッドの引数を省略していることにあります。Findメソッドは、引数を指定しない場合、直前に行った「手動検索」や「別のマクロによる検索設定」をそのまま引き継いでしまうという特性があるからです。本記事では、この落とし穴を回避し、堅牢なVBAコードを書くための秘訣を解説します。

基礎知識:Findメソッドの「設定引き継ぎ」とは

Findメソッドには、検索対象(値か数式か)、検索方法(完全一致か部分一致か)、検索順序など、多くの引数が存在します。これらを省略すると、Excelは「最後に使われた検索設定」を流用します。

例えば、ユーザーが手作業で「検索対象:数式」として検索を行った直後に、あなたのマクロが「値」を検索しようとすると、Excelは「数式」の中を探しに行ってしまい、当然見つからずに検索失敗となります。マクロの安定稼働を保証するには、「検索条件を毎回明示的に指定する」ことが鉄則です。

実装・解決策:引数を省略せずに記述する

Findメソッドを使う際は、最低でも「LookIn(検索対象)」と「LookAt(一致条件)」は明示的に指定しましょう。これにより、ユーザーがどのような検索操作を行っていても、あなたのマクロは常に意図した通りに動作します。

サンプルプログラム:安全なFindメソッドの使い方

以下のコードは、セル範囲から「20」という数値を検索する際、設定を固定して実行する例です。

Sub SafeFindExample()
Dim FoundCell As Range
Dim TargetValue As String

TargetValue = “20”

‘ 引数を省略せず、検索対象や一致条件を明示的に指定します
‘ LookIn:=xlValues : セルの「値」を対象にする
‘ LookAt:=xlWhole : セル全体が完全に一致するもののみを探す
Set FoundCell = Cells.Find(What:=TargetValue, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
MatchCase:=False)

‘ 検索結果の判定
If FoundCell Is Nothing Then
MsgBox “指定した値は見つかりませんでした。”
Else
MsgBox “セル ” & FoundCell.Address & ” に見つかりました。”
End If
End Sub

応用・注意点:現場でハマらないためのポイント

1. 全ての引数を網羅する必要はないが、重要なものは指定する
特に指定すべきは LookIn(xlValuesかxlFormulasか)と LookAt(xlWholeかxlPartか)です。これらを明示するだけで、トラブルの9割は防げます。

2. 検索設定の「罠」は他にもある
MatchCase(大文字・小文字の区別)やSearchOrder(行方向・列方向の検索順)も、省略すると前回の設定に依存します。業務アプリなど、不特定多数のユーザーが触る環境では、可能な限り詳細な引数指定を行うのがプロの流儀です。

3. 検索後の処理に注意
Findメソッドで見つかったセル(FoundCell)を使ってさらに別の処理を行う場合、`If FoundCell Is Nothing Then` で必ず判定を行い、見つからなかった場合の分岐を書いておくことで、予期せぬエラーでマクロが停止するのを防ぐことができます。

「自分の環境では動く」という過信を捨て、常に実行環境の変化を予測したコードを書くことが、保守性の高いVBA開発の第一歩です。

タイトルとURLをコピーしました