ExcelのVBAでデータを処理していると、「セルに特定の文字が含まれているかチェックしたい」「文字列の有無によって処理を分岐させたい」「大量のデータから条件に合う行だけを抽出したい」という場面が頻繁に出てきます。
そのときに使うのがInStr関数です。VBAで文字列を検索するための基本関数で、対象の文字列の中に検索文字列が存在するかどうかを数値で返します。しかし「戻り値の意味が分からない」「大文字・小文字の扱いはどうなるのか」「複数条件で検索する方法が分からない」という悩みも多く聞かれます。
本記事では、InStr関数の基本構文から部分一致・完全一致の切り替え、条件分岐への応用、ループを使った複数セルの検索、正規表現を使った高度な検索まで、初心者の方でもすぐに実践できるよう体系的に解説します。
VBAで文字列検索の基礎

文字列検索とは何か
文字列検索とは、ある文字列の中に特定の文字や単語が含まれているかどうかを調べる処理です。VBAでは主にInStr関数を使って実現します。
InStr関数は「In String(文字列の中に)」の略で、検索文字列が対象文字列の何文字目に存在するかを整数で返します。見つからなかった場合は0を返すため、0かどうかを判定するだけで存在確認ができます。
検索の用途とメリット
セル内の特定文字を検出
大量のデータが入ったシートから、特定のキーワードを含むセルを見つけ出す処理に使います。手作業では時間がかかる作業も、VBAのループとInStr関数を組み合わせることで一瞬で完了できます。
文字列条件による処理分岐
セルに特定の文字が含まれているかどうかによって、異なる処理を実行する条件分岐に活用できます。「エラー」という文字が含まれていれば赤くする、「完了」が含まれていれば別シートに移動するといった自動化が実現できます。
テキストデータの整形や抽出
Mid関数やLeft関数と組み合わせることで、文字列の特定部分だけを切り出す処理ができます。たとえば「山田 太郎」という文字列から姓と名を分離したり、メールアドレスからドメイン部分だけを抽出したりする処理が可能です。
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 IfEnd 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 iEnd 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 IfEnd 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 iEnd 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 IfEnd 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 = NothingEnd 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 IfEnd 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()関数を組み合わせて判定する - 空セルやエラー値には
IsEmptyとIsErrorで事前チェックを行う - 複数キーワードはループ+配列で効率的に処理できる
- 高度なパターン検索にはRegExpオブジェクト(正規表現)を活用する

