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 が戻す値 |
---|---|
string2 が string1 内で見つかった場合 | 最初に見つかった位置 |
string2 が string1 内にない場合 | 0 |
string1 の長さが 0 の場合 | 0 |
string1 が Null の場合 | Null |
string2 の長さが 0 の場合 | start(未指定の場合 1 ) |
string2 が Null の場合 | Null |
start > string2の文字数 の場合 | 0 |
※ 詳細は次項の解説も参照願います。
[compare] 比較モード
定数 | 値 | 説明 |
---|---|---|
vbBinaryCompare | 0 | バイナリモードで比較します。省略時はこのモードです。 大/小文字、全/半角、ひらがな/カタカナを区別します。 |
vbTextCompare | 1 | テキストモードで比較します。 大/小文字、全/半角、ひらがな/カタカナを区別しません。 |
※ vbUseCompareOption(-1)と vbDatabaseCompare(2)という設定もありますが、まず使用することは無いと思いますので説明を省略しています。
解説
★ InStr で必須な引数(string1 と string2)だけ指定した場合の動作は次とおりです。
- 検査対象の文字列(string1)を先頭から順に検査します。
- 検索は、大/小文字、全/半角、ひらがな/カタカナを区別するバイナリモードです。
- 検査指定文字列(string2)が最初に見つかった位置の数値を返します。
- 見つからなかった場合 0 を返します。
★ InStr で引数(start と compare)を指定した場合の動作は次とおりです。
- 検査対象の文字列(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画像がこちらです。
Do While…Loopを使って、ヒットした位置の次を検索していく設定です。
取得した位置の値を配列に格納して保存し、要素数と Join関数で書き出して表示しています。
おわりに
VBAの関数一覧はこちらです。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへトップリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!
Excel VBA「InStr関数」で対象文字列の中に指定の文字列が存在しているかを検索し、発見した場合にその位置を返す方法について解説しました。
InStr関数は、検索文字列の位置を返してくれるのが特徴です。見つからなかった場合は「0」が返ります。
見つかった位置の数値は、対象文字列に対して何らかの処理を行う際に使用します。
例えば、文字列を分割したり、削除したり、何か(例えば「-」や「/」)を挿入したりなどです。
文字列を操作する関数の中でも、比較的使用頻度の高い関数です。
使い方をしっかり覚えておくようにしましょう。
解説は以上です。少しでもみなさまのお役に立てたなら幸いです(^^;