VBAで文字列を検索するには、InStr関数またはFindメソッドを使用します。
InStr関数
InStr関数は、文字列内の指定文字列を検索し、最初に見つかった文字位置を返します。
構文は下記です。
1 |
InStr([開始位置], [対象文字列], [検索文字列], [比較モード]) |
[開始位置]:検索を開始する位置を指定します。省略可能です。省略した場合、先頭からになります。
[対象文字列]:検索の対象となる文字列を指定します。
[検索文字列]:[対象文字列]の中から検索する文字列を指定します。
[比較モード]:比較するモードを指定します。省略可能で、省略した場合、vbBinaryCompare(大文字/小文字を区別する)になります。
戻り値は数値で、見つからなかった場合は0を返します。以下に例を示します。
1 2 3 |
Debug.Print InStr("兵庫県神戸市", "神") '4が得られます Debug.Print InStr(3, "徳島県徳島市", "徳") '4が得られます Debug.Print InStr("大阪府大阪市", "県") '0が得られます |
検索値が見つからない場合は0を返す性質を利用し、指定した文字列の有無を調べるのによく使われます。
Findメソッド
Findメソッドは、指定した文字列が含まれるセル(該当が複数の場合はそれらの先頭セル)を検索します。構文は下記です。
1 2 |
式.Find([検索値], [検索開始位置], [検索対象種類], [完全一致or部分一致], _ [検索方向], [検索順序], [大/小文字区別], [全半角区別], [書式検索]) |
[検索値]のみ必須で他は省略可です。省略されることが多いので、特に重要なもののみ説明します。
[検索対象種類]:xlFormulas(数式)、xlValues(値)、xlComents(セルのコメント)の3種類です。文字列検索の場合、xlValuesを用います。
[完全一致or部分一致]: xlPart(部分一致)、xlWhole(完全一致)の2種類です。
戻り値はRangeオブジェクト(セル)で、見つからなかった場合はNothingを返します。
また、FindメソッドはRangeオブジェクトのメソッドですので、式.Findの「式」の部分にはRangeオブジェクトを記述します。下記の例では、特定のセルに何が入力されているのかを表示するプログラムを示します。検索範囲をColumns(1)(=A列)に限定しています。(シート全体を検索するのであれば、「Cells.Find…」とします。)
1 2 3 4 5 6 |
Dim myRng As Range 'A列には各都道府県が入力されており、セルA14に"神奈川県"と入力されているものとします。 Set myRng = Columns(1).Find("神奈川県") Debug.Print myRng.Address & "には" & myRng.Value & "と入力されています。" |
イミディエイトウインドウに「$A$14には神奈川県と入力されています。」と出力されます。
FindメソッドはRangeオブジェクトを返しますので、左辺のSetを忘れないようご注意ください。
Findメソッドの注意点
Findメソッドでは、VBA上のFindメソッド、またはExcelの「検索」での前回実行時の設定値が保存され、引数を省略するとこの設定が流用されます。そのため、前回は検索できたのに今回はできなかった…ということが起こり得ます。文字列を検索する場合は検索値に加え最低限、[検索対象種類]、 [完全一致or部分一致]の二値は指定しておいた方が無難です。
1 |
Set myRng = Columns.Find("神奈川県", , xlValues, xlWhole) |
また、ネット上でのサンプルコードや書籍等では、名前付き引数を明示して
1 |
Set myRng = Columns(1).Find(What:="神奈川県", LookIn:=xlValues, Lookat:=xlWhole) |
と記述されることも多いので覚えておきましょう。