HOME > 即効テクニック > Excel VBA > その他関連のテクニック > 検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)

検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)|Excel VBA

その他関連のテクニック

検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)

(Excel 97/2000/2002/2003/2007/2010)

今まで問題なく動いていたマクロが、ある日急にエラーとなった。
思い当たる原因もなく、途方にくれてしまった・・・。
そんな経験はありませんか?
今回は、そんな「予期せぬ動作で、予期せぬ結果になる」という話です。

まず、次のように準備してください。
新規ワークシートのセルB7に「=10+10」と入力します。
[Enter]キーを押して確定すれば、セルB7には「20」と表示されます。
その後、アクティブセルをセルA1に移動して、次のマクロを実行してください。

Sub Sample1()
  Dim FoundCell
  Set FoundCell = Cells.Find(What:=20)
  If FoundCell Is Nothing Then
    MsgBox "見つかりません"
  Else
    MsgBox FoundCell.Address
  End If
End Sub

結果はどうでしょう。
このマクロは、お使いのパソコンによって動作が異なります。
「$B$7」と表示された方は、Findメソッドの検索に成功しています。

成功した方は、それでは次のようにExcelを操作してください。
[ホーム]タブ→[編集]→[検索と選択]→[検索](Excel 2003以前では[編集]メニュー→[検索])で[検索と置換]ダイアログボックスを開き、[検索する文字列]に「20」、[検索対象]を「数式」にして[次を検索]ボタンをクリックします。 実行すると「検索条件に一致するデータが見つかりません」となります。

では、そのまま[閉じる]ボタンをクリックしてダイアログボックスを閉じ、もう一度先のマクロSample1を実行してみてください。
今度は「見つかりません」と表示されるはずです。
同じマクロなのに、二度目はFindメソッドが検索に失敗したのです。

原因は[検索と置換]ダイアログボックスでの手動操作です。
[検索対象]は、セルの何を検索するか指定します。
「値」を指定すると、セルに表示されているデータを検索します。
「数式」を選ぶと、セル内に入力されている数式を検索します。
セルに「=10+10」と入力した場合、セルに表示されるのは「20」ですが、入力した数式「=10+10」内に「20」は含まれていません。
ですから、検索対象を「数式」にした場合、「20」は見つかりません。

注意すべきは、こうした検索の設定は「次回に引き継がれる」ということです。
引き継がれるのは、マクロで行った検索も、手作業で行った検索も同じです。
上のマクロSample1のように、Findメソッドの引数でLookInで検索対象を指定していない場合、前回に検索された設定が引き継がれて適用されます。

マクロを作成したときは"たまたま"検索に成功したとしても、何気なくユーザーが行った手動操作の検索によって設定が変更されると、それまで順調に動いていたマクロが、ある日急にエラーとなってしまいます。
より安全なマクロを作るのなら、設定は省略しないよう心がけましょう。

Findメソッドの省略可能な引数のうち、前回の検索を引き継ぐ引数は次の通りです。

・LookIn(検索対象)
    値:xlValues
    数式:xlFormulas
    コメント:xlComments

・LookAt(セル内容が完全に同一であるものを検索する)
    完全一致:xlWhole
    部分一致:xlPart

・SearchOrder(検索方向を指定する)
    列方向に検索:xlByColumns
    行方向に検索:xlByRows
    
・MatchCase(大文字と小文字を区別する)
    区別する:True
    区別しない:False

・MatchByte(半角と全角を区別する)
    区別する:True
    区別しない:False

・SearchFormat(書式で検索する。Excel 2002以降で使用可)
    書式で検索する:True
    書式で検索しない:False