【初心者向け】VBAで条件によってセルの色を変える方法をわかりやすく解説!

A子さん

売上が80点以上なら緑、それ以下なら色を変えたいんだけど
条件付き書式って限界ない?
VBAとかって難しいのかな…?

Excelの「条件付き書式」は確かに便利です。

基本的な色分けなら、マウス操作だけで十分。手軽に見栄えを整えられるのは大きな強みです。

でも、正直なところ、細かい条件や複雑なルールを設定したいときは、かえってややこしくなることもあります。

そんなとき、VBA(マクロ)を使うと自由自在に色を変えられるのです。

結論:条件付き書式でもできるけど、VBAの方が柔軟で実務向き

たとえば「80点以上なら緑、60~79点なら黄色、それ未満なら赤」といった3段階の条件がある場合を考えてみてください。

条件付き書式で実現しようとすると、ルールを3つ作らなければいけません。

しかも、別のシートで同じ条件を設定したい場合は、また1から設定し直す羽目に。

条件付き書式では限界があります

VBAを使えば、複数条件・複数シート・複数セル範囲にも対応できるため、実務でもかなり活用されています。

目次

Excel関数・条件付き書式での限界を理解する

なぜ条件付き書式が「限界」なのか、具体的に見ていきましょう。

関数では「見た目」の操作ができない

IF関数やVLOOKUP関数といった計算関数は、あくまで「データを計算する」ためのもの。

関数だけでは「セルの背景色を変える」といった見た目の操作はできません

色を付けるなら条件付き書式を使う必要がありますが、そこにも落とし穴があります。

条件付き書式の落とし穴:管理が煩雑になる

条件付き書式は、セル範囲ごとに設定を管理する仕組みです。

3段階の条件なら、3つのルールを1つのセル範囲に設定。

でも複数の範囲に同じルールを適用したいとなると…

コピーして各範囲に貼り付けたり、範囲を指定し直したり。

後から「条件の基準値を80から75に変えたい」となったときは、全ての設定を修正する必要があります。

複数シートなら、シートごとに設定を変更する…。

これ、正直かなり手間です。

複雑な条件では「見た目」と「計算」の連動が難しい

実務では「達成率」「進捗度」「リスクレベル」など、複数の要素を組み合わせた複雑な条件が出てくることも。

例えば「売上が目標の80%以上かつ利益率が15%以上なら緑」みたいな条件があると、条件付き書式だけでは実装が煩雑になります。

VBAなら何が違うのか

一方VBAでは、If文とセルの操作を組み合わせることで、**「条件ごとに色を自動で変更する」**処理が簡単に実現できます。

しかも、一度コードを書いてしまえば、

  • 別のシートでも同じマクロを使える
  • データが増えても、ループ処理で自動対応
  • 条件を変えるなら、コードを1箇所修正するだけ
  • 複雑な条件も、論理的に組み立てられる

条件付き書式では手間がかかる操作が、VBAなら簡潔に実現できるのです。

基本の構文:条件によってセルの色を変える

では、実際にコードを見ていきましょう。

VBAでセルの色を変えるには、Interior.Color というプロパティを使います。

基本的な構文は以下の通り。

If Cells(行, 列).Value >= 条件 Then
    Cells(行, 列).Interior.Color = RGB(赤, 緑, 青)
End If

分解してみます。

  • Cells(行, 列).Value :指定したセルの値を取得
  • If ~ Then :条件判定。条件が真なら中括弧内を実行
  • Interior.Color :セルの背景色を指定
  • RGB(赤, 緑, 青) :RGB値で色を指定。0~255の数値を使う
  • End If :条件判定の終わり

例えば、A2セル(行=2、列=1)に入っている値が80以上なら緑にしたい場合は以下のように書きます。

If Cells(2, 1).Value >= 80 Then
    Cells(2, 1).Interior.Color = RGB(0, 255, 0) ' 緑
End If

コメント(シングルクォート以降)は説明用なので、実際のコードに入れなくても動きます。

実践コード:段階的に色を分ける(ElseIfの活用)

先ほどの例は1つの条件だけでしたが、実務では複数段階の条件が必要です。

80点以上は緑、60~79点は黄色、それ未満は赤、という3段階を実装してみましょう。

このときに使うのが ElseIf という構文です。

If Cells(2, 1).Value >= 80 Then
    Cells(2, 1).Interior.Color = RGB(0, 255, 0) ' 80以上 = 緑
ElseIf Cells(2, 1).Value >= 60 Then
    Cells(2, 1).Interior.Color = RGB(255, 255, 0) ' 60~79 = 黄
Else
    Cells(2, 1).Interior.Color = RGB(255, 0, 0) ' 60未満 = 赤
End If

処理の流れは以下の通り。

  • まず「80以上か?」をチェック。真なら緑にして終了
  • 偽なら「60以上か?」をチェック。真なら黄色にして終了
  • それもまた偽なら、赤にする

「どれか1つの条件に合致したら、その後の条件はチェックしない」という仕組みです。

複数行に対応させるにはループを使う

ここまでは1行だけでしたが、実務ではA2~A11のように10行分の点数が入っていることもあります。

そのとき、1行ずつコードを書くわけにはいきません。

For ~ Next というループ処理を使い、複数行を一括処理します。

Sub 色を変えるテスト()
    Dim i As Integer
    For i = 2 To 11 ' A2〜A11をループ
        If Cells(i, 1).Value >= 80 Then
            Cells(i, 1).Interior.Color = RGB(0, 255, 0) ' 緑
        ElseIf Cells(i, 1).Value >= 60 Then
            Cells(i, 1).Interior.Color = RGB(255, 255, 0) ' 黄
        Else
            Cells(i, 1).Interior.Color = RGB(255, 0, 0) ' 赤
        End If
    Next i
End Sub

コードの構成を説明します。

  • Sub 色を変えるテスト() :マクロの開始宣言
  • Dim i As Integer :ループ用の変数 i を宣言。iはカウンター用
  • For i = 2 To 11 :i を 2 から 11 まで、1ずつ増やしながらループ
  • ループの中身:i の値(2, 3, 4…11)が行番号として使われる
  • Next i :ループの終わり。i を次の値にして、またループ開始に戻る
  • End Sub :マクロの終了

このマクロを実行すれば、A2~A11の各セルが、その値に応じて自動で色分けされます。

実行方法:VBAエディタでコードを入力して実行

このコードを実際に使うには、VBA(マクロ)エディタに入力する必要があります。

  • Excel で Alt + F11 キーを押し、VBAエディタを開く
  • 左側の「プロジェクトエクスプローラー」から、該当するシートを選択
  • 右側のコード入力欄に、上記のコードをコピー&ペースト
  • F5 キーを押すか、ツールバーの「実行」ボタンをクリック

「実行」を押すと、loop処理が走り、A2~A11が瞬時に色分けされます。

色を指定するときの2つの方法:RGBとColorIndex

VBAでセルの色を指定するには、主に2つの方法があります。

方法書き方の例特徴
ColorIndexInterior.ColorIndex = 3Excelのパレット番号で指定。1~56番。シンプルだが色の選択肢が限定される
RGBInterior.Color = RGB(255, 0, 0)Red・Green・Blueの3色成分(0~255)で自由に色を指定。1600万色以上から選べる

RGBの方が実務では使いやすい

初心者には、RGBのほうが圧倒的におすすめです。

ColorIndexはパレット番号を覚える必要がありますが、RGBなら「赤は(255, 0, 0)」「緑は(0, 255, 0)」「青は(0, 0, 255)」と論理的です。

また、デザイナーが「RGB(200, 100, 50)の色にしてほしい」と指示してくれることもあるので、RGBで指定できると実務でも重宝します。

よく使う色のRGB値リファレンス

参考までに、実務でよく使う色をまとめました。

RGB値16進法
RGB(255, 0, 0)#FF0000
RGB(0, 255, 0)#00FF00
RGB(0, 0, 255)#0000FF
RGB(255, 255, 0)#FFFF00
オレンジRGB(255, 165, 0)#FFA500
薄い緑RGB(144, 238, 144)#90EE90
薄い赤RGB(255, 192, 203)#FFC0CB
薄い黄RGB(255, 255, 153)#FFFF99
グレーRGB(128, 128, 128)#808080
RGB(255, 255, 255)#FFFFFF
RGB(0, 0, 0)#000000

Webで「RGB 色 一覧」と検索すれば、もっと詳しいリファレンスも見つかります。

よくあるつまずきポイントと解決方法

エラー①:「Cells」という名前が認識されない

最も多いのが、VBAエディタにコードを入力してから、実行時に「Cells が認識されていません」というエラーが出ることです。

これは通常、スクリプトエディタではなく、VBAエディタに正しく入力されていないか、あるいはプロジェクトが閉じられている場合に起こります。

解決方法:VBAエディタを開く際に、対象のシート・ブックがアクティブになっていることを確認してください。

エラー②:色が想定と違う、または反映されない

実行後、セルに色が付かないか、RGB値と異なる色が付く場合があります。

原因は複数考えられます。

  • Interior.Color ではなく Interior.ColorIndex を使っている(ColorIndexは別の色体系)
  • RGB値の入力範囲が0~255の範囲外
  • セル範囲の指定(行や列の番号)が間違っている
  • ループの開始・終了行が間違っていて、対象外のセルに処理がいっている

解決方法:まずは1行だけ(例:A2)でコードをテストし、色が正しく反映されることを確認してから、ループ処理に拡張する。

エラー③:条件判定がおかしい(想定と違う色が付く)

80以上を指定したのに、80が黄色になってしまう、といったケースです。

よくあるのは以下の原因。

  • ElseIf の順序が逆(大きい値から小さい値へチェックする順になっていない)
  • >=(以上)と >(より大きい)を混同している
  • Cells(i, 1).Value が数値ではなくテキストとして認識されている

解決方法:デバッグ用に MsgBox を使って、実際の値を確認する。

MsgBox "A2の値は " & Cells(2, 1).Value & " です"

このコードを入力して実行すれば、Excelが値をポップアップで表示してくれます。

エラー④:大量データで処理が重くなる

1000行以上のデータを処理する場合、VBAが重くなることがあります。

これはセルを1つずつ処理しているため、ループが長くなるのが原因です。

解決方法:画面更新を一時的に無効化する。

Sub 色を変えるテスト()
    Application.ScreenUpdating = False ' 画面更新をOFF
    
    Dim i As Integer
    For i = 2 To 1001
        If Cells(i, 1).Value >= 80 Then
            Cells(i, 1).Interior.Color = RGB(0, 255, 0)
        ElseIf Cells(i, 1).Value >= 60 Then
            Cells(i, 1).Interior.Color = RGB(255, 255, 0)
        Else
            Cells(i, 1).Interior.Color = RGB(255, 0, 0)
        End If
    Next i
    
    Application.ScreenUpdating = True ' 画面更新をON
End Sub

Application.ScreenUpdating = False とすると、処理中は画面が更新されず、マクロが数倍高速化されます。

条件付き書式とVBAの使い分け

ここまで「VBAの方が優れている」と説明してきましたが、実務では「条件付き書式を使うべき場面」も確かにあります。

判断ポイント条件付き書式を使うVBAを使う
設定難度簡単(マウス操作のみ)少し難しい(コーディング必要)
条件の複雑さ2~3段階程度なら楽複雑な条件でも対応可
複数シートへの適用毎回マニュアル設定1回のマクロで対応
リアルタイム自動更新データ入力時に自動反映マクロ実行時のみ反映
保守性後から条件を変えるのが面倒コード修正で一括対応
他のユーザーへの共有ファイルをコピーするだけマクロ有効化が必要

条件付き書式でいい場合

  • 単純な2段階くらいの色分けで十分
  • そのシート内だけの使用で、他に応用しない
  • データを入力するたびに、自動でリアルタイムに色が変わってほしい
  • 非技術者も含む複数人で共有するファイル

VBAを使うべき場合

  • 3段階以上の複雑な条件がある
  • 複数シート、複数ファイルで同じルールを適用したい
  • 条件を後から修正する可能性が高い
  • 「売上が目標の80%以上かつ利益率15%以上」みたいに、複数要素の組み合わせが必要
  • 大量のデータを一括処理したい

実務での活用シーン

VBAでの色分け処理は、意外と多くの業務で活躍しています。

シーン①:売上管理表での達成度表示

営業部門の日報・月報では、「目標達成率が100%以上なら緑、80%以上なら黄、それ未満なら赤」という3段階の色分けがよく使われます。

毎月新しいシートを作成する場合、マクロなら1クリックで全て色分けされるので、手作業で条件付き書式を設定し直す必要がありません。

シーン②:リスク管理シートでの優先度表示

プロジェクト管理で「リスクレベル(高・中・低)」と「発生確率(高・中・低)」を組み合わせて、セルの色を決めることがあります。

これは「両方とも高」なら赤、「どちらか一方が高」なら橙、「どちらも低」なら緑、といった複雑な条件になります。

条件付き書式ではかなり複雑になりますが、VBAなら And・Or といった論理演算子を使って、シンプルに実装できます。

シーン③:品質管理での不良品フラグ

製造業の品質管理では、測定値が規格範囲内か外かで色分けするケースがあります。

データが数千行になることもあるため、手動の色分けは非現実的。

VBAなら一度マクロを作ればあとは自動。また、規格値が変わったときも、コードを1行修正するだけです。

さらに踏み込んだ活用:フォント色も変える

ここまではセルの背景色(Interior.Color)を扱いましたが、文字色(フォント色)も同時に変えたい

例えば「緑の背景に白い文字」「赤の背景に白い文字」といった、背景色と文字色の組み合わせです。

その場合は Font.Color というプロパティを追加します。

If Cells(i, 1).Value >= 80 Then
    Cells(i, 1).Interior.Color = RGB(0, 255, 0) ' 背景を緑に
    Cells(i, 1).Font.Color = RGB(255, 255, 255) ' 文字を白に
ElseIf Cells(i, 1).Value >= 60 Then
    Cells(i, 1).Interior.Color = RGB(255, 255, 0) ' 背景を黄に
    Cells(i, 1).Font.Color = RGB(0, 0, 0) ' 文字を黒に
Else
    Cells(i, 1).Interior.Color = RGB(255, 0, 0) ' 背景を赤に
    Cells(i, 1).Font.Color = RGB(255, 255, 255) ' 文字を白に
End If

背景色と文字色を組み合わせると、視認性がぐんと上がります。

「何が重要で、何が正常か」がパッと見で判断できるデータシートになるのです。

Border(枠線)も一緒に変えて、さらに見やすく

色分けに加えて、枠線も変えるとさらに洗練された見た目になります。

例えば「重要度の高い行は太い枠線」「低い行は細い枠線」といった設定ができます。

With Cells(i, 1).Borders
    .LineStyle = xlContinuous ' 連続線
    .Weight = xlMedium ' 太さ:中
    .Color = RGB(255, 0, 0) ' 赤色の枠線
End With

このコードを条件判定の中に組み込めば、色分けと枠線設定が同時に実行されます。

ただし、枠線設定は処理が重くなりやすいので、大量データの場合は注意が必要。

まとめ:VBAでの色分けが実務の現場で活躍する理由

ここまで見てきた通り、VBAを使った条件付きの色分け処理は、実務では本当に活躍します。

  • Excelの条件付き書式では実現できない複雑な条件に対応できる
  • 一度コードを書けば、複数シート・複数ファイルで再利用できる
  • If 文+Interior.Color を使えば簡単に実装できる
  • 大量データでも自動処理でき、手作業のミスが減る
  • 後から条件を変えるのも簡単(コードを修正するだけ)
  • 背景色、文字色、枠線など、複数の書式を同時に指定できる

「データの傾向をパッと見で把握したい」という、ビジネスの現場で最も多い要望に対して、VBAはこれ以上ないほど有効な答えなのです。

難しく感じるかもしれませんが、基本の構文を理解すれば、実務レベルなら十分実装できます。

まずは簡単な例(1セルだけ色を変える)から始めて、徐々に複雑な条件に進んでいく。

その過程で、VBAの奥深さと可能性が見えてくるはずです。

関連記事

条件を設ける上でIf文かSelectCase文を理解する事は優先されます。

繰り返し処理をする場合はDo While文 For文の知識が必要になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

かもろぐ屋へようこそ。

Microsoft製品が大好きな現役社内SEです。
本業では、業務改善・運用・トラブル対応・効率化など、いわゆる「社内の困った」を何でも屋のように対応しています。

このブログでは主に、

VBA
Power Apps
AI

について、実体験ベースで発信しています。

特に最近は、AIを使ったアプリ開発やブログ運営の自動化にハマっています。
「AIがあれば簡単に作れる」と思って始めた結果、普通に壊れたり、詰んだり、課金したりしながら泥臭く進めています。

キラキラした成功談というより、

「実際どうだったのか」
「どこで詰まったのか」
「初心者でも本当にできるのか」

を、できるだけリアルに残すタイプのブログです。

なお、絶賛婚活中です。

コメント

コメントする

CAPTCHA


目次