【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 = "ABCabc"
    String2 = ""

    '倧文字ず小文字を区別
    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関数では倧文字ず小文字だけでなく党角半角も区別されたす。
そのため、

  • 怜玢察象の文字列” ABCabc"
  • 怜玢する文字列""

ずした堎合、文字列” ABCabc"の䞭に党角倧文字の”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関数を䜿甚したす。怜玢察象の文字列の巊から

@の文字前

を抜き出すため、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列に代入するプログラム』ず同じです。

スポンサヌリンク