【VBA】特定の文字を含むセルを検索してハイライトする方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク

この記事でできること

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(実行前)

Before(実行前)のExcel画面

「検査結果」列に「不良」が混在しているが、目視では見つけにくい。

A B C
1 製品名 ロット 検査結果
2 部品A L001 良品
3 部品B L002 不良
4 部品C L003 良品
5 部品D L004 不良
6 部品E L005 良品

After(実行後)

After(実行後)のExcel画面

「不良」を含むセル(C3, C5)の背景色が黄色にハイライトされる。

A B C
1 製品名 ロット 検査結果
2 部品A L001 良品
3 部品B L002 不良(背景色:黄色)
4 部品C L003 良品
5 部品D L004 不良(背景色:黄色)
6 部品E L005 良品

実行前の準備

バックアップを取る

対象のExcelファイルをコピーしてバックアップを取ること。ハイライト処理は既存の背景色を上書きするため、元の色付けが消える。

Excelをマクロ有効ブック(.xlsm)で保存する

  1. 対象のExcelファイルを開く
  2. 「ファイル」→「名前を付けて保存」
  3. ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存

.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。

企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。

標準モジュールを挿入する

  1. VBEのメニュー「挿入」→「標準モジュール」をクリック
  2. 右側に白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
  2. コード内の searchWord を自分の検索文字列に書き換える
  3. 検索対象のシートを表示した状態で Alt + F8 を押す
  4. 「HighlightCells」を選択して「実行」
  5. 対象セルがハイライトされ、件数がメッセージボックスに表示される

コード(最小版)– 指定文字を含むセルをハイライト

まずはこれだけで動く。アクティブシートの使用範囲内で、指定した文字列を含むセルの背景色を黄色にする。


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

コードの動作:

  1. searchWord に指定した文字列を Find メソッドで検索(部分一致、大文字小文字無視)
  2. ヒットしたセルの背景色を RGB(255, 255, 0)(黄色)に変更
  3. FindNext で次のヒットに移動し、全件を処理
  4. 最初にヒットしたセルのアドレス(firstAddress)に戻ったらループ終了
  5. ハイライトした件数を表示

Find の引数について:

  • LookIn:=xlValues — 数式ではなく、セルに表示されている値で検索する設定
  • LookAt:=xlPart — 部分一致。セルの値の一部に検索文字列が含まれていればヒット
  • MatchCase:=False — 大文字・小文字を区別しない

検索文字列について: searchWord = "不良" の部分を自分の検索したい文字に書き換える。「NG」「エラー」「未対応」など、業務に合わせて変更する。

自分はこの最小版だけで十分だった。200行の表で「不良」を探すのに10分かかっていたのが、一瞬で終わって拍子抜けした。

コード(実務版)– ハイライトリセット+件数表示+InputBox入力

業務で繰り返し使うなら、前回のハイライトをリセットしてから検索したい、検索のたびにコードを書き換えたくない、という要望がある。InputBoxで検索文字列を入力できる版。

セルの背景色を操作する Interior.ColorRGB() の基本は、/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 の LookAtxlWhole(完全一致)になっている LookAt:=xlPart(部分一致)を明示的に指定する。Find は前回の検索設定を引き継ぐため、毎回指定が必要
3 大文字・小文字が区別されてヒットしない Find の MatchCase がデフォルトで前回の設定を引き継ぐ MatchCase:=False を明示的に指定する
4 既存の背景色がすべて消える 実務版のハイライトリセット(ColorIndex = xlNone)が使用範囲全体に適用されている バックアップを取った上で実行する。元の色を維持したい場合はリセット行を削除する
5 数値を検索してもヒットしない LookInxlFormulas になっている場合、表示形式が異なる数値がヒットしない 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.UsedRangeSet 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 を参照

次にやりたくなること

コメント

タイトルとURLをコピーしました