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」を使用する事をオススメします。

◆「あなたへ」のおすすめリンク

マクロを高速化したいあなたへ~VBA高速化の常識~

マクロでできることをおさらい

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です