和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セルの色分け条件付き書式を自動設定するマクロ

カテゴリや種別が設定されたデータにおいて、
種別ごとに色分けを行いたいことが良くあります。

ポケモンわざタイプ

この着色には条件付き書式を使うのが便利と思いますが、
種別の種類が多くなると設定がかなり面倒です。

今回はこの条件付き書式を自動で設定するマクロを紹介します。

マクロの仕様

まずは画像のように手動でセルの背景色を設定します。
(この時点では条件付き書式ではなく通常書式)

ポケモンわざタイプ


この状態で設定したいセル範囲を選択してマクロを実行すると、

こんな風に値と色を反映した条件付き書式に変換してくれます。
(通常の書式はクリアされます)

あとは設定された条件付き書式をコピーしたり、
設定ウィンドウから範囲を編集して使用してください。


実行型の便利マクロですので、
Excel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。

ショートカットキーに登録したり、ツールバーやリボンにボタン配置すると便利です。

ソースコード

以下のコードはDictionaryを使用していますので、

Option Explicit

' 現在の色設定を条件付き書式化
Sub 選択範囲のセル値と背景色の組を条件付き書式化する()
    
    ' 1.最初に条件付き書式をすべてクリア
    ' 2.条件付き書式を順次設定
    ' というロジックで実行してしまうと、
    ' 「連続実行時に元の書式がすべて消えてしまう」問題が発生してしまう。
    ' (現在の条件付き書式に新たな値と色のペアを追加することができない)
    
    ' これに対応するため、
    ' 1.既存の条件付き書式を残したまま値と表示色の組をDictionaryに登録
    ' 2.書式をすべてクリア
    ' 3.Dictionaryを元に条件付き書式を設定
    ' という手順を踏む
    
    
    ' 値(key)と色(item)の組を記憶するDictionary
    Dim Dic値ごとの色 As Object
    Set Dic値ごとの色 = CreateObject("Scripting.Dictionary")
    
    ' 選択範囲内のすべてのセルをループ
    Dim 選択範囲 As Range: Set 選択範囲 = Selection
    Dim セル As Range
    For Each セル In 選択範囲.Cells
        
        ' 新出のセル値でセル値と表示色の組を記録
        If Dic値ごとの色.Exists(セル.Value) = False And セル.Value <> "" Then
            Dic値ごとの色.Add セル.Value, セル.DisplayFormat.Interior.Color
        End If
    
    Next
            
    ' 条件付き書式・通常書式を共にクリア
    選択範囲.FormatConditions.Delete
    選択範囲.Interior.ColorIndex = 0
            
    ' 記憶した値と色のペアを条件付き書式に設定
    Dim keyセル値
    For Each keyセル値 In Dic値ごとの色.Keys

        With 選択範囲.FormatConditions.Add(xlCellValue, xlEqual, "=""" & keyセル値 & """")
            .Interior.Color = Dic値ごとの色(keyセル値)
        End With
        
    Next

End Sub

解説

条件付き書式の設定は基本コードのため解説は割愛します。

このマクロで気を付けるべき点は連続実行時の対応で、
実行後に新しい値が増えた後、再実行したときのことを考える必要があります。


一度実行すると通常書式が条件付き書式に変わってしまうため、

  1. 最初に条件付き書式をすべてクリア
  2. セルをループして値と背景色の組を条件付き書式として設定

というロジックで組んでしまうと、
初回実行時の書式が二度目の実行ですべて消えてしまいます。


これに対応するために、

  1. 既存の条件付き書式を残したまま、値と表示色の組をDictionaryに登録
  2. 通常書式・条件付き書式をともにすべてクリア
  3. 値と色の組を記憶したDictionaryを元に条件付き書式を設定

というロジックで組んでいます。

こういった「ペアの管理」を行うならDictionaryはすごく便利ですね。


コードをコピペして中身を見ずに使ってももちろんいいですが、
Dictionaryを勉強したい方は参考にしてみてください。