【会員アンケートご協力のお願い】抽選で計5名様に役立つ書籍をプレゼント!
検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)|Excel VBA |
今まで問題なく動いていたマクロが、ある日急にエラーとなった。
思い当たる原因もなく、途方にくれてしまった・・・。
そんな経験はありませんか?
今回は、そんな「予期せぬ動作で、予期せぬ結果になる」という話です。
まず、次のように準備してください。
新規ワークシートのセル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