Accessでは、文字列の中から特定の文字や単語を探したい場面がよくあります。そんなときに活躍するのが InStr関数 です。
この記事では、InStr関数の基本構文から、クエリやVBAでの活用例まで、わかりやすく解説します。
InStr関数とは
InStr関数 は、「文字列の中で、指定した文字列が何文字目から始まっているか」を返す関数です。
例えば、以下のInStr関数の戻り値は8です。
InStr("Access VBA", "VBA")
これはVBAが”Access VBA”の8文字目から始まっているためです。
InStr関数の活用場面
InStr関数は、主に以下のようなケースで使われます。
- 特定のキーワードの“出現位置”をもとに、後続の文字列を切り出したい
- 入力データの中に特定の文字が含まれていないかチェックしたい
特に①のように、InStr関数はMid関数と組み合わせることでより真価を発揮します。
たとえば、住所フィールドの中で都道府県以降の住所を取り出す場合、InStr関数で都・道・府・県いずれかの位置を取得し、その位置をMid関数の引数に割り当てて文言を取り出す、というような応用が可能です。

このように、切り出し位置が変動する場合にはInStr関数を活用することで、開始位置を掴むことができます。具体的なやり方については、後述の使用例の中で解説します。
構文
InStr([開始位置],文字列,検索文字列[,比較方法])
各引数の内容は次のとおりです。
| 引数 | 必須/省略 | 内容 |
|---|---|---|
| 開始位置 | 省略可 | 検索を始める位置。省略すると先頭から検索する |
| 文字列 | 必須 | 検索対象となる文字列を指定 |
| 検索文字列 | 必須 | 検索する文字列を指定 |
| 比較方法 | 省略可 | 文字列の比較方法。設定値は【表1】を参照 |
【表1】比較方法の設定値(省略した場合の既定はvbUseCompareOption)
| 定数名 | 内容 |
|---|---|
vbUseCompareOption | Option 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関数を使用することができます。
【具体例】
下記のサンプルテーブルは、あるアンケート結果データが格納されています。

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

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関数と他関数の組み合わせパターンをマスターしておいてください。

