本ページには広告が含まれています。

Excel VBA InStr関数 文字列の位置を検索して返す

Excel VBA InStr関数 文字列の位置を検索して返す

Excel VBAの「InStr関数」について解説します。

スポンサーリンク

InStr関数とは

Excel VBA の InStr関数とは、対象の文字列内を先頭から検索して、指定文字列が最初に見つかった位置を返す関数です。

InStr関数(Visual Basic for Applications リファレンス)

スポンサーリンク

構文(引数と戻り値)

Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。

構文

InStr([start,] string1, string2 [,compare])

※ [ ] 内の引数は省略可能であることを表しています。

引数と戻り値

InStr関数の引数は次のとおりです。

引数説明
start[省略可能] 検索開始位置を指定します。省略時は 1 です。
string1【必須】検索対象(元)となる文字列を指定します。
string2【必須】検索する文字列を指定します。
compare[省略可能] 比較するモードを指定します。
compare を指定する場合は、start の指定が必須です。
省略時の規定はバイナリモードです。
※ 詳細は次項の解説も参照願います。

InStr関数の戻り値は次のとおりです。

設定条件InStr が戻す値
string2string1 内で見つかった場合最初に見つかった位置
string2string1 内にない場合0
string1 の長さが 0 の場合0
string1 が Null の場合Null
string2 の長さが 0 の場合start(未指定の場合 1 )
string2 が Null の場合Null
start > string2の文字数 の場合
※ 戻り値のデータ型は内部処理形式が Long の Variant です。
※ 詳細は次項の解説も参照願います。

[compare] 比較モード

定数説明
vbBinaryCompare0バイナリモードで比較します。省略時はこのモードです。
大/小文字、全/半角、ひらがな/カタカナを区別します。
vbTextCompare1テキストモードで比較します。
大/小文字、全/半角、ひらがな/カタカナを区別しません。

※ vbUseCompareOption(-1)と vbDatabaseCompare(2)という設定もありますが、まず使用することは無いと思いますので説明を省略しています。

解説

InStr で必須な引数(string1string2)だけ指定した場合の動作は次とおりです。

  • 検査対象の文字列(string1)を先頭から順に検査します。
  • 検索は、大/小文字、全/半角、ひらがな/カタカナを区別するバイナリモードです。
  • 検査指定文字列(string2)が最初に見つかった位置の数値を返します。
  • 見つからなかった場合 0 を返します。

★ InStr で引数(startcompare)を指定した場合の動作は次とおりです。

  • 検査対象の文字列(string1)を開始(start)位置から検査します。
  • 検索モードは引数(compare)の指定に従います。省略時はバイナリモードです。
  • バイナリモードは、大/小文字、全/半角、ひらがな/カタカナを区別します。
  • テキストモードでは区別しないで検索します。
  • 検査指定文字列(string2)が最初に見つかった位置の数値を返します。
  • 見つかった位置の数値は開始位置からの数値ではなく、先頭からの数値です。
  • 見つからなかった場合 0 を返します。

見つかった場合1以上の数値、無かった場合0を返すということです。

使用例

最初は、省略できる引数は指定しない一番単純な例です。

Sub InStr_test1()
  Dim string1 As String
  Dim string2 As String
  string1 = "アイウエオアイウエオ"
  string2 = "ア"
  Debug.Print InStr(string1, string2) ' 6 を返します
End Sub

引数を省略した場合、実際には先頭から検索(1) と vbBinaryCompare(0) が指定されているのと同じです。
バイナリモードで先頭から検索するので「6」が返ってきます。

次は、テキストモードで引数を指定した場合の例です。開始位置は「1」にしています。

Sub InStr_test2()
  Dim string1 As String
  Dim string2 As String
  string1 = "アイウエオアイウエオ"
  string2 = "ア"
  Debug.Print InStr(1, string1, string2, vbTextCompare) ' 1 を返します
End Sub

テキストモードの場合、文字種(大文字/小文字や全角/半角など)を区別しないので、大文字で指定しても小文字にヒットしてしまうので、返される位置は「1」です。

では、開始位置を「2」に指定した場合の例を見てみましょう。

Sub InStr_test3()
  Dim string1 As String
  Dim string2 As String
  string1 = "アイウエオアイウエオ"
  string2 = "ア"
  Debug.Print InStr(2, string1, string2, 1) ' 6 を返します
End Sub

2番目の位置から検索していくので、大文字の「ア」の部分でヒットしました。返された値は「6」です。これは、開始位置からの値ではなく、文字列の先頭からの値になってる点に注意してください。

文字列の位置を複数検索する

検索対象の文字列が複数存在する場合、連続で検索する一例です。

Sub InStr_test4()
  Dim String1 As String
  Dim String2 As String
  Dim arr() As String
  Dim i As Long
  
  String1 = "あすのあさはあめ"
  String2 = "あ"

  ReDim Preserve arr(0) '配列初期化
  i = InStr(i + 1, String1, String2) '初期検索
  Do While i > 0  '0 の場合Loopしない
    If arr(0) = "" Then arr(0) = i  '配列の最初に代入
    i = InStr(i + 1, String1, String2) '以降の検索
    If i > 0 Then '0なら代入しない
      ReDim Preserve arr(UBound(arr) + 1)
      arr(UBound(arr)) = i
    End If
  Loop
  If arr(0) = "" Then '配列を判定して分岐
    MsgBox "「" & String2 & "」はありません"
  Else
    i = UBound(arr) - LBound(arr) + 1 '要素数
    MsgBox "「" & String2 & "」は " & i & "個あります" & _
           vbCrLf & "位置は「" & Join(arr, ",") & "」です"
  End If
End Sub

実行結果のMsgBox画像がこちらです。

InStr関数で検索対象文字列が複数存在する場合に連続検索した結果

Do While…Loopを使って、ヒットした位置の次を検索していく設定です。

取得した位置の値を配列に格納して保存し、要素数と Join関数で書き出して表示しています。

おわりに

Excel VBA「InStr関数」で対象文字列の中に指定の文字列が存在しているかを検索し、発見した場合にその位置を返す方法について解説しました。

InStr関数は、検索文字列の位置を返してくれるのが特徴です。見つからなかった場合は「0」が返ります。

見つかった位置の数値は、対象文字列に対して何らかの処理を行う際に使用します。

例えば、文字列を分割したり、削除したり、何か(例えば「-」や「/」)を挿入したりなどです。

文字列を操作する関数の中でも、比較的使用頻度の高い関数です。

使い方をしっかり覚えておくようにしましょう。

解説は以上です。少しでもみなさまのお役に立てたなら幸いです(^^;

VBAの関数一覧はこちらです。

スポンサーリンク
スポンサーリンク

VBAサンプルファイルダウンロードページのご案内

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへトップリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!