この記事でできること
Ctrl+Fで「不良」を検索して、1件ずつ確認して、手動で黄色に塗って、また次を検索して――200行の管理表で毎週これをやっていると、見落としが怖くなるし、何より時間がもったいない。そんな経験はないだろうか。
この記事を読めば、検索キーワードを指定してマクロを実行するだけで、該当するセルがすべて一括でハイライトされる。見落としゼロで、作業時間は数秒。
VBAが初めてでも心配いらない。検索したい文字列を1箇所書き換えるだけで動くコードをそのままコピペできる。
品質管理の台帳で「不良」の文字を毎週探す作業があった。Ctrl+Fで1件ずつ見つけて、手動で背景色を黄色に変えて…を200行の表でやっていた。目がチカチカするし、見落としも怖い。正直しんどかった。
この記事のVBAを使えば、指定した文字列を含むセルを一括で検索してハイライト(背景色を変更)できる。Ctrl+Fで1件ずつ探す必要はない。マクロを実行するだけで、対象セルがすべて黄色になる。
- 対象:管理表や台帳で特定の文字を探す作業がある人、VBAが初めての人
- 所要時間:コピペ → 実行まで約5分(目安)
セルの背景色を条件に応じて変える方法の基本は /006 で解説している。Interior.Color や RGB の使い方が初めてなら先に読んでおくと理解しやすい。
—
どんな場面で使う?
- 品質管理台帳で「不良」「NG」を含むセルをまとめて色付けしたい
- 大量の受注データから特定の取引先名を一括で見つけ出したい
- 業務日報の中から「エラー」「要確認」のキーワードを含む行を目立たせたい
- Ctrl+Fの1件ずつ検索では全体像がつかめず、見落としが怖い
—
完成イメージ(Before / After)
Before(実行前)

「検査結果」列に「不良」が混在しているが、目視では見つけにくい。
| A | B | C | |
|---|---|---|---|
| 1 | 製品名 | ロット | 検査結果 |
| 2 | 部品A | L001 | 良品 |
| 3 | 部品B | L002 | 不良 |
| 4 | 部品C | L003 | 良品 |
| 5 | 部品D | L004 | 不良 |
| 6 | 部品E | L005 | 良品 |
After(実行後)

「不良」を含むセル(C3, C5)の背景色が黄色にハイライトされる。
| A | B | C | |
|---|---|---|---|
| 1 | 製品名 | ロット | 検査結果 |
| 2 | 部品A | L001 | 良品 |
| 3 | 部品B | L002 | 不良(背景色:黄色) |
| 4 | 部品C | L003 | 良品 |
| 5 | 部品D | L004 | 不良(背景色:黄色) |
| 6 | 部品E | L005 | 良品 |
—
実行前の準備
バックアップを取る
対象のExcelファイルをコピーしてバックアップを取ること。ハイライト処理は既存の背景色を上書きするため、元の色付けが消える。
Excelをマクロ有効ブック(.xlsm)で保存する
- 対象のExcelファイルを開く
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存
.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。
企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。
標準モジュールを挿入する
- VBEのメニュー「挿入」→「標準モジュール」をクリック
- 右側に白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
- コード内の
searchWordを自分の検索文字列に書き換える - 検索対象のシートを表示した状態で Alt + F8 を押す
- 「HighlightCells」を選択して「実行」
- 対象セルがハイライトされ、件数がメッセージボックスに表示される
—
コード(最小版)– 指定文字を含むセルをハイライト
まずはこれだけで動く。アクティブシートの使用範囲内で、指定した文字列を含むセルの背景色を黄色にする。
Sub HighlightCells()
Dim searchWord As String
Dim rng As Range
Dim found As Range
Dim firstAddress As String
Dim hitCount As Long
' --- ★ ここを検索したい文字列に書き換える ---
searchWord = "不良"
' 検索対象:アクティブシートの使用範囲
Set rng = ActiveSheet.UsedRange
' 画面更新を停止(高速化)
Application.ScreenUpdating = False
hitCount = 0
' 最初の検索
Set found = rng.Find( _
What:=searchWord, _
LookIn:=xlValues, _
LookAt:=xlPart, _
MatchCase:=False)
' ヒットした場合、ループで全件を処理
If Not found Is Nothing Then
firstAddress = found.Address
Do
' セルの背景色を黄色に変更
found.Interior.Color = RGB(255, 255, 0)
hitCount = hitCount + 1
' 次のヒットへ
Set found = rng.FindNext(found)
Loop While Not found Is Nothing And found.Address <> firstAddress
End If
' 画面更新を再開
Application.ScreenUpdating = True
' 結果を表示
If hitCount > 0 Then
MsgBox hitCount & " 件のセルをハイライトしました。", vbInformation
Else
MsgBox "「" & searchWord & "」を含むセルは見つかりませんでした。", vbExclamation
End If
End Sub
コードの動作:
searchWordに指定した文字列をFindメソッドで検索(部分一致、大文字小文字無視)- ヒットしたセルの背景色を
RGB(255, 255, 0)(黄色)に変更 FindNextで次のヒットに移動し、全件を処理- 最初にヒットしたセルのアドレス(
firstAddress)に戻ったらループ終了 - ハイライトした件数を表示
Find の引数について:
LookIn:=xlValues— 数式ではなく、セルに表示されている値で検索する設定LookAt:=xlPart— 部分一致。セルの値の一部に検索文字列が含まれていればヒットMatchCase:=False— 大文字・小文字を区別しない
検索文字列について: searchWord = "不良" の部分を自分の検索したい文字に書き換える。「NG」「エラー」「未対応」など、業務に合わせて変更する。
自分はこの最小版だけで十分だった。200行の表で「不良」を探すのに10分かかっていたのが、一瞬で終わって拍子抜けした。
—
コード(実務版)– ハイライトリセット+件数表示+InputBox入力
業務で繰り返し使うなら、前回のハイライトをリセットしてから検索したい、検索のたびにコードを書き換えたくない、という要望がある。InputBoxで検索文字列を入力できる版。
セルの背景色を操作する
Interior.ColorとRGB()の基本は、/006 で詳しく解説している。
Sub HighlightCellsEx()
Dim searchWord As String
Dim rng As Range
Dim found As Range
Dim firstAddress As String
Dim hitCount As Long
' --- InputBox で検索文字列を入力 ---
searchWord = Application.InputBox( _
Prompt:="検索する文字列を入力してください。", _
Title:="セル検索ハイライト", _
Type:=2) ' Type:=2 は文字列入力
' キャンセルまたは空欄なら終了
If searchWord = "False" Or searchWord = "" Then
MsgBox "検索を中止しました。", vbInformation
Exit Sub
End If
' 検索対象:アクティブシートの使用範囲
Set rng = ActiveSheet.UsedRange
' 画面更新を停止(高速化)
Application.ScreenUpdating = False
' --- 前回のハイライトをリセット ---
rng.Interior.ColorIndex = xlNone
hitCount = 0
' 最初の検索
Set found = rng.Find( _
What:=searchWord, _
LookIn:=xlValues, _
LookAt:=xlPart, _
MatchCase:=False)
' ヒットした場合、ループで全件を処理
If Not found Is Nothing Then
firstAddress = found.Address
Do
' セルの背景色を黄色に変更
found.Interior.Color = RGB(255, 255, 0)
hitCount = hitCount + 1
' 次のヒットへ
Set found = rng.FindNext(found)
Loop While Not found Is Nothing And found.Address <> firstAddress
End If
' 画面更新を再開
Application.ScreenUpdating = True
' 結果を表示
If hitCount > 0 Then
MsgBox "「" & searchWord & "」を含むセル:" & hitCount & " 件をハイライトしました。", vbInformation
Else
MsgBox "「" & searchWord & "」を含むセルは見つかりませんでした。", vbExclamation
End If
End Sub
追加ポイント:
Application.InputBoxで検索文字列をユーザーが入力(コードを書き換えずに何度でも使える)- 検索前に
rng.Interior.ColorIndex = xlNoneで既存のハイライトをリセット - キャンセル時は処理を中止
- 件数表示に検索文字列を含める
※ InputBox で「キャンセル」を押すと文字列 "False" が返る仕様のため、この判定で中止を検出している。
自分はこの実務版を週次の品質チェックに使っている。検索文字列をInputBoxで入力するだけなので、「不良」「要確認」「保留」と毎回違うキーワードで検索しても、コードを触る必要がない。ハイライトリセットも自動なので、前回の色が残ってしまう問題もなくなった。
注意: ハイライトリセット(Interior.ColorIndex = xlNone)は、使用範囲の全セルの背景色を消す。元から色が付いているセルがある場合、その色も消えてしまう。元の色を維持したい場合は、ハイライトリセットの行を削除するか、特定の色だけをリセットする処理に変更すること。
—
よくある落とし穴5選
自分がFindNextで検索ループを回していたとき、firstAddress を保存し忘れていた。同じセルを何度もハイライトし続けて無限ループにハマり、Ctrl+Breakで3回止めた。FindNextを使うときは、最初のセルのアドレスを必ず保存しておく。これを忘れるとExcelが固まる。
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | マクロが無限ループして止まらない | FindNext のループで最初のセルに戻ったことを検出していない | firstAddress = found.Address を Find 直後に保存し、FindNext の結果が firstAddress と一致したら Exit Do する。万が一無限ループに入った場合は Ctrl+Break で停止できる |
| 2 | 一部のセルが検索にヒットしない | Find の LookAt が xlWhole(完全一致)になっている |
LookAt:=xlPart(部分一致)を明示的に指定する。Find は前回の検索設定を引き継ぐため、毎回指定が必要 |
| 3 | 大文字・小文字が区別されてヒットしない | Find の MatchCase がデフォルトで前回の設定を引き継ぐ |
MatchCase:=False を明示的に指定する |
| 4 | 既存の背景色がすべて消える | 実務版のハイライトリセット(ColorIndex = xlNone)が使用範囲全体に適用されている |
バックアップを取った上で実行する。元の色を維持したい場合はリセット行を削除する |
| 5 | 数値を検索してもヒットしない | LookIn が xlFormulas になっている場合、表示形式が異なる数値がヒットしない |
LookIn:=xlValues(表示値で検索)を明示的に指定する |
VBAで検索ハイライトが1件もヒットしないときの対処法
「確実にデータがあるのに『見つかりませんでした』と表示される」という場合、原因はFindメソッドが前回の検索設定を引き継いでいることだ。LookAt:=xlPart(部分一致)と LookIn:=xlValues(表示値で検索)を毎回明示的に指定すれば、意図した検索結果が得られる。
VBAの検索ハイライトで無限ループになるときの対処法
「マクロが終わらずExcelが固まる」という場合、原因はFindNextのループで最初のセルに戻ったことを検出していないことだ。firstAddress = found.Address をFind直後に保存し、FindNextの結果がfirstAddressと一致したらループを終了するようにすれば解決する。
—
FAQ
Q1: 複数の文字列(「不良」と「NG」)を同時に検索したい
Q2: ハイライトの色を変えたい
Interior.Color = RGB(255, 255, 0) の値を変更する。よく使う色の例:
| 色 | RGB値 |
|---|---|
| 黄色 | RGB(255, 255, 0) |
| 薄い赤 | RGB(255, 200, 200) |
| 薄い緑 | RGB(200, 255, 200) |
| 薄い青 | RGB(200, 200, 255) |
| オレンジ | RGB(255, 200, 100) |
色の設定方法の詳細は /006 の「RGB値の使い方」を参照。
Q3: 条件付き書式との違いは?
条件付き書式はセルの値が変わると自動的にハイライトが更新される(リアルタイム)。VBAは実行した時点のスナップショット。「毎回の報告時に現状を色付けしたい」ならVBA、「常にリアルタイムで色付けしたい」なら条件付き書式が適している。リアルタイムでの色分けに興味があれば /008 も参考になる。
Q4: 特定の列だけを検索対象にしたい
Set rng = ActiveSheet.UsedRange を Set rng = ActiveSheet.Range("C:C") に変えれば、C列だけを検索できる。複数列なら Range("B:D") のように指定する。
Q5: ハイライト結果を上司にPDFで送りたい
ハイライトした状態でPDF化すれば、色付きのまま保存できる。PDF一括変換の方法は /011 を参照。メールで送りたい場合は /007 も参考になる。
—
まとめ
この記事で、特定の文字列を含むセルを一括でハイライトできるようになった。
- 最小版:指定文字列を含むセルの背景色を黄色に変更(コード書き換え式)
- 実務版:InputBoxで入力+ハイライトリセット+件数表示
重要なのは、Find の引数(LookAt, LookIn, MatchCase)を毎回明示的に指定すること。Findは前回の検索設定を引き継ぐため、省略すると意図しない結果になる。
関連記事
- セルの背景色・RGBの基本を学びたいなら /006 を参照 — 本記事のコードの土台になっている
- ハイライトした後にPDF化したいなら /011 を参照
- 文字列を一括で置換したいなら /034 を参照
- 正規表現で高度な検索・置換をしたいなら /066 を参照
- セルの値が変わったら自動でハイライトしたいなら /008 を参照
次にやりたくなること
- 文字列を一括置換する方法 — ハイライトした文字列をまとめて別の文字に置き換えたい場合はこちら
- 正規表現で検索・置換する方法 — 「数字3桁+NG」のような複雑なパターンで検索したい場合はこちら
- セルの値に応じて行を自動色分けする方法 — キーワード単位ではなくステータス値で行全体を色分けしたい場合はこちら
- マクロをボタン1つで実行する方法 — 検索ハイライトをボタン化して同僚にも使ってもらいたい場合はこちら
- ExcelファイルをPDFに一括変換する方法 — ハイライト結果をそのままPDFに出力して報告したい場合はこちら
—


コメント