VBAで【Findが使えない!?】指定文字列位置検索は【Instr】を使おう
Excel VBAで指定した文字列の位置を調べる方法を解説します。
エクセルのシート関数では、指定文字列の文字位置を知りたい時は「FIND」関数を使うと思います。
ですが、VBAにおいては、通常の方法では、「Find」は、使えません。
厳密にいいますと、VBAで「Find」メソッドを使用すると
指定文字列などの条件に一致したセルを検索する、また別の処理になってしまいます。*****
ですので、VBAで指定文字列の文字位置を調べる方法は、「Find」ではなく「Instr」を使用します。
シート関数は「FIND」なので、混乱しますが、VBAでは「Instr」です。
サンプルコードを紹介しますので、さほど、難しくないのでサクっと読んでください。
では、VBAの指定文字の文字位置検索ができる「Instr」に使い方について解説していきます。
< ---目次--- >
◆VBA「Instr」の引数
・引数
「Instr」の引数はこちらになります
- 引数start
省略可能。検索を始める位置を指定します。
最初に「数値型」を指定すると、「引数start 」となります。 - 引数string1
検索の対象となる文字列を指定します。 - 引数string2
「引数string1」の中から検索する文字列を指定します。 - 引数compare
省略可能。文字列を比較するモードを指定します。
指定する場合は、「引数start 」も指定しなければいけません。
・引数の詳細(上級者向け)
引数compareの指定できる値と詳細の内容を表にしました。
使用頻度はかなり低いと思いますので、引数compareがあるんだなと頭の片隅においておけばいいと思います。
定数 | 値 | 説明 |
---|---|---|
vbBinaryCompare | 0 | 既定。 バイナリ モードで比較を行います。 全角半角、大文字小文字が区別されます。 |
vbTextCompare | 1 | テキスト モードで比較を行います。 全角半角、大文字小文字が区別されません。 |
◆「Instr」の使い方
上記で紹介した引数を参考にすると
「引数string1」に「検索対象の文字列」
「引数string2」に「文字位置を調べたい文字列」となります。
ですので、「変数=InStr(“検索対象の文字列”, “文字位置を調べたい文字列”)」
という風に引数を指定すれば、良いですね。
(参考までに上記の処理結果は「変数=0」となります)
・基本編(初級)
まずは、頻繁に使用する基本編から紹介します。
-サンプルコード-
Sub Instr_TEST_1()
Dim buf
buf = InStr("ABC", "B")
'処理結果・・・buf=2
'"ABC"の中から"B"という文字列の文字位置を調べて値を返します
End Sub
説明を読むよりコードを見た方が理解するのが早いとは思いますが、念のため説明させていただきます。
まず、「Instr」を使用するには値を返すための変数が必要になります。
「Instr」の「引数1」に検索される側の文字列を指定します。
その次に、「引数2」には、「引数1」の中から文字位置を知りたい文字列を指定します。
「引数1」と「引数2」に変数で指定しない場合は
必ず「””(ダブルクォーテーション)」で文字を囲う必要があります。
今回のサンプルコードを元に解説しますと
「値を返すための変数」が「buf」
「”ABC”」が「引数1」
「”B”」が「引数2」
となります。
Instr( “検索対象の文字列” , “検索したい文字列” )です。
検索したい文字列が見つからない場合は、数値の「0」を返します。
-注意事項-
エクセルのワークシート関数の「FIND」とは、「引数1」と「引数2」の指定が逆になります。
ですので、シート関数の「FIND」とVBAの「Instr」で混乱しないように注意をしてください。
・基本編(中級)
先ほど、ちらっと解説しましたが、「引数」には、文字列型の変数を指定する事ができます。
ですので、引数を変数で指定するサンプルコードも紹介します。
-サンプルコード-
Sub Instr_TEST_2()
Dim buf
Dim Str1 As String, Str2 As String
Str1 = "ABC"
Str2 = "B"
buf = InStr(Str1, Str2)
'処理結果・・・buf=2
'"ABC"の中から"B"という文字列の文字位置を調べて値を返します
End Sub
基本編(初級)で紹介したサンプルコードの引数を変数に置き換えただけです。
ですので、処理結果も同様となります。
・応用編
応用編として、VBAで「検索対象の文字列の中に指定した文字列が何個あるか」というのを
調べる方法を紹介します。
実は、「対象の指定文字列の個数カウント」にも「Instr」が使えます。
引数「start」を動的に変化させる事で、検索したい文字列が何個あるか検索し、調べる事ができます。
下記コードをご覧ください。
Sub Instr_Advanced()
Dim cnt, buf, string1, string2
string1 = "abacad"
string2 = "a"
Do
n = InStr(n + 1, string1, string2)
If n > 0 Then cnt = cnt + 1
Loop While n > 0
MsgBox string2 & "は、" & cnt & "個"
End Sub
'結果・・・cnt=3
引数「start」は、通常使うことは少ないですが、応用して使うとすごく便利ですので、ぜひ使ってください。
◆どうしてもVBAで「FIND」関数を使いたい方へ
「WorksheetFunction.Find」を使用すれば、シート関数の「FIND」は使えるようになります。
ですが、デメリットしかないです。。。
・デメリット
- 微々たる程度ですが、処理速度が遅くなる
「WorksheetFunction.Find」と「InStr」を100000回実行した測定時間を載せます
WorksheetFunction.Find:0.707秒
InStr :0.000195秒 - 他人がコードを見た時に「Find」をなぜ使用しているのか、疑問が発生する
上記、デメリットから「WorksheetFunction.Find」を使用する意味がないことがわかりますね。
VBAで指定文字列の文字位置を調べたい時は、「InStr」を使用する事をオススメします。