【初心者向け】VBAのInStr関数を完全解説!基本から応用まで

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

「Excel VBAで文字列を検索する方法がわからない…」
こんなお悩みをお持ちではありませんか?


・指定したキーワードが文字列の何文字目にあるか知りたい

・Instr関数ってよく聞くけど、どうやって使えばいいの?

その場合は、VBAの「InStr関数」を
使用すると解決します!


この記事では、VBAの「Instr関数」について初心者でも分かるように解決します!

Instr関数は、文字列の中で特定の文字や文字列を検索する際に非常に便利な関数です。
この関数を使えば、特定のキーワードが文字列のどこにあるかを簡単に取得したり、必要な部分だけを抜き出すことも可能です。
例えば、メールアドレスから「@」の位置を調べたり、「重要」というキーワードを含むデータだけを抽出したりと、業務効率化に役立つ場面がたくさんあります。

この記事では、そんな「InStr関数」の基本的な使い方や実践例を紹介します。
初心者でもすぐに使えるコピペ可能なコードも用意していますので、ぜひ最後までご覧ください!


【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

目次

この記事でできるようになること

この記事を読むと、次のことができるようになります。

スポンサーリンク

VBAの「Instr関数」でできること | 文字列検索の基本と応用

そもそも「InStr関数」を使用するとどんなことができるの?

InStr関数は、Excel VBAで文字列を操作する際に欠かせない便利な関数です。
この関数を使うことで、以下のようなことが簡単に実現できます。

InStr関数でできること

InStr関数は、Excel VBAで文字列の中から特定の文字や単語を検索し、その位置を取得するための関数です。

この関数を使用することで、文字列操作を効率化し、データ検索や抽出といった処理を簡単に行うことができます。

できること
  • 文字列内の特定の文字や単語を検索可能
    • 文字列に特定の文字や単語が含まれているか確認できます。
  • 検索対象の文字列の位置を取得可能
    • 検索文字列が最初に出現する位置を取得します。
  • 大文字と小文字の区別も設定可能
    • 引数で設定することで、大文字小文字を区別して検索するかどうかを指定できます。

具体的にどんなことができるのか?

  • 文字列の中に特定の文字や単語が含まれているかを確認する
    • (例:メールアドレスの「@」を探して形式を確認)
  • 特定の文字が文字列のどの位置にあるかを取得する
    • (例:「重要」という単語がどこに出現しているかを確認)
  • 特定のキーワードを含むデータを抽出する
    • (例:Excelデータから「確認」や「エラー」を含む行だけをピックアップ)

InStr関数は、これらの操作をわずかなコードで実現でき、初心者でも簡単に扱うことができます。

次のセクションでは、InStr関数の基本的な使い方を具体的なコード例とともに詳しく解説していきます。
まずは基礎からしっかり理解していきましょう!

Excel VBA InStr関数の基本構文と使い方|文字列検索を簡単にする方法

InStr関数は、Excel VBAで文字列を検索する際に使われる便利な関数です。

この関数を使うことで、文字列の中に特定の文字や単語が含まれているかを調べたり、その位置を取得することができます。


InStr関数の検索方向

InStr関数の基本構文

InStr関数の基本構文は以下の通りです。

Instr関数の基本構文
スクロールできます
引数必須/任意説明
start任意検索を開始する文字の位置(省略時は1から検索を開始)
string1必須検索対象の文字列(例:セルの値など)
string2必須検索する文字列(例:「@」や「特定の単語」)
compare任意検索時に大文字と小文字を区別するかどうか
vbBinaryCompare=区別する、vbTextCompare=区別しない)
※デフォルトはvbBinaryCompareで、大文字と小文字を区別します

InStr関数は、「string1」の中で「string2」左から順に検索し、最初に見つかった文字の位置を返します。
検索結果として、「string2 」が見つからない場合は「0」を返します。

ワイルドカードを使用しての検索については「注意5. ワイルドカードは使えない」を参照ください。


さらに詳細な仕様については、Microsoft公式のInStr 関数を参照してください。

InStr関数の基本的な使用例

以下のコードでは、InStr関数を使用して「Excel VBA InStr関数を学ぼう!」という文字列(text変数)内で、「VBA」という文字列を検索します。

大文字・小文字を区別する場合のコード例

Sub InstrExample()
    Dim text As String
    Dim position As Long
    
    text = "Excel VBA InStr関数を学ぼう!"
    position = Instr(1, text, "VBA")
    
    If position > 0 Then
        MsgBox "文字列『VBA』は位置 " & position & " にあります。"
    Else
        MsgBox "文字列『VBA』は見つかりませんでした。"
    End If
End Sub
Instr関数の基本的な使用例

大文字・小文字を区別しない場合のコード例

InStr関数では、「compare」引数にvbTextCompareを指定することで、大文字小文字を区別せずに検索することができます。

以下はその例です。

Sub InstrExampleIgnoreCase()
    Dim text As String
    Dim position As Long
    
    text = "Excel VBA InStr関数を学ぼう!"
    position = Instr(1, text, "vba", vbTextCompare)
    
    If position > 0 Then
        MsgBox "文字列『vba』(大文字小文字を区別しない)は位置 " & position & " にあります。"
    Else
        MsgBox "文字列『vba』は見つかりませんでした。"
    End If
End Sub
大文字・小文字を区別しない場合の結果

解説
  • 「VBA」という3文字を検索した場合の結果
    • この例では、「VBA」という完全一致する文字列を検索します。
      3文字全てが一致する場合のみ、その位置を返します。
      • 検索結果
        • 「VBA」は文字列の7文字目から始まるため、InStr関数は「7」を返します。
      • 部分一致の場合
        • 例えば、「VB」や「BA」を検索する場合、それぞれの文字列が見つかる位置(「VB」は7文字目、「BA」は8文字目)を返します。
          ただし、「VBA」という3文字全てが一致しなければ、見つかったとは判定されません
  • 「compare」引数の違い
    • 大文字小文字を区別する場合(デフォルト)
      • InStr関数の「compare」引数を省略する、または「vbBinaryCompare」を指定すると、大文字小文字を区別します。
        • 例:「VBA」を検索 → 見つかる(7文字目)。
        • 例:「vba」を検索 → 見つからない。
    • 大文字小文字を区別しない場合
      • 「vbTextCompare」を指定すると、大文字小文字を区別せずに検索を行います。
        • 例:「vba」や「VBA」どちらでも見つかる(7文字目)。

InStr関数とInStrRev関数の簡単な比較

InStr関数には、似た機能を持つInStrRev関数という関数があります。
この関数は、文字列を検索する方向がInStr関数とは異なります。

以下の表で違いを簡単に比較してみましょう。

スクロールできます
関数名検索方向主な用途
InStr左から右最初に一致する文字列の位置を取得したい場合
InStrRev右から左最後に一致する文字列の位置を取得したい場合

InStr関数が左から順に検索して最初の一致箇所を見つけるのに対し、InStrRev関数は右から検索して最後の一致箇所を見つけます。

あわせて読みたい
VBAのInStrRev関数で文字列検索を極めよう!初心者向け完全ガイド 「VBAで文字列を後ろから検索する方法がわからない…」こんなお悩みをお持ちではありませんか? ・特定の文字列を後方から検索したい・通常のInStr関数との違いを理解し...
スポンサーリンク

InStr関数を使う際の注意ポイント|初心者が覚えておきたい4つのコツ

InStr関数を正しく使うためには、いくつか注意しておきたいポイントがあります。

特に初心者の方が陥りやすいミスや、思わぬエラーを防ぐためのコツを解説します。

注意1. 見つからなかった場合は0を返す

InStr関数が検索文字列を見つけられなかった場合、戻り値は「0」になります。

このため、検索結果を使って条件分岐を行う際には、必ず戻り値が「0」でないことを確認しましょう。

Sub CheckStringNotFound()
    Dim text As String
    Dim position As Long
    
    '// 検索対象の文字列
    text = "Excel VBA InStr関数を学ぼう!"
    
    '// InStr関数で"Python"を検索(見つからない場合を想定)
    position = Instr(1, text, "Python")
    
    '// 結果を条件分岐
    If position = 0 Then
        MsgBox "文字列『Python』は見つかりませんでした。"
    Else
        MsgBox "文字列『Python』は位置 " & position & " にあります。"
    End If
End Sub
見つからなかった場合は0を返すコード例
注意ポイント

戻り値が「1」から始まることを理解し、0が返るケースを考慮する必要があります。

注意2. 検索は左から開始される(デフォルト)

InStr関数はデフォルトで文字列を左から右に検索します。
これにより、最初に一致した位置が返されます。

もし最後に一致した位置を取得したい場合は、「InStrRev関数」を使う必要があります。

比較表(InStr関数とInStrRev関数の違い)

スクロールできます
関数名検索方向主な用途
InStr左から右最初に一致する文字列の位置を取得したい場合
InStrRev右から左最後に一致する文字列の位置を取得したい場合

注意3. 大文字と小文字を区別する場合としない場合

InStr関数はデフォルトで大文字と小文字を区別します(vbBinaryCompare)。

大文字小文字を区別したくない場合は、「compare」引数にvbTextCompareを指定してください。

例:大文字小文字を区別しない検索

Dim position As Long
position = Instr(1, "Excel VBA", "vba", vbTextCompare) '// 位置7を返す
注意ポイント

何も指定しない場合、文字列が一致しても大文字小文字が異なる場合は見つかりません。

注意4. 部分一致ではなく完全一致のみヒット

InStr関数は、指定した文字列が完全一致していないと「一致した」とはみなされません
例えば、以下のような例では、「VBA」を検索する場合に「VB」や「BA」を検索した場合の挙動が異なります。

以下は、InStr関数を使って完全一致のチェックを行うコードです。

Sub CheckPartialAndFullMatch()
    Dim text As String
    Dim positionPartial As Long
    Dim positionFull As Long

    '// 検索対象の文字列
    text = "Excel VBA"

    '// 部分一致の検索(例:「VB」)
    positionPartial = Instr(1, text, "VB")
    If positionPartial > 0 Then
        Debug.Print "部分一致:文字列『VB』は位置 " & positionPartial & " にあります。"
    Else
        Debug.Print "部分一致:文字列『VB』は見つかりませんでした。"
    End If


    '// 完全一致の検索(例:「VBA」)
    positionFull = Instr(1, text, "VBA")
    If positionFull > 0 Then
        Debug.Print "完全一致:文字列『VBA』は位置 " & positionFull & " にあります。"
    Else
        Debug.Print "完全一致:文字列『VBA』は見つかりませんでした。"
    End If

End Sub
部分一致ではなく完全一致のみヒットの結果
コードの解説
  • 検索対象の文字列
    • 検索対象として text = "Excel VBA" を設定しています。
  • 部分一致の検索
    • Instr(1, text, "VB") で部分一致の検索を行います。
      「VB」が見つかった場合、その位置(この場合は7)がpositionPartialに格納されます。
  • 完全一致の検索
    • Instr(1, text, "VBA") で完全一致の検索を行います。
      「VBA」が見つかった場合、その位置(この場合も7)がpositionFullに格納されます。
  • Debug.Printで結果を表示
    • 部分一致と完全一致の結果をそれぞれDebug.Printで出力します。
      実行結果は「イミディエイトウィンドウ」に表示されます。

注意5. ワイルドカードは使えない

InStr関数は、Like演算子のようにワイルドカード(* や ?)を直接サポートしていません
このため、曖昧な検索や特定のパターンを探す場合には工夫が必要です。

例えば、特定の文字列が含まれるかを検索したい場合はInStr関数を使用できますが、「任意の文字列が一致する」ような柔軟な検索はLike演算子や正規表現を使用するのが効果的です。

Like演算子を使ったワイルドカード検索例

以下のコードでは、Like演算子を使って「Excel*」(「Excel」で始まる文字列)を検索しています。

Sub WildcardSearchExample()
    Dim text As String
    Dim isMatch As Boolean
    
    text = "Excel VBA InStr関数を学ぼう!"
    
    '// Like演算子でワイルドカード検索(例:「Excel」から始まるか)
    isMatch = text Like "Excel*"
    
    If isMatch Then
        MsgBox "文字列『" & text & "』は条件に一致しました!"
    Else
        MsgBox "文字列『" & text & "』は条件に一致しませんでした。"
    End If
End Sub
Like演算子を使ったワイルドカード検索結果
ポイント
  • Like演算子を使うと、「Excel」で始まる文字列を簡単に検索できます。
  • ワイルドカード「*」や「?」を使って柔軟なパターン検索が可能です。

正規表現を使用した検索の選択肢

正規表現(RegExp)を使用すると、さらに高度で複雑なパターンマッチングが可能です。
メールアドレス形式の確認や数値の抽出といった特殊な検索が必要な場合に役立ちます。

以下のコードは、正規表現を使ってメールアドレス形式を確認する例です。

Sub RegexSearchExample()
    Dim regex As Object
    Dim text As String
    Dim isMatch As Boolean
    
    text = "example@gmail.com"
    
    '// 正規表現オブジェクトの作成
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
    regex.IgnoreCase = True
    
    '// 正規表現で一致するか確認
    isMatch = regex.Test(text)
    
    If isMatch Then
        MsgBox "文字列『" & text & "』は有効なメールアドレス形式です。"
    Else
        MsgBox "文字列『" & text & "』は無効なメールアドレス形式です。"
    End If
End Sub
正規表現を使用した検索結果
ポイント
  • 正規表現を使うと、メールアドレスや特定のフォーマットの確認が可能です。
  • InStrやLike演算子では対応できない複雑な条件を処理できます。

Like演算子と正規表現の違い

スクロールできます
機能Like演算子正規表現
柔軟性ワイルドカードを使った単純な検索複雑な条件やフォーマットの検証が可能
用途単純なパターンマッチングメールアドレスや特定フォーマットの文字列検証
「Excel*」で「Excel」で始まる文字列を検索メールアドレス形式の検証:「^[a-zA-Z0-9._%+-]+@」
スポンサーリンク

VBAのInStr関数を使った使用例をご紹介

ここからは、VBAのInStr関数の具体的な使用例を紹介します。

以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

使用例1: メールアドレスの特定のドメインを検索

このコードでは、配列に格納されたメールアドレスの中から、指定されたドメイン(例:「@gmail.com」)を含むものを検索し、その結果をデバッグウィンドウに表示します。

コード例 | データの一括入力

Sub SearchDomain()
    Dim emailList As Variant
    Dim domain As String
    Dim i As Long

    '// 検索対象のメールアドレス配列
    emailList = Array("tanaka@gmail.com", "yamada@yahoo.co.jp", "sato@gmail.com", "nakamura@hotmail.com")

    '// 検索するドメイン
    domain = "@gmail.com"

    '// 配列内のメールアドレスを検索
    For i = LBound(emailList) To UBound(emailList)
        If InStr(emailList(i), domain) > 0 Then
            Debug.Print emailList(i)
        End If
    Next i
End Sub

処理結果

使用例1: メールアドレスの特定のドメインを検索の結果

コードの動作概要

STEP
配列の設定

メールアドレスを配列emailListに格納します。
この配列には複数のメールアドレスが含まれています。

STEP
検索キーワードの設定

変数domainに検索対象となるドメイン「@gmail.com」を設定します。

STEP
ループによる検索

Forループで配列内のすべてのメールアドレスを1つずつ走査します。
InStr関数で、各メールアドレスにドメインが含まれているかを判定します。

STEP
一致したデータを出力

一致した場合、そのメールアドレスをDebug.Printで出力します。

このコードで使用している機能

スクロールできます
機能名説明
Array配列を作成して複数のデータを格納します。
InStr指定した文字列が他の文字列に含まれているかを判定します。
For Next配列内のすべての要素を1つずつ処理するためのループ処理を行います。
Debug.Print一致したデータをデバッグウィンドウに出力します。

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub SearchDomain()
    • サブルーチン「SearchDomain」を定義します。
      このサブルーチンでは特定のドメインを検索します。
  2. Dim emailList As Variant
    Dim domain As String
    Dim i As Long
    • 変数を宣言します。
      • 「emailList」は検索対象のメールアドレスを格納する配列です。
      • 「domain」は検索するドメインを格納します。
      • 「i」はループ用のインデックス変数です。
  3. emailList = Array(“tanaka@gmail.com”, “yamada@yahoo.co.jp”, “sato@gmail.com”, “nakamura@hotmail.com”)
    • メールアドレスを配列「emailList」に格納します。
      この例では4つのアドレスが含まれています。
  4. domain = “@gmail.com”
    • 検索したいドメイン(例:「@gmail.com」)を変数「domain」に設定します。
  5. For i = LBound(emailList) To UBound(emailList)
    • 配列内の各要素を順に検索するため、「LBound」から「UBound」までの範囲でループを開始します。
  6. If InStr(emailList(i), domain) > 0 Then
    • InStr関数を使用し、現在の要素(メールアドレス)が指定されたドメインを含むかどうかを判定します。
  7. Debug.Print emailList(i)
    • 一致したメールアドレスをデバッグウィンドウに出力します。
  8. End If
    • 条件分岐の終了を示します。
  9. Next i
    • 次の配列要素を処理するためにループを進めます。
  10. End Sub
    • サブルーチンを終了します。

総括・ポイント

このコードは、配列内のメールアドレスから特定のドメインを検索する基本的な使用例です。

コードをシンプルにまとめることで、初心者でもイメージしやすく、手軽に実行できます。

使用例2: 特定の条件に一致するExcelのセルを検索

このコードでは、Excelシート内の特定の文字列(例:「エラー」や「未処理」)を含むセルを検索し、そのセルの背景色を変更します。

この処理を実行することで、不備があるデータや未処理タスクを目立たせ、管理や修正を容易にすることができます。

コード例 | 特定の条件に一致するExcelのセルを検索

Sub HighlightCellsByKeyword()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim keyword As String

    '// 検索するキーワードを設定
    keyword = "エラー"

    '// 対象のシートを設定
    Set ws = ThisWorkbook.Sheets(1) ' シート1を対象

    '// 最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    '// キーワードを含むセルを検索して背景色を変更
    For i = 1 To lastRow
        If InStr(ws.Cells(i, 1).Value, keyword) > 0 Then
            ws.Cells(i, 1).Interior.Color = RGB(255, 255, 0) '// 背景色を黄色に変更
        End If
    Next i
End Sub

処理結果

特定の条件に一致するExcelのセルを検索の結果

コードの動作概要

STEP
検索条件の設定

keyword変数に検索するキーワード(例:「エラー」)を設定します。

STEP
対象シートの指定

ThisWorkbook.Sheets(1)を使用して、現在のブックの1番目のシートを対象とします。

STEP
最終行の取得

列Aの最終行を取得し、処理範囲を動的に決定します。

STEP
検索と背景色の変更

Forループを使って、列Aのセルを1行ずつ検索し、InStr関数でキーワードが含まれているかを判定します。
該当するセルの背景色を黄色(RGB(255, 255, 0))に変更します。

このコードで使用している機能

スクロールできます
機能名説明
InStr指定した文字列がセルの値に含まれているかを検索します。
ThisWorkbook現在開いているブックを参照します。
Dim – Set対象となるシートを指定します。
Cellsシート内のセルを参照します。
For Next配列内のすべての要素を1つずつ処理するためのループ処理を行います。
Interior.Colorセルの背景色を変更します。
RGB指定したRGB値で色を設定します(この例では黄色)。
End(xlUp)列Aの最終行を取得します(データが入力されている最下部のセルを特定)。

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub HighlightCellsByKeyword()
    • サブルーチン「HighlightCellsByKeyword」を定義します。
      このサブルーチンは、キーワードを含むセルをハイライトします。
  2. Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim keyword As String
    • 変数を宣言します。
      • 「ws」は処理対象のシートを参照するための変数です。
      • 「lastRow」はデータが入力されている列Aの最終行を格納します。
      • 「i」はループ用のインデックス変数です。
      • 「keyword」は検索するキーワードを格納します。
  3. keyword = “エラー”
    • 検索する文字列(キーワード)として「エラー」を設定します。
  4. Set ws = ThisWorkbook.Sheets(1)
    • 処理対象のシートとして、現在のブックの1番目のシートを指定します。
  5. lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
    • 列Aの最終行を取得します。
      • 「Rows.Count」でシート内の最大行数を取得します。
        「End(xlUp)」で列Aを下から上にさかのぼり、最初にデータが入力されているセルの行番号を取得します。
  6. For i = 1 To lastRow
    • 1行目から最終行までを対象にループ処理を開始します。
  7. If InStr(ws.Cells(i, 1).Value, keyword) > 0 Then
    • InStr関数を使用して、列Aの各セルの値(ws.Cells(i, 1).Value)に変数「keyword」が含まれているかを判定します。
  8. ws.Cells(i, 1).Interior.Color = RGB(255, 255, 0)
    • 条件に一致した場合、そのセルの背景色を黄色(RGB(255, 255, 0))に変更します。
  9. End If
    • 条件分岐を終了します。
  10. Next i
    • 次のセルに移動し、ループを続行します。
  11. End Sub
    • サブルーチンを終了します。

総括・ポイント

このコードでは、Excelシート内のデータを検索し、不備や未処理のデータを視覚的に強調することができます。

実務では、エラーの確認やタスクの管理に活用でき、手動でデータを探す手間を大幅に削減します。

スポンサーリンク

この記事のまとめ

この記事では、VBAの「InStr関数」を使用して文字列を検索し、その結果を活用するさまざまな方法について解説しました。

InStr関数を活用することで、文字列内の特定のキーワードを検索し、必要なデータを抽出したり操作したりすることができます。
これにより、Excel業務を効率化し、手作業によるミスを減らすことが可能です。

ポイントのおさらい

さらに学ぶために

この記事でVBAのInStr関数を学んだら、次は関連する便利なVBA機能を学んでみましょう。

InStr関数を使いこなすことで得られる知識を、以下の機能や方法と組み合わせると、Excel作業をさらに効率化できます。

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「JavaScr...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次