【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-1Option Compare ステートメントの設定を使用して比較を行います。
Option Compareの規定は、vbBinaryCompareになります。
vbBinaryCompare0バイナリモードで比較を行います。
バイナリモードでは全角半角、大文字・小文字が区別されます。
vbTextCompare1テキストモードで比較を行います。
テキストモードでは全角半角、大文字・小文字が区別されません。

*引数 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関数の一番シンプルなプログラム

プログラム

Sub Instr関数01_1()
    Dim String1 As String
    Dim String2 As String
    
    String1 = "ABCDEFG"
    String2 = "C"

    MsgBox InStr(String1, String2)
End Sub

プログラム説明


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

まず、

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

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

その後

InStr(String1, String2)

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

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

補足説明

プログラム実行後に

ABCDEFGの3文字目にCがある

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

Sub Instr関数01_2()
    Dim String1 As String
    Dim String2 As String
    Dim FindNo As Integer
    
    String1 = "ABCDEFG"
    String2 = "C"
    FindNo = InStr(String1, String2)

    MsgBox String1 & "の" & FindNo & "文字目に" & String2 & "がある。"
End Sub

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

プログラム

Sub Instr関数01_3()
    Dim String1 As String
    Dim String2 As String
    
    String1 = "ABCDEFG"
    String2 = "1"

    If InStr(String1, String2) = 0 Then
        MsgBox String1 & "に" & String2 & "がない。"
    Else
        MsgBox String1 & "の" & FindNo & "文字目に" & String2 & "がある。"
    End If
End Sub

プログラム説明


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

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

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

このプログラムでは

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

としています。

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

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

"ABCDEFG"に”1“がない

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

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

プログラム

Sub Instr関数02_1()
    Dim String1 As String
    Dim String2 As String
    
    String1 = "ABCABCABCABC"
    String2 = "C"

    MsgBox InStr(String1, String2)
End Sub

プログラム説明

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

そのため、

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

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

補足説明

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

Sub Instr関数02_2()
    Dim N As Long
    Dim cnt As Long
    Dim String1 As String
    Dim String2 As String
    
    String1 = "ABCABCABCABC"
    String2 = "C"
    
    N = InStr(N + 1, String1, String2)
    Do While N > 0
        cnt = cnt + 1
        N = InStr(N + 1, String1, String2)
    Loop
        MsgBox String1 & "は" & String2 & "が" & cnt & "個ある。"
End Sub

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

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

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

Do While N > 0

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

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

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

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

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

プログラム

Sub Instr関数03()
    Dim String1 As String
    Dim String2 As String
    
    String1 = "abcdefg"
    String2 = "C"

    '大文字と小文字を区別
    MsgBox InStr(String1, String2)
    
    '大文字と小文字を区別しない
    MsgBox InStr(UCase(String1), UCase(String2))
End Sub

プログラム説明


【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”)として、テキストモードで比較するようにすれば全角半角、大文字小文字が区別されないで検索を行うことができます。

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

プログラム

Sub Instr関数04()
    Dim String1 As String
    Dim String2 As String
    
    String1 = "ABCabcABC"
    String2 = "C"

    '大文字と小文字を区別
    MsgBox InStr(String1, String2)
    
    '大文字と小文字を区別しない
    MsgBox InStr(UCase(String1), UCase(String2))
    
    '大文字と小文字と全角半角を区別しない
    MsgBox InStr(StrConv(UCase(String1), vbNarrow), StrConv(UCase(String2), vbNarrow))
    MsgBox InStr(1, String1, String2, vbTextCompare)
    MsgBox InStr(1, String1, String2, 1)
End Sub

プログラム説明


【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列に株式会社を代入

プログラム

Sub Instr関数05()
    Dim i As Long
    Dim MaxRow As Long
    
    MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 1 To MaxRow
        If InStr(Cells(i, 1), "株式会社") > 0 Then
            Cells(i, 2) = "株式会社"
        End If
    Next
End Sub

プログラム説明


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

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

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

プログラム

Sub Instr関数06()
    Dim i As Long
    Dim MaxRow As Long
    Dim FindNo As Long
    
    MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

    
    For i = 1 To MaxRow
        FindNo = InStr(Cells(i, 1), "@")
        Cells(i, 2) = Left(Cells(i, 1), FindNo - 1)     '@より前の文字列'
        Cells(i, 3) = Right(Cells(i, 1), Len(Cells(i, 1)) - FindNo) '@より後の文字列'
        'Cells(i, 3) = Mid(Cells(i, 1), FindNo + 1) 'Mid関数でもできる
    Next
End Sub

プログラム説明


【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)とします。

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

プログラム

Sub Instr関数07()
    Dim i As Long
    Dim MaxRow As Long
    Dim FindNo As Long
    Dim ReplaceString As String
    
    MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

    
    For i = 1 To MaxRow
        ReplaceString = Replace(Cells(i, 1), " ", " ")
        
        FindNo = InStr(ReplaceString, " ")
        Cells(i, 2) = Left(ReplaceString, FindNo - 1)     '@より前の文字列'
        Cells(i, 3) = Right(ReplaceString, Len(ReplaceString) - FindNo) '@より後の文字列'
        'Cells(i, 3) = Mid(ReplaceString, FindNo + 1) 'Mid関数でもできる
    Next
End Sub

プログラム説明


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

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

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

そのため、まず、

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

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

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

FindNo = InStr(ReplaceString, " ")

で取得しています。

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

スポンサーリンク