【Access関数】InStr関数の使い方|構文・具体例

入門講習

Accessでは、文字列の中から特定の文字や単語を探したい場面がよくあります。そんなときに活躍するのが InStr関数 です。


この記事では、InStr関数の基本構文から、クエリやVBAでの活用例まで、わかりやすく解説します。

InStr関数とは

InStr関数 は、「文字列の中で、指定した文字列が何文字目から始まっているか」を返す関数です。

例えば、以下のInStr関数の戻り値は8です。

InStr("Access VBA", "VBA")

これはVBAが”Access VBA”の8文字目から始まっているためです。

InStr関数の活用場面

InStr関数は、主に以下のようなケースで使われます。

  1. 特定のキーワードの“出現位置”をもとに、後続の文字列を切り出したい
  2. 入力データの中に特定の文字が含まれていないかチェックしたい

特に①のように、InStr関数はMid関数と組み合わせることでより真価を発揮します。

たとえば、住所フィールドの中で都道府県以降の住所を取り出す場合、InStr関数でいずれかの位置を取得し、その位置をMid関数の引数に割り当てて文言を取り出す、というような応用が可能です。

このように、切り出し位置が変動する場合にはInStr関数を活用することで、開始位置を掴むことができます。具体的なやり方については、後述の使用例の中で解説します。

構文

Replaceの基本構文

InStr([開始位置],文字列,検索文字列[,比較方法])

各引数の内容は次のとおりです。

引数必須/省略内容
開始位置省略可検索を始める位置。省略すると先頭から検索する
文字列必須検索対象となる文字列を指定
検索文字列必須検索する文字列を指定
比較方法省略可文字列の比較方法。設定値は【表1】を参照

【表1】比較方法の設定値(省略した場合の既定はvbUseCompareOption

定数名内容
vbUseCompareOptionOption Compareステートメントの設定で比較を行う
※モジュールの宣言セクションで以下ステートメントを宣言
・Option Compare Binary
・Option Compare Text
・Option Compare Database

※既定でOption Compare Databaseが設定されています。
各内容の挙動は下記を参照↓↓↓
vbBinaryCompareバイナリモードで比較を行う
※大文字/小文字、半角/全角、ひらがな/カタカナが区別される
vbTextCompareテキストモードで比較を行う
※大文字/小文字、半角/全角、ひらがな/カタカナが区別されない
vbDatabaseCompareデータベースの設定に基づき比較を行う
※既定では区別されない設定になっています。

つまり、引数「比較方法」を省略した場合は、vbUseCompareOptionが適用→モジュールの宣言セクションにvbDatabaseCompareが既定で入っているので、”区別されない”っていうことですね!

具体例

最も基本的な使い方

InStr("Access VBA", "VBA")

【結果】

戻り値として8が返されます。

【解説】

引数「文字列」のAccess VBAに対して、引数「検索文字列」であるVBAの位置を検索します。
先頭から数えて8番目にVBAがあることから、戻り値として8が返ります。

大文字・小文字を区別するパターン

InStr(1,"abcABC", "ABC", vbBinaryCompare)

【結果】

戻り値として4が返されます。

【解説】

引数「比較方法」に vbBinaryCompare を指定すると、大文字と小文字を区別して検索します。
そのため、検索文字列が「ABC」の場合、小文字の「abc」は一致対象にならず、4文字目にある「ABC」 が検索結果として検出されます。

なお、引数「比較方法」を指定する際は、引数「開始位置」 を省略できません
省略するとコンパイルエラーが発生しますので、注意が必要です。

開始位置を指定するパターン

InStr(3, "abcabcabc", "a")

【結果】

戻り値として4が返されます。

【解説】

引数「開始位置」を指定したパターンです。3文字目から検索を開始するため、先頭のaは無視され、4文字目のaが一致対象となるため、4が返されます。

他の関数と組み合わせるパターン

Mid("AAAAA@gmail.com",InStr("AAAAA@gmail.com", "@")+1)

【結果】

戻り値としてgmail.comが返されます。

【解説】

Mid関数と組み合わせて、メールアドレスのドメイン部分(@マーク以降の文字列)を切り出すパターンです。

まず、InStr関数を使って、メールアドレス(AAAAA@gmail.com)の「@」の位置を取得します。
この場合、「@」は6文字目にあります。
したがって、その位置に1を加えた7 が、Mid関数の開始位置となります。

今回は「@」以降の文字列をすべて抽出したいので、Mid関数の引数「文字数」は指定しません。

検索文字が見つからなかった場合

InStr("Access VBA", "XYZ")

【結果】

戻り値として0が返されます。

【解説】

文字列の中に、検索対象の文字が見つからなかった場合は、戻り値として0が返されます。
今回の例では、Access VBAの中にXYZが存在しなかったため、結果は0となります。

一方で、0以外の値が返された場合は、その文字列の中に検索文字が含まれていることを意味します。
つまり、InStr関数は本来の「指定した文字列が全体の何文字目にあるかを調べる」という役割だけでなく、
特定の文字列が含まれているかどうかを判定する」目的でもよく利用されます。

使用例

クエリで使用するパターン

クエリの演算フィールドでInstr関数を使用することができます。

【具体例】

下記のサンプルテーブルは、あるアンケート結果データが格納されています。

サンプルテーブル

今回は、ご意見フィールドに「依頼」の文言があるレコードのみ抽出するクエリを作成してみます。

クエリでInStr関数を使用
 IIf(InStr([ご意見],"依頼")>0,"依頼有")

IIf関数とInStr関数の組み合わせにより、文字列に依頼がある場合は「依頼有」が返り、抽出条件に「依頼有」を指定することで、該当レコードのみ抽出します。

InStr関数を使用せずとも、同じことはLike演算子によるあいまい検索(パターンマッチング)でも可能ですが、別手法の一つとして覚えておこう。

VBAで使用するパターン

記事冒頭で紹介した、住所フィールドの中から都道府県以降の住所を取り出すパターンの具体例を紹介します。

Public Function GetAfterPrefecture(addr As String) As String
    Dim p As Long, minPos As Long
    Dim item As Variant
    Dim pref As Variant
    
    ' 都・道・府・県のいずれかを探索
    pref = Array("都", "道", "府", "県")
    
    For Each item In pref
        p = InStr(addr, item)
        If p > 0 Then
            ' 最も手前に出現する位置を記録(+1でその直後から)
            If minPos = 0 Or p < minPos Then minPos = p + 1
        End If
    Next
    
    ' 都道府県が見つかった場合はその後ろから抽出
    If minPos > 0 Then
        GetAfterPrefecture = Mid(addr, minPos)
    Else
        ' 見つからなかった場合は元の文字列を返す
        GetAfterPrefecture = addr
    End If
End Function

【解説】

  • 【前提】
    引数addrには、住所フィールドの文字列データが渡されます。
  • 7行目
    Array 関数を使って、「都」「道」「府」「県」の4つの文字を配列 pref に格納しています。
    この配列を順番に調べていくことで、住所の中にどの都道府県名が含まれているかを判定します。
  • 9~15行目
    For Each ループで、配列prefの各要素(都・道・府・県)を順に取り出し、
    InStr関数を使って住所(addr) の中からその文字が現れる位置を検索します。
    見つかった場合は、その位置に1を加え(都道府県名の直後を示すため)、変数minPosに格納します。
    なお、複数の文字が含まれている場合は、最も手前にあるもの(最小の位置)を採用します。
  • 18~23行目
    もし都道府県文字が見つかった場合は、Mid関数を使って、その位置以降の文字列を抽出し、
    その結果を関数の戻り値GetAfterPrefectureに代入します。
    一方で、住所に「都・道・府・県」のいずれも含まれていない場合(海外住所など)は、
    元の住所文字列そのものを返すようにしています。

事例としてはかなり応用編です。
本例は、Functionプロシージャによる独自関数の作成なので、他の関数同様
GetAfterPrefectureをクエリなどに使うことができます

まとめ

InStr関数は「指定した文字列が全体の何文字目にあるかを調べる」ことができる関数ですが、それのみでは、それほど有能な関数といえませんが、他の文字列操作関数(Mid、Left、Right関数等)と組み合わせることで、非常に有能な関数となります

文字列から特定の文字を切り出すシーンは、実務の中でも頻繁に登場し、特に切り出し位置が可変するケースも多いため、ぜひInStr関数と他関数の組み合わせパターンをマスターしておいてください。

タイトルとURLをコピーしました