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

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

この記事でできること

品質管理の台帳で「不良」の文字を毎週探す作業があった。Ctrl+Fで1件ずつ見つけて、手動で背景色を黄色に変えて…を200行の表でやっていた。目がチカチカするし、見落としも怖い。正直しんどかった。

この記事のVBAを使えば、指定した文字列を含むセルを一括で検索してハイライト(背景色を変更)できる。Ctrl+Fで1件ずつ探す必要はない。マクロを実行するだけで、対象セルがすべて黄色になる。

  • 対象:管理表や台帳で特定の文字を探す作業がある人、VBAが初めての人
  • 所要時間:コピペ → 実行まで約5分(目安)

セルの背景色を条件に応じて変える方法の基本は 【VBA】セルの値に応じて行を自動色分けする方法 で解説している。Interior.Color や RGB の使い方が初めてなら先に読んでおくと理解しやすい。


完成イメージ(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)で保存する

  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() の基本は、セルの値に応じて行を自動色分けする方法 で詳しく解説している。


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" が返る仕様のため、この判定で中止を検出している。

注意: ハイライトリセット(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(表示値で検索)を明示的に指定する

FAQ

Q1: 複数の文字列(「不良」と「NG」)を同時に検索したい

最小版のマクロを、検索文字列を変えて2回実行すれば対応できる。自動化するなら、検索キーワードを配列にしてループする方式に拡張する。ココナラで相談を推奨。

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)

色の設定方法の詳細は 【VBA】セルの値に応じて行を自動色分けする方法 の「RGB値の使い方」を参照。

Q3: 条件付き書式との違いは?

条件付き書式はセルの値が変わると自動的にハイライトが更新される(リアルタイム)。VBAは実行した時点のスナップショット。「毎回の報告時に現状を色付けしたい」ならVBA、「常にリアルタイムで色付けしたい」なら条件付き書式が適している。リアルタイムでの色分けに興味があれば 【VBA】セルの値が変わったら自動実行する方法(Worksheet_Change) も参考になる。

Q4: 特定の列だけを検索対象にしたい

Set rng = ActiveSheet.UsedRangeSet rng = ActiveSheet.Range("C:C") に変えれば、C列だけを検索できる。複数列なら Range("B:D") のように指定する。

Q5: ハイライト結果を上司にPDFで送りたい

ハイライトした状態でPDF化すれば、色付きのまま保存できる。PDF一括変換の方法は 【VBA】ExcelファイルをPDFに一括変換する方法 を参照。メールで送りたい場合は 【VBA】ExcelからOutlookメールを自動作成する方法 も参考になる。


まとめ

この記事で、特定の文字列を含むセルを一括でハイライトできるようになった。

  • 最小版:指定文字列を含むセルの背景色を黄色に変更(コード書き換え式)
  • 実務版:InputBoxで入力+ハイライトリセット+件数表示

重要なのは、Find の引数(LookAt, LookIn, MatchCase)を毎回明示的に指定すること。Findは前回の検索設定を引き継ぐため、省略すると意図しない結果になる。

関連記事

次にやりたくなること


もっとカスタマイズしたい場合

「複数キーワードを条件ごとに色分けしたい」「ヒットしたセルの一覧を別シートに出力したい」「ハイライト結果をPDF化して自動送信したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。

相談時に以下の情報があるとスムーズです:

  • Excel のバージョン / OS
  • 検索対象の表の構成(列数・行数の目安)
  • 検索条件(文字列の数、完全一致 or 部分一致)
  • ハイライト後のアクション(PDF化、メール送信など)

あわせて読みたい

コメント

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