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つの方法があります。
| 方法 | 書き方の例 | 特徴 |
|---|---|---|
ColorIndex | Interior.ColorIndex = 3 | Excelのパレット番号で指定。1~56番。シンプルだが色の選択肢が限定される |
RGB | Interior.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文の知識が必要になります。





コメント