
VBAにおけるInStrとは?特徴や基本的な構成、InStr関数の使い方を解説
InStr関数は文字列から検索文字列を探し出すときに使う関数です。
この関数は大きく3つの特徴があります。指定の文字列を「含む」・「あいまい検索する」・「複数検索する」の3つです。この3つの特徴をInStr関数は持っています。
3つの特徴をの基本的な使い方をサンプルプログラムを交えて説明します。実際にコードウィンドウに張り付けて、ぜひ実行してみてください。
1.InStr関数の3つの特徴とLike演算子を比較する
1-1.InStr関数、1つ目の特徴、「含む」
指定の文字列を「含む」かどうかを検索したい場合に使用します。
この「含む」の使い方はさらに3つの使い方ができます。「~を含む」・「~を含まない」・「~で始まる」です。この条件は戻り値を利用することで判断ができます。
InStr関数は戻り値の特長を利用した方法で「含む」を判断します。
1-2.InStr関数、2つ目の特徴、「あいまい検索する」
大文字と小文字、半角と全角、ひらがなとカタカナを区別しないで検索できます。
テキストモードを使います。InStr関数の引数、またはモジュール宣言セクションに設定します。
1-3.InStr関数、3つ目の特徴、「複数検索する」
検索文字列が何個存在しているかを確認できます。
繰り返し処理、Do Loopステートメントを使用します。
1-4.Like演算子でも「含む」と「あいまい検索」ができる
Like演算子とワイルドカードを使った条件でも「含む」という検索ができます。
テキストモードでは、大文字と小文字、半角と全角、ひらがなとカタカナを区別しないで検索します。
strVal = "シブシシシブシチョウシブシノシブシシヤクショシブシシショ" If strVal Like "シブシ*" Then Debug.Print "始まる" If strVal Like "*シブシ*" Then Debug.Print "含む" If strVal Like "シブシ*" Then Debug.Print "始まる"
InStr関数は戻り値の値により「含む」などを判断します。Like演算子はIf文とワイルドカードを使って、複数の「含む」などの検索をします。Like演算子の使い方を知っておくことも有益です。そしてわかりやすいコード記述とすることが重要です。
1-5.※ 区切り文字が「スペース」や「ピリオド」の場合の取り出し処理は「Split関数」を活用する
名前を区切る、IPアドレスをオクテットに分割する場合は、InStr関数で調べた位置をLeft関数やMid関数の引数に指定し取り出すことが可能です。しかし、区切り文字が「スペース」や「ピリオド」などの場合は、「Split関数」を活用する方が解りやすく、処理もスムーズになります。「Split関数」の使い方を知っておくことも有益です。そしてわかりやすいコード記述とすることが重要です。
2.InStr関数の構文
2-1.InStr関数の構文について
【書式】
Instr ([開始位置 ,] 文字列 , 検索文字列 [, 比較方法])
戻り値はVariant型です
引数については次のとおりです。
引数 | 説明 | 省略値 |
開始位置(省略可能) | 開始する位置(省略すると1となる) | 1 |
文字列(必須) | もととなる文字列を指定する | |
検索文字列(必須) | 検索する文字列を指定する | |
比較方法(省略可能) | 比較方法を示す数値。値については、「比較方法 定数」を参照してください。 | 0 |
比較方法については次のとおりです。
比較方法 定数 | 説明 | 値 |
vbUseCompareOption | Option Compare ステートメントの設定を使用して比較する | -1 |
vbBinaryCompare | バイナリモードで比較する。 半角と全角、ひらがなとカタカナ、アルファベットの大文字と小文字を区別します。 | 0 |
vbTextCompare | テキストモードで比較する。 半角と全角、ひらがなとカタカナ、アルファベットの大文字と小文字を区別しない。 | 1 |
vbDatabaseCompare (Accessのみ) | DBに格納されている設定で比較する | 2 |
「vbUseCompareOption」は、モジュール宣言セクションに指定した値で比較します。
2-2.Option Compare ステートメントを設定する
モジュール宣言セクションにOption Compare ステートメントを使用して比較方法を設定することができます。比較方法はExcelは2つ。Accessは3つです。
Option Compare ステートメントの設定方法 | 説明 |
Option Compare Binary | バイナリモードで比較する。 |
Option Compare Text | テキストモードで比較する。 |
Option Compare Database (Accessのみ) | DBに格納されている設定で比較する |
3.動作確認はイミディエイトウィンドウを利用する
動作確認は、Debug.Printを使いイミディエイトウィンドウの利用が便利です。
イミディエイトウィンドウを開きます。([表示]メニュー → [イミディエイトウィンドウ]を選択します)
コードウィンドウにカーソルを当てて実行する(F5)と、イミディエイトウィンドウへ結果が出力されます。
Option Explicit Sub Sample3() Debug.Print "Hello, World!" End Sub
■実行結果:
4.InStr関数の使い方
4-1.指定の文字列を「含む」かどうかを検索する
Instr関数は文字列の中から検索文字列を検索し、見つかった位置を数値で返す関数です。3つの使い方、「~を含む」・「~を含まない」・「~で始まる」という条件は、戻り値の特長を利用した方法です。
戻り値が、見つからないときは、0の「~を含まない」。見つかったときは、「~を含む」。戻り値が1の場合は「~で始まる」と判断できます。
Option Explicit Sub Sample4_1() Dim strVal As String Dim varRet As Variant strVal = "シブシシシブシチョウシブシノシブシシヤクショシブシシショ" ' 「~を含む」 varRet = InStr(strVal, "シブシシヤクショ") Debug.Print varRet '15 ' 「~を含まない」 varRet = InStr(strVal, "しぶし") Debug.Print varRet '0 ' 「~で始まる」 varRet = InStr(strVal, "シブシ") Debug.Print varRet '1 End Sub
■実行結果:
4-2.大文字と小文字、半角と全角、ひらがなとカタカナを区別しないで検索する
■テキストモード
InStr関数は引数を設定しなければ、大文字と小文字を区別します。大文字と小文字を区別しないにするには、第4引数に “vbTextCompare” を指定します。
その他の方法としては、モジュール宣言セクションに「Option Compare Text」を設定します。大文字と小文字、半角と全角、ひらがなとカタカナを区別しないで検索します。
Option Explicit Option Compare Text Sub Sample4_2() Dim strVal As String Dim varRet As Variant strVal = "シブシシシブシチョウシブシノシブシシヤクショシブシシショ" ' 半角カタカナ varRet = InStr(strVal, "シブシシヤクショ") Debug.Print varRet '15 ' 全角ひらがな varRet = InStr(strVal, "しぶし") Debug.Print varRet '1 strVal = "shibushishishibushichoushibushinoshibushishiyakushoshibushishisho" ' 大文字 varRet = InStr(strVal, "SHIBUSHI") Debug.Print varRet '1 End Sub
■実行結果:
すべての検索文字列が見つかった。戻り値がゼロではない。
4-3.検索文字列が複数含まれる場合は Do Loopステートメント
文字列の中に検索文字列が何個存在しているかを確認できます。
複数含まれるかを調べる場合は Do LoopステートメントとInStr関数を使います。
Option Explicit Option Compare Text Sub Sample4_3() Dim strVal As String Dim varRet As Variant Dim lngCnt As Long strVal = "シブシシシブシチョウシブシノシブシシヤクショシブシシショ" lngCnt = 0 Do varRet = InStr(varRet + 1, strVal, "シブシ") If varRet <> 0 Then lngCnt = lngCnt + 1 Debug.Print varRet '1 , 5 , 11 , 15 , 23 , 0 Loop Until varRet = 0 Debug.Print lngCnt & " カウント" '5 End Sub
■実行結果:
半角カタカナの“シブシ“ですが、全角カタカナの文字列の位置、1 , 5 , 11 , 15 , 23番目に存在しました。そして5つありました。カウント数により、例えば、検索文字を取り出すなどのパターン処理が考えられます。
4-4.特定の文字列を取り出す
InStr関数のサイトの検索でヒットする「文字列を抜き出す」、「指定し取り出す」、「特定の文字の後ろを全て削除する」などの「取り出す」処理は、Do LoopステートメントとInStr関数、そしてMid関数を組み合わせて動的配列に値を設定する方法で取り出します。
下記のサンプルは、検索文字列が、1つ含むでも、複数含むでも、含まないでも、各要素を取り出すことができます。
Option Explicit Option Compare Text Sub Sample4_4() Dim strVal As String Dim varRet As Variant Dim varMae As Variant Dim varArray() As Variant Dim Ix As Long Dim lngLen As Long strVal = "シブシシシブシチョウシブシノシブシシヤクショシブシシショ" Erase varArray '配列初期化 varMae = 1 Do varRet = InStr(varRet + 1, strVal, "シブシ") Debug.Print varRet '1 , 5 , 11 , 15 , 23 , 0 '動的配列へ格納 If varRet <> 1 Then lngLen = varRet - varMae If varRet = 0 Then lngLen = LenB(strVal) - varMae ReDim Preserve varArray(Ix) '要素数再定義 varArray(Ix) = Mid(strVal, varMae, lngLen) Ix = Ix + 1 End If varMae = varRet Loop Until varRet = 0 For Ix = 0 To UBound(varArray) Debug.Print Ix + 1 & "個目:" & varArray(Ix) Next Ix End Sub
■実行結果:
“シブシですが、文字列の位置、1 , 5 , 11 , 15 , 23番目に存在しました。そして5つにすることができました。
5.さいごに
最後に、InStr関数は文字列から検索文字列を探し出すときに使う関数です。
とくに、指定の文字列を「含む」の使い方を理解しておくことは有益なことだと思います。この「含む」の使い方、「~を含む」・「~を含まない」という条件は、FBの照合で使用したことがあります。
振込人欄と顧客マスタの「振込人欄(n)」とで照合するのです。それでも無い場合は振込人欄と顧客マスタの「顧客名カナ」と照合するのです。この時、“カ)” や “(カ” を削除しなくてもよい「InStr関数」はたいへん役に立ちました。また、テキストモードの比較を引数で指定すれば、全角の「顧客名カナ」でも照合することができるのです。その後は人が紐付けを行い、学習機能として情報を保存し、次回に特定できるようにします。
InStr関数、たいへん役に立つ関数です。
コメント