セルの検索を行うFindメソッド
Findメソッドはセルの検索を行います。Findメソッドを実行したあとに継続して他のセルの検索を行う場合はFindNextメソッドやFindPreviousメソッドを利用します。FindNext、FindPreviousについては「VBAでセルの検索を続けて行う(FindNext、FindPrevious)」をご参照ください。
FindメソッドはExcelの検索機能と同じ動作になりますが、Excelの検索機能には無い検索開始セルを指定したり検索方向を指定可能になっています。
なお、Findメソッドを利用する際には注意点があります。
それはExcel上の検索ダイアログの条件とVBAのFindメソッドの各引数の条件がお互い影響しあう特性がある点です。詳細は後述しています。
構文
1 |
Function Range.Find(What, [After], [LookIn], [LookAt], [SearchOrder], [SearchDirection As XlSearchDirection = xlNext], [MatchCase], [MatchByte], [SearchFormat]) As Range |
親オブジェクト | Rangeオブジェクトを指定します。
Excelの検索機能はシート全体が対象になりますが、同じようにする場合は「Cells」と指定します。 |
||||||||||||
What | 検索したい値を指定します。 | ||||||||||||
After (省略可) |
親オブジェクトで指定した検索範囲内に含まれている単一セルを指定します。
ここで指定したセルは検索対象にならず、次のセルから検索が行われます。それらの検索が終わったあとにここで指定したセルが検索されます。 省略した場合は親オブジェクトで指定した検索範囲の中で一番左上にあるセルになります。 親オブジェクトのRangeのセル範囲にここで指定したセルが含まれていない場合はエラーになります。 |
||||||||||||
LookIn (省略可) |
どういう種類を検索するのかをXlFindLookin列挙型で指定します。
XlFindLookin列挙型
省略時は前回検索時(Excelでの検索含む)の内容が設定されます。 |
||||||||||||
LookAt (省略可) |
Whatで指定した値と完全一致するものを検索するかどうかをXlLookAt列挙型で指定します。
XlLookAt列挙型
省略時は前回検索時(Excelでの検索含む)の内容が設定されます。 |
||||||||||||
SearchOrder (省略可) |
検索方向が行か列かをXlSearchOrder列挙型で指定します。
XlSearchOrder列挙型
省略時は前回検索時(Excelでの検索含む)の内容が設定されます。 |
||||||||||||
SearchDirection (省略可) |
検索方向が左上から右下か、右下から左上かをXlSearchDirection列挙型で指定します。
XlSearchDirection列挙型
|
||||||||||||
MatchCase (省略可) |
大文字と小文字を区別するかを指定します。区別する場合はTrue、区別しない場合はFalseを指定します。
省略時は前回検索時(Excelでの検索含む)の内容が設定されます。 |
||||||||||||
MatchByte (省略可) |
全角と半角を区別するかを指定します。区別する場合はTrue、区別しない場合はFalseを指定します。
省略時は前回検索時(Excelでの検索含む)の内容が設定されます。 |
||||||||||||
SearchFormat (省略可) |
検索するセルの書式を指定します。 | ||||||||||||
戻り値Range | 検索条件に一致するセルが見つかった場合はそのセルのRangeオブジェクトを返します。見つからなかった場合はNothingを返します。
VBAで書く場合はほとんどの場合においてNothing判定処理が必要になります。 |
各プロパティはExcelの検索ダイアログと対応しています。AfterとSearchDirectionはVBA特有の設定です。
一部引数の設定はExcelの検索ダイアログにも影響する
Findメソッドの以下の各引数はFindメソッドを実行する度にその設定内容がExcelとVBAのどちらからも参照する内容として保存されます。
- LookIn(数式、値、コメント)
- LookAt(完全一致)
- SearchOrder(行、列)
- MatchCase(大文字、小文字)
- MatchByte(全角、半角)
そのため、Excel上での検索を行う際の「検索と置換」ダイアログにもVBAでのFindメソッドの設定内容が反映されます。
また逆に、Excel上での検索条件もVBAのFindメソッドに反映されるため引数省略時は前回の条件が適用されます。
検索条件を前回の条件に左右されたくない場合は、Findメソッドの上記引数は省略せずにきちんと設定するようにしてください。
戻り値のNothing判定処理
Findメソッドで検索に一致するセルが見つからない場合はNothingが返されます。
そのため、Findメソッドの戻り値であるRangeオブジェクトをNothingを考慮せずに操作すると、実際にNothingが返ってきた場合にエラーが発生します。
VBAでFindメソッドを使う場合は必ずNothingの判定を入れるようにしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub FindNothingTest() Dim r As Range Set r = ActiveSheet.Cells.Find(What:="aaa") '// Nothingではない場合 If Not r Is Nothing Then Debug.Print "Not Nothing" '// Nothingの場合 ElseIf r Is Nothing Then Debug.Print "Nothing" End If End Sub |
サンプルコード
シートの全セル(Cells)から”aaa”と入力されているセルを検索するサンプルです。
見つからなかった場合は「検索不一致」とメッセージボックスが表示されます。
見つかった場合はそのセルを選択します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub FindTest() Dim r As Range Set r = Cells.Find( _ What:="aaa", _ After:=ActiveCell, _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ MatchByte:=False, _ SearchFormat:=False) '// 検索で見つからなかった場合 If r Is Nothing Then MsgBox "検索不一致" Exit Sub End If r.Select End Sub |