Excel・VBA

【VBA】文字列を検索する『InStr関数』の使い方

更新日:

スポンサーリンク

Excel・VBAのInStr関数とは、ある文字列の中から指定した文字列を検索し、最初に見つかった文字の位置を返す文字列処理関数です。

VBAでは使用する頻度が高いため重要な関数になります。

InStr関数はある文字列の中に指定の文字列が含まれているか検索する場合に使用するケースが多い関数ですね。

この記事では、InStr関数について、

  • 『InStr関数』の基本的な使い方
  • 『InStr関数』の構文
  • 『InStr関数』の返り値

を最初に説明します。その後、

  • 検索した文字列がない場合にはメッセージを表示させる方法
  • 検索した文字列が検索対象の文字列に複数ある場合にどうなるのか
  • 大文字小文字を区別しないで検索する方法
  • 大文字と小文字と全角半角を区別しないで検索する方法
  • InStr関数を使用した便利なプログラム

など少し応用的な内容も紹介していきます。

InStr関数の使い方

【VBA】InStr関数の使い方
InStr関数とは、

ある文字列の中から指定した文字列を検索し、最初に見つかった文字の位置を返す文字列処理関数です。

戻り値はVariant型になります。

InStr関数は以下のように記述して使用します。

InStr(検索対象の文字列, 検索する文字列)

ここで一例を紹介します。
例えば、以下のように記述したとします。

InStr(“ABCDEFG”, “C”)

この場合の返り値はどのようになるでしょうか。

このプログラムでは、文字列”ABCDEFG”の中から文字列”C”を検索し、”C”が見つかった位置の番号を返しています。

文字列”ABCDEFG”において”C”は3番目にありますね。そのため、InStr(“ABCDEFG”, “C”)の返り値は”3”になります。

ポイント

検索する文字列が”CD”の場合でも返り値は”3”になります。
InStr関数は検索する文字列に2文字以上の文字列を指定した場合、先頭の文字の位置を返り値として返します。

InStr関数の構文

【VBA】InStr関数の構文
InStr関数の構文は以下のようになります。

InStr([start, ]string1, string2[, compare])

[]で囲まれているstartとcompareは省略可能な引数になります。

各引数の意味について説明します。

Start

省略可能です。通常、文字列の先頭から検索をすることが多いので省略することが多いです。
検索の開始位置を設定する数式を指定します。省略すると、先頭の文字から検索を行います。
引数startにNull が含まれている場合はエラーが発生します。
引数compareを指定した場合は、引数startも指定する必要があります。

string1

省略不可です。
検索対象の文字列を指定します。

String2

省略不可です。
検索する文字列を指定します。

compare

省略可能です。
引数 compare を指定した場合は、引数start も指定する必要があります。
文字列比較のモードを指定します。省略すると、バイナリモードで比較を行います。

定数 内容
vbUseCompareOption -1 Option Compare ステートメントの設定を使用して比較を行います。
Option Compareの規定は、vbBinaryCompareになります。
vbBinaryCompare 0 バイナリモードで比較を行います。
バイナリモードでは全角半角、大文字・小文字が区別されます。
vbTextCompare 1 テキストモードで比較を行います。
テキストモードでは全角半角、大文字・小文字が区別されません。

*引数 compareは定数と値どちらも使用可能です。

InStr関数の返り値

InStr関数の返り値は以下のようになります。

条件 返り値
引数string1の長さが「0」のとき(文字列が空白””のとき) 0
引数string1がNull値のとき Null値
引数string2の長さが「0」のとき(文字列が空白””のとき) 引数startに指定した値
引数string2がNull値のとき Null値
引数string2が引数stiring1に見つからない時 0
引数string2が引数stiring1に見つかった時 最初に文字列が見つかった位置
引数startの値が引数string2の文字数より大きいとき 0

InStr関数を使用したプログラム集

InStr関数の一番シンプルなプログラム

プログラム



プログラム説明


【VBA】InStr関数の一番シンプルなプログラム

まず、

  • String1 = "ABCDEFG"
  • String2 = "C"

によって、
文字列変数String1に文字列”ABCDEFG”を代入しています。文字列変数String2に文字列”C”を代入しています。

その後

InStr(String1, String2)

で” 文字列ABCDEFG”と文字列”C”の比較を行います。“C”は”ABCDEFG”の3番目にあるので返り値は”3”となります。

この結果をMsgbox関数を使用して比較結果を画面上にメッセージを表示しています。

補足説明

プログラム実行後に

ABCDEFGの3文字目にCがある

と検索対象の文字列や検索する文字列などをメッセージ上に表示するためには、プログラムを以下のように記述します。

検索文字がない場合にはメッセージを表示

プログラム



プログラム説明


【VBA】 検索文字がない場合にはメッセージを表示

「検索対象の文字列」に「検索する文字列」がない場合にはInStr関数は0を返します。

そのためIf文を使用することで、検索文字がない場合にはメッセージを表示することができます。

このプログラムでは

  • 検索対象の文字列:"ABCDEFG"
  • 検索する文字列:"1"

としています。

文字列"ABCDEFG"に文字列”1”はありませんね。そのため、InStr関数は0を返します。

InStr関数の返り値が0の場合には、

"ABCDEFG"に”1“がない

と、MsgBox関数を使用して画面上にメッセージを表示しています。

検索した文字列が検索対象の文字列に複数ある場合

プログラム



プログラム説明

InStr関数は最初に文字列が見つかった位置を返り値とします。

そのため、

  • 検索対象の文字列:”ABCABCABCABC"
  • 検索する文字列:"C"

とした場合、文字列”ABCABCABCABC"には文字列”C”が3番目、6番目、9番目、12番目と4つ含まれていますが、InStr関数は最初の文字列”C”が出てくる”3”を返り値として返します

補足説明

以下のプログラムでは、検索対象の文字列の中に検索する文字列が何個含まれているかを調べることができます。

文字列の中に"C"の文字があれば、10行目の

N = InStr(N + 1, String1, String2)

においてNが0以外となります。その結果、

Do While N > 0

の中のプログラムが実行されます。

実行された場合には、次の検索の開始位置を変えるため、13行目の

N = InStr(N + 1, String1, String2)

でNの値を更新しています。

大文字と小文字を区別しないで検索する場合

プログラム



プログラム説明


【VBA】大文字と小文字を区別しないで検索する場合

InStr関数では大文字と小文字が区別されます。そのため、

  • 検索対象の文字列:”abcdefg"
  • 検索する文字列:"C"

とした場合、文字列”abcdefg"の中に大文字の”C”はないため、InStr関数の返り値は”0”となります。

では大文字と小文字を区別しないで検索するにはどのようにすればよいでしょうか。

小文字を大文字に、または、大文字を小文字に変換すればよいのです。
このように大文字⇔小文字と変換する関数としては

  • Ucase関数
  • LCase関数
  • StrConv関数

があるので、これらの関数とInStr関数を組み合わせて使用すれば大文字と小文字を区別しないで検索することができます。

上のプログラム例では、

InStr(UCase(String1), UCase(String2))

の箇所でUcase関数を使用して、文字列を全て大文字に変換して検索を行っています。

ポイント

InStr(UCase(String1), UCase(String2))
の箇所は
InStr(1, String1, String2, 1)
としてもOKです。引数compareをvbTextCompare(もしくは”1”)として、テキストモードで比較するようにすれば全角半角、大文字小文字が区別されないで検索を行うことができます。

大文字と小文字と全角半角を区別しないで検索する場合

プログラム



プログラム説明


【VBA】大文字と小文字と全角半角を区別しないで検索する場合

InStr関数では大文字と小文字だけでなく全角半角も区別されます。
そのため、

  • 検索対象の文字列:” ABCabcABC"
  • 検索する文字列:"C"

とした場合、文字列” ABCabcABC"の中に全角大文字の”C”は9番目にあるため、InStr関数の返り値は”9”となります。3文字目の半角大文字の”C”を検索することができないのです。

では全角半角を区別せずに検索するにはどのようにすればよいでしょうか。

StrConv関数

を使います。

上のプログラム例では

InStr(StrConv(UCase(String1), vbNarrow), StrConv(UCase(String2), vbNarrow))

の箇所で文字列を全て半角大文字に変換して検索を行っています。

ポイント

InStr(StrConv(UCase(String1), vbNarrow), StrConv(UCase(String2), vbNarrow))
の箇所は
InStr(1, String1, String2, 1)
としてもOKです。引数compareをvbTextCompare(もしくは”1”)として、テキストモードで比較するようにすれば全角半角、大文字小文字が区別されないで検索を行うことができます。

InStr関数を使用した便利なプログラム集

A列に”株式会社”の文字がある場合にB列に株式会社を代入

プログラム



プログラム説明


【VBA】A列に”株式会社”の文字がある場合にB列に株式会社を代入

A列に社名が入っており、社名に「株式会社」が含まれている場合にB列に「株式会社」を出力するプログラムになります。

A列にあるメールアドレスの@の前(アカウント)をB列に、@の後(ドメイン)をC列に代入するプログラム

プログラム



プログラム説明


【VBA】 A列にあるメールアドレスの@の前(アカウント)をB列に、@の後(ドメイン)をC列に代入するプログラム

メールアドレスの整理などで便利なプログラムです。まず、

FindNo = InStr(Cells(i, 1), "@")

で文字列”@”の位置を変数FindNoに代入しています。

@の前(アカウント)の文字列をB列に代入する方法

Cells(i, 2) = Left(Cells(i, 1), FindNo - 1)

上のプログラム(11行目)で行っています。
@の前の文字列を取り出すためには、Left関数を使用します。検索対象の文字列の左から

@の1文字前

を抜き出すため、InStrで取得した@の位置(FindNo)から1を引いた文字数を指定しています。

@の後(ドメイン)の文字列をC列に代入する方法

Cells(i, 3) = Right(Cells(i, 1), Len(Cells(i, 1)) - FindNo)

上のプログラム(12行目)で行っています。
@の後の文字列を取り出すためには、Rignt関数を使用します。検索対象の文字列の右から

全文字数-@までの文字数

を抜き出す必要があります。
そのため、全文字数を取得するLen関数を使用しています。

ポイント

Mid関数でも@の後(ドメイン)の文字列取得することができます。
Mid関数を使用する場合には、
Mid(Cells(i, 1), FindNo + 1)とします。

苗字と名前を分けるプログラム

プログラム


プログラム説明


【VBA】苗字と名前を分けるプログラム

人名の整理などで便利なプログラムです。

苗字と名前の間には全角スペースが入ることもあれば、半角スペースが入ることがあります。

そのため、まず、

ReplaceString = Replace(Cells(i, 1), " ", " ")

でCells(i, 1)に格納されている人名に対して、全角スペースを半角スペースに変換したものを文字列変数ReplaceStringに代入してます。

その後は、文字列変数ReplaceString内の半角スペースの位置を

FindNo = InStr(ReplaceString, " ")

で取得しています。

その他のプログラムは『A列にあるメールアドレスの@の前(アカウント)をB列に、@の後(ドメイン)をC列に代入するプログラム』と同じです。

スポンサーリンク
スポンサーリンク

Copyright© Electrical Information , 2019 All Rights Reserved Powered by AFFINGER5.