VBAで文字列を検索する方法|InStr関数の使い方と部分一致・完全一致

VBAで文字列検索の基礎 2026

ExcelのVBAでデータを処理していると、「セルに特定の文字が含まれているかチェックしたい」「文字列の有無によって処理を分岐させたい」「大量のデータから条件に合う行だけを抽出したい」という場面が頻繁に出てきます。

そのときに使うのがInStr関数です。VBAで文字列を検索するための基本関数で、対象の文字列の中に検索文字列が存在するかどうかを数値で返します。しかし「戻り値の意味が分からない」「大文字・小文字の扱いはどうなるのか」「複数条件で検索する方法が分からない」という悩みも多く聞かれます。

本記事では、InStr関数の基本構文から部分一致・完全一致の切り替え、条件分岐への応用、ループを使った複数セルの検索、正規表現を使った高度な検索まで、初心者の方でもすぐに実践できるよう体系的に解説します。

  1. VBAで文字列検索の基礎
    1. 文字列検索とは何か
    2. 検索の用途とメリット
      1. セル内の特定文字を検出
      2. 文字列条件による処理分岐
      3. テキストデータの整形や抽出
  2. InStr関数の基本構文
    1. InStr(開始位置, 対象文字列, 検索文字列, 比較方法) の意味
    2. 開始位置の指定
    3. 文字列の部分一致・完全一致の切り替え
      1. vbBinaryCompare / vbTextCompare の違い
      2. 0が返る場合と1以上が返る場合
  3. 文字列検索の応用方法
    1. セル内の文字列を検索して条件分岐
    2. 複数文字列の検索
    3. ワイルドカードや置換との組み合わせ
      1. Mid、Left、Right関数と組み合わせた抽出
      2. Replace関数で置換前に検索
  4. 文字列検索の実践例
    1. セル内に特定文字があるかチェックする例
    2. 条件に応じて処理を分岐させる例
    3. 複数シート・複数セルでの文字列検索
      1. ループ処理で全セルを検索
      2. ヒット件数のカウント方法
  5. 検索時の注意点
    1. 大小文字の違いに注意
    2. 部分一致と完全一致の扱い
    3. セルが空の場合やエラー値が入っている場合
      1. IsEmptyやLen関数で事前チェック
      2. エラー処理の組み込み
  6. VBA文字列検索の応用テクニック
    1. 複数条件で検索
    2. 正規表現を利用した高度検索(RegExpオブジェクト)
    3. 検索結果を配列やコレクションに格納して処理
      1. ヒットしたセルや文字列をまとめて扱う
      2. 処理の効率化と自動化
  7. まとめ
    1. VBAで文字列検索はInStr関数が基本
    2. 部分一致・完全一致・大小文字を意識して使い分け
    3. 検索結果を条件分岐や抽出、置換と組み合わせると効率的

VBAで文字列検索の基礎

VBAで文字列検索の基礎

文字列検索とは何か

文字列検索とは、ある文字列の中に特定の文字や単語が含まれているかどうかを調べる処理です。VBAでは主にInStr関数を使って実現します。

InStr関数は「In String(文字列の中に)」の略で、検索文字列が対象文字列の何文字目に存在するかを整数で返します。見つからなかった場合は0を返すため、0かどうかを判定するだけで存在確認ができます。

検索の用途とメリット

セル内の特定文字を検出

大量のデータが入ったシートから、特定のキーワードを含むセルを見つけ出す処理に使います。手作業では時間がかかる作業も、VBAのループとInStr関数を組み合わせることで一瞬で完了できます。

文字列条件による処理分岐

セルに特定の文字が含まれているかどうかによって、異なる処理を実行する条件分岐に活用できます。「エラー」という文字が含まれていれば赤くする、「完了」が含まれていれば別シートに移動するといった自動化が実現できます。

テキストデータの整形や抽出

Mid関数やLeft関数と組み合わせることで、文字列の特定部分だけを切り出す処理ができます。たとえば「山田 太郎」という文字列から姓と名を分離したり、メールアドレスからドメイン部分だけを抽出したりする処理が可能です。

InStr関数の基本構文

InStr関数の基本構文

InStr(開始位置, 対象文字列, 検索文字列, 比較方法) の意味

InStr関数の構文は以下のとおりです。

InStr([開始位置,] 対象文字列, 検索文字列 [, 比較方法])

引数 必須・任意 内容
開始位置 任意 検索を開始する文字位置(省略時は1)
対象文字列 必須 検索される側の文字列
検索文字列 必須 探したい文字列
比較方法 任意 大文字・小文字の区別方法(省略時はvbBinaryCompare)

基本的な使用例です。

Dim result As Integer result = InStr("Hello World", "World") MsgBox result ' 出力:7("World"は7文字目から始まる)

開始位置の指定

開始位置を指定することで、文字列の途中から検索を開始できます。同じ文字列が複数箇所に存在する場合、最初に見つかった位置の次から再検索するループ処理に活用できます。

Dim str As String str = "apple,banana,apple,grape"

' 2文字目から"apple"を検索 Dim pos As Integer pos = InStr(2, str, "apple") MsgBox pos ' 出力:14(2個目のappleの位置)

開始位置を指定する場合は、比較方法引数も省略できなくなります。開始位置を指定して比較方法を省略したい場合はvbBinaryCompareを明示的に指定します。

文字列の部分一致・完全一致の切り替え

InStr関数自体は部分一致で検索します。完全一致を確認したい場合は、InStr関数の戻り値と文字列の長さを組み合わせて判定します。

' 部分一致:"apple"が含まれているかチェック If InStr("green apple", "apple") > 0 Then MsgBox "含まれています" End If

' 完全一致:"apple"と完全に一致するかチェック Dim target As String target = "apple" If InStr(target, "apple") = 1 And Len(target) = Len("apple") Then MsgBox "完全一致" End If

vbBinaryCompare / vbTextCompare の違い

比較方法 動作
vbBinaryCompare 0 大文字・小文字を区別して比較(デフォルト)
vbTextCompare 1 大文字・小文字を区別せずに比較

' 大文字・小文字を区別しない検索 Dim pos As Integer pos = InStr(1, "Hello World", "hello", vbTextCompare) MsgBox pos ' 出力:1(区別しないので一致する)

' 大文字・小文字を区別する検索 pos = InStr(1, "Hello World", "hello", vbBinaryCompare) MsgBox pos ' 出力:0(区別するので一致しない)

0が返る場合と1以上が返る場合

InStr関数の戻り値は以下の意味を持ちます。

  • 0:検索文字列が対象文字列内に見つからなかった
  • 1以上:検索文字列が見つかった位置(先頭からの文字数)

この性質を利用して、If InStr(...) > 0 Thenで存在確認、If InStr(...) = 0 Thenで非存在確認ができます。

文字列検索の応用方法

文字列検索の応用方法

セル内の文字列を検索して条件分岐

セルの値を取得してInStr関数で検索し、条件分岐する基本パターンです。

Sub CheckCellContent() Dim cellValue As String cellValue = Range("A1").Value

If InStr(1, cellValue, "エラー", vbTextCompare) > 0 Then
    Range("A1").Interior.Color = RGB(255, 0, 0)   ' 赤く塗る
    MsgBox "エラーが検出されました"
ElseIf InStr(1, cellValue, "完了", vbTextCompare) > 0 Then
    Range("A1").Interior.Color = RGB(0, 255, 0)   ' 緑に塗る
Else
    Range("A1").Interior.ColorIndex = xlNone       ' 塗りなし
End If

End Sub

複数文字列の検索

複数のキーワードをいずれか含むかどうかをまとめてチェックする例です。

Sub MultiKeywordSearch() Dim keywords As Variant keywords = Array("エラー", "警告", "失敗")

Dim cellValue As String
cellValue = Range("A1").Value

Dim i As Integer
For i = 0 To UBound(keywords)
    If InStr(1, cellValue, keywords(i), vbTextCompare) > 0 Then
        MsgBox "キーワード「" & keywords(i) & "」が見つかりました"
    End If
Next i

End Sub

ワイルドカードや置換との組み合わせ

Mid、Left、Right関数と組み合わせた抽出

InStrで見つけた位置を利用して、文字列の特定部分を切り出す例です。

' "山田 太郎" からスペースの位置を見つけて姓名を分離 Dim fullName As String fullName = "山田 太郎"

Dim spacePos As Integer spacePos = InStr(fullName, " ")

If spacePos > 0 Then Dim lastName As String Dim firstName As String lastName = Left(fullName, spacePos - 1) ' スペースより前 firstName = Mid(fullName, spacePos + 1) ' スペースより後 MsgBox "姓:" & lastName & " 名:" & firstName End If

Replace関数で置換前に検索

InStrで対象文字列が存在することを確認してからReplace関数で置換することで、無駄な置換処理を省けます。

Dim original As String original = Range("A1").Value

' 対象文字列が存在する場合のみ置換を実行 If InStr(1, original, "旧会社名", vbTextCompare) > 0 Then Range("A1").Value = Replace(original, "旧会社名", "新会社名") End If

InStr関数の詳しい仕様については、Microsoft公式ドキュメント「InStr関数」も参照してください。

文字列検索の実践例

セル内に特定文字があるかチェックする例

Sub CheckKeyword() Dim targetCell As Range Set targetCell = Range("B2")

Dim keyword As String
keyword = "重要"

If InStr(1, targetCell.Value, keyword, vbTextCompare) > 0 Then
    MsgBox "「" & keyword & "」が含まれています。位置:" & _
           InStr(1, targetCell.Value, keyword, vbTextCompare) & "文字目"
Else
    MsgBox "「" & keyword & "」は含まれていません。"
End If

End Sub

条件に応じて処理を分岐させる例

セルの値に応じてステータスをB列に自動入力する実践的な例です。

Sub SetStatus() Dim i As Integer Dim lastRow As Integer lastRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lastRow
    Dim val As String
    val = Cells(i, 1).Value

    If InStr(1, val, "完了", vbTextCompare) > 0 Then
        Cells(i, 2).Value = "処理済み"
        Cells(i, 2).Interior.Color = RGB(0, 255, 0)
    ElseIf InStr(1, val, "エラー", vbTextCompare) > 0 Then
        Cells(i, 2).Value = "要確認"
        Cells(i, 2).Interior.Color = RGB(255, 0, 0)
    ElseIf InStr(1, val, "保留", vbTextCompare) > 0 Then
        Cells(i, 2).Value = "対応待ち"
        Cells(i, 2).Interior.Color = RGB(255, 255, 0)
    Else
        Cells(i, 2).Value = "未分類"
    End If
Next i

End Sub

複数シート・複数セルでの文字列検索

ループ処理で全セルを検索

アクティブなワークブックの全シートの全セルを対象に検索する例です。

Sub SearchAllSheets() Dim keyword As String keyword = "検索キーワード"

Dim ws As Worksheet
Dim cell As Range
Dim hitCount As Integer
hitCount = 0

For Each ws In ThisWorkbook.Worksheets
    For Each cell In ws.UsedRange
        If Not IsEmpty(cell) And Not IsError(cell.Value) Then
            If InStr(1, CStr(cell.Value), keyword, vbTextCompare) > 0 Then
                hitCount = hitCount + 1
                cell.Interior.Color = RGB(255, 255, 0)  ' 黄色でハイライト
            End If
        End If
    Next cell
Next ws

MsgBox "「" & keyword & "」が含まれるセル:" & hitCount & "件"

End Sub

ヒット件数のカウント方法

上記の例のように、ヒットするたびにカウンター変数をインクリメント(hitCount = hitCount + 1)することで、検索結果の件数を集計できます。最後にMsgBoxで件数を表示したり、集計結果を専用シートに書き出したりする処理と組み合わせると実用的なレポート機能になります。

検索時の注意点

大小文字の違いに注意

デフォルト(vbBinaryCompare)では「Apple」と「apple」は別の文字列として扱われます。ユーザーが入力したデータや外部から取得したデータは大文字・小文字が混在することが多いため、文字種を問わず検索したい場合は必ずvbTextCompareを指定してください。

' 大文字・小文字を無視して安全に検索 If InStr(1, cellValue, keyword, vbTextCompare) > 0 Then

部分一致と完全一致の扱い

InStr関数は常に部分一致で検索します。「東京」で検索すると「東京都」「東京駅」なども一致します。完全一致が必要な場合は、InStrの戻り値が1であること(先頭から一致)かつ、文字列全体の長さが一致することを確認します。

' 完全一致のチェック Dim target As String target = CStr(Range("A1").Value) Dim keyword As String keyword = "東京"

If InStr(1, target, keyword, vbTextCompare) = 1 And Len(target) = Len(keyword) Then MsgBox "完全一致" ElseIf InStr(1, target, keyword, vbTextCompare) > 0 Then MsgBox "部分一致" End If

セルが空の場合やエラー値が入っている場合

IsEmptyやLen関数で事前チェック

空のセルやエラー値に対してInStrを実行するとエラーになる場合があります。事前にチェックする習慣をつけましょう。

' 安全なチェックのパターン If Not IsEmpty(cell) And Not IsError(cell.Value) Then If Len(CStr(cell.Value)) > 0 Then If InStr(1, CStr(cell.Value), keyword, vbTextCompare) > 0 Then ' 処理を実行 End If End If End If

エラー処理の組み込み

大量のセルを処理するマクロでは、On Error Resume Nextと組み合わせることで個別のエラーを無視して処理を継続できます。ただし最終的にOn Error GoTo 0でエラー処理を元に戻すことを忘れないようにしましょう。

On Error Resume Next ' エラーを無視して続行 ' 処理 On Error GoTo 0 ' エラー処理を元に戻す

VBA文字列検索の応用テクニック

複数条件で検索

ANDやORを使って複数の検索条件を組み合わせる例です。

Sub MultiConditionSearch() Dim cellValue As String cellValue = CStr(Range("A1").Value)

' 「東京」AND「営業」の両方を含む場合
If InStr(1, cellValue, "東京", vbTextCompare) > 0 And _
   InStr(1, cellValue, "営業", vbTextCompare) > 0 Then
    MsgBox "東京かつ営業が含まれています"
End If

' 「大阪」OR「名古屋」のいずれかを含む場合
If InStr(1, cellValue, "大阪", vbTextCompare) > 0 Or _
   InStr(1, cellValue, "名古屋", vbTextCompare) > 0 Then
    MsgBox "大阪または名古屋が含まれています"
End If

End Sub

正規表現を利用した高度検索(RegExpオブジェクト)

VBAではMicrosoft VBScript Regular Expressionsライブラリを使うことで、正規表現による高度な文字列検索が可能になります。

Sub RegExpSearch() ' 参照設定:Microsoft VBScript Regular Expressions 5.5 を有効にする Dim regex As Object Set regex = CreateObject("VBScript.RegExp")

' メールアドレスのパターンで検索
regex.Pattern = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
regex.IgnoreCase = True
regex.Global = True

Dim cellValue As String
cellValue = Range("A1").Value

If regex.Test(cellValue) Then
    Dim matches As Object
    Set matches = regex.Execute(cellValue)
    MsgBox "メールアドレスを検出:" & matches(0).Value
Else
    MsgBox "メールアドレスは見つかりませんでした"
End If

Set regex = Nothing

End Sub

注意:正規表現を使う場合、VBAのエディタ(VBE)で「ツール」→「参照設定」から「Microsoft VBScript Regular Expressions 5.5」にチェックを入れることで、より型安全な記述ができます。CreateObjectを使う場合は参照設定不要です。

検索結果を配列やコレクションに格納して処理

ヒットしたセルや文字列をまとめて扱う

検索にヒットしたセルのアドレスを配列に収集して後からまとめて処理する例です。

Sub CollectSearchResults() Dim keyword As String keyword = "重要"

Dim results() As String
Dim count As Integer
count = 0

Dim cell As Range
For Each cell In ActiveSheet.UsedRange
    If Not IsEmpty(cell) And Not IsError(cell.Value) Then
        If InStr(1, CStr(cell.Value), keyword, vbTextCompare) > 0 Then
            count = count + 1
            ReDim Preserve results(count - 1)
            results(count - 1) = cell.Address
        End If
    End If
Next cell

If count > 0 Then
    MsgBox count & "件のセルが見つかりました:" & Chr(10) & Join(results, Chr(10))
Else
    MsgBox "該当するセルはありませんでした"
End If

End Sub

処理の効率化と自動化

検索結果を配列やコレクションにまとめることで、後処理(色付け・削除・別シートへのコピーなど)を一括実行できます。セルを1つずつ操作するよりも、まとめてから一括処理する方がコードの見通しが良く、保守もしやすくなります。

VBAのInStr関数と文字列操作の詳しい解説については、BOLD「VBAのInStr関数完全ガイド」侍エンジニア「VBAで文字列を検索する方法まとめ」JavaDrive「ExcelVBAのInStr関数の使い方」も参考にしてください。

VBAをはじめとするExcel活用術や業務効率化のヒントは、kakiro-web.comでも幅広く解説しています。

まとめ

VBAで文字列検索はInStr関数が基本

VBAで文字列を検索するにはInStr関数が基本です。対象文字列の中に検索文字列が存在すれば1以上の位置を返し、存在しなければ0を返すシンプルな仕組みが、条件分岐や繰り返し処理と組み合わせるうえで非常に使いやすい特性です。

部分一致・完全一致・大小文字を意識して使い分け

InStr関数はデフォルトで部分一致・大文字小文字区別ありの検索を行います。大文字・小文字を区別しない検索にはvbTextCompareを指定し、完全一致を確認するには戻り値と文字列の長さを組み合わせて判定します。用途に合わせた比較方法の選択が正確な検索結果につながります。

検索結果を条件分岐や抽出、置換と組み合わせると効率的

InStr関数はMid・Left・Right関数との組み合わせで文字列抽出、Replace関数と組み合わせて安全な置換、ElseIfと組み合わせて多段階の条件分岐など、幅広い処理の起点として機能します。正規表現(RegExpオブジェクト)まで活用できれば、より高度な文字列パターンの検索も実現できます。

  • 基本:InStr(対象文字列, 検索文字列)で部分一致チェック
  • 戻り値が0なら非存在、1以上なら存在(その位置を示す)
  • 大文字・小文字を区別しないならvbTextCompareを指定する
  • 完全一致は戻り値とLen()関数を組み合わせて判定する
  • 空セルやエラー値にはIsEmptyIsErrorで事前チェックを行う
  • 複数キーワードはループ+配列で効率的に処理できる
  • 高度なパターン検索にはRegExpオブジェクト(正規表現)を活用する
See also  Illustratorで文字を縦書きにする方法|横書きとの切り替え手順と応用
Copied title and URL