VBAの全てがここにある!

InStrは「含む」「あいまい検索」「複数検索」3つの特徴を持つ関数

Shirota

Shirota

開発エンジニア/AccessVBA/ExcelVBA/ボールド歴1年

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

比較方法については次のとおりです。

比較方法 定数説明
vbUseCompareOptionOption 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関数、たいへん役に立つ関数です。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

公式アカウントLINE限定!ボールドの内定確率が分かる無料診断実施中
公式アカウントLINE限定!
ボールドの内定確率が分かる無料診断実施中