和風スパゲティのレシピ

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

セルの値ごとにセルを色分けする - Select Case

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

ポケモンわざタイプ

この背景色を自動で設定する方法となると、
条件付き書式を設定するのが第1候補になりますね。


しかし種別が多くなると条件付き書式は設定が面倒で、
コピー時の挙動や増殖問題、再計算の重さもネックになります。


ということで、今回は条件付き書式を使用せず、マクロで対応する方法を解説します。

セルの値変更を検知して自動で背景色を設定する

まずは「セルの値変更を検知して自動で着色する」マクロを紹介します。

セルの値変更を検知するイベントプロシージャ、
Worksheet_Changeイベントを使用します。

ソースコード(対象のシートモジュールに記載)

' セルの値変更時のイベント
Private Sub Worksheet_Change(ByVal Target As Range)
    
    ' 着色処理を行うセル範囲の設定
    Dim 対象セル範囲 As Range
    Set 対象セル範囲 = Range("C:C")
    
    ' 値の変更があったセルとの重複エリアに対して処理
    Dim 着色セル範囲 As Range
    Set 着色セル範囲 = Intersect(Target, 対象セル範囲, Me.UsedRange)
    If 着色セル範囲 Is Nothing Then Exit Sub
    
    ' 処理対象範囲の全セルをループ
    Dim 着色セル As Range
    For Each 着色セル In 着色セル範囲
    
        ' 値ごとに着色
        Select Case 着色セル.Value
            Case "ノーマル": 着色セル.Interior.Color = RGB(153, 153, 153)
            Case "くさ": 着色セル.Interior.Color = RGB(66, 191, 37)
            Case "ほのお": 着色セル.Interior.Color = RGB(253, 99, 42)
            Case "みず": 着色セル.Interior.Color = RGB(42, 145, 254)
            Case "でんき": 着色セル.Interior.Color = RGB(253, 220, 0)
            Case "むし": 着色セル.Interior.Color = RGB(159, 166, 38)
            Case "ひこう": 着色セル.Interior.Color = RGB(153, 202, 254)
            Case "いわ": 着色セル.Interior.Color = RGB(188, 184, 140)
            Case "どく": 着色セル.Interior.Color = RGB(153, 78, 206)
            Case "じめん": 着色セル.Interior.Color = RGB(170, 124, 58)
            Case "こおり": 着色セル.Interior.Color = RGB(69, 215, 254)
            Case "かくとう": 着色セル.Interior.Color = RGB(254, 162, 2)
            Case "エスパー": 着色セル.Interior.Color = RGB(255, 99, 132)
            Case "ゴースト": 着色セル.Interior.Color = RGB(112, 68, 114)
            Case "ドラゴン": 着色セル.Interior.Color = RGB(85, 98, 212)
            Case "あく": 着色セル.Interior.Color = RGB(80, 69, 73)
            Case "はがね": 着色セル.Interior.Color = RGB(107, 175, 209)
            Case "フェアリー": 着色セル.Interior.Color = RGB(253, 177, 255)
            Case "": 着色セル.Interior.ColorIndex = 0
        End Select

    Next
    
End Sub

解説

セルの値変更を検知してマクロを実行するには、
Worksheet_Changeイベントを使用します。


値の変わったセルが引数Targetに格納されていますが、
Targetにはセル範囲が入っている可能性もあります。

事前にTargetと着色対象範囲の重複部分をIntersectで取得しておき、
対象のセルをFor Eachでひとつずつループして処理してください。

その際、対象シートの使用範囲(UsedRange)もIntersectにセットで渡すことで、
列全体をクリアしたときに処理が重くなる対策もできますので覚えておきましょう。


肝心の色分けはSelect Caseで愚直に分岐しているコードです。

こういった単純かつ数の多い分岐はIfステートだとかなり冗長になります。

Select Caseステートメントを使用するとスッキリ書くことができますので、
しっかり使い分けれるようになっておきましょう。


余談ですが、「:」の後にスペースを挿入できることを利用し、
↓こんな風にインデントをそろえることができます。
コードインデント

等幅フォントにしないとできないことなのですが、
設定するとかなりコードが見やすくなります。
(ブラウザは等幅フォントに出来ないため本記事では設定していません)

気に入ったら等幅フォントとセットで採用してみてください。

色の指定方法とコードの生成

Select Case 内で指定している各色の指定方法には、
以下の3つの方法があります。

お好きな方法を採用してください。

RGB値(255, 255, 255)

※ 冒頭で紹介したコードと同じものです。

' 値ごとに着色
Select Case 着色セル.Value
    Case "ノーマル": 着色セル.Interior.Color = RGB(153, 153, 153)
    Case "くさ": 着色セル.Interior.Color = RGB(66, 191, 37)
    Case "ほのお": 着色セル.Interior.Color = RGB(253, 99, 42)
    Case "みず": 着色セル.Interior.Color = RGB(42, 145, 254)
    Case "でんき": 着色セル.Interior.Color = RGB(253, 220, 0)
    Case "むし": 着色セル.Interior.Color = RGB(159, 166, 38)
    Case "ひこう": 着色セル.Interior.Color = RGB(153, 202, 254)
    Case "いわ": 着色セル.Interior.Color = RGB(188, 184, 140)
    Case "どく": 着色セル.Interior.Color = RGB(153, 78, 206)
    Case "じめん": 着色セル.Interior.Color = RGB(170, 124, 58)
    Case "こおり": 着色セル.Interior.Color = RGB(69, 215, 254)
    Case "かくとう": 着色セル.Interior.Color = RGB(254, 162, 2)
    Case "エスパー": 着色セル.Interior.Color = RGB(255, 99, 132)
    Case "ゴースト": 着色セル.Interior.Color = RGB(112, 68, 114)
    Case "ドラゴン": 着色セル.Interior.Color = RGB(85, 98, 212)
    Case "あく": 着色セル.Interior.Color = RGB(80, 69, 73)
    Case "はがね": 着色セル.Interior.Color = RGB(107, 175, 209)
    Case "フェアリー": 着色セル.Interior.Color = RGB(253, 177, 255)
    Case "": 着色セル.Interior.ColorIndex = 0
End Select

カラーコード(#FFFFFF)

' 値ごとに着色
Select Case 着色セル.Value
    Case "ノーマル": 着色セル.Interior.Color = カラーコードをRGB値に変換("#999999")
    Case "くさ": 着色セル.Interior.Color = カラーコードをRGB値に変換("#42bf25")
    Case "ほのお": 着色セル.Interior.Color = カラーコードをRGB値に変換("#fd632a")
    Case "みず": 着色セル.Interior.Color = カラーコードをRGB値に変換("#2a91fe")
    Case "でんき": 着色セル.Interior.Color = カラーコードをRGB値に変換("#fddc00")
    Case "むし": 着色セル.Interior.Color = カラーコードをRGB値に変換("#9fa626")
    Case "ひこう": 着色セル.Interior.Color = カラーコードをRGB値に変換("#99cafe")
    Case "いわ": 着色セル.Interior.Color = カラーコードをRGB値に変換("#bcb88c")
    Case "どく": 着色セル.Interior.Color = カラーコードをRGB値に変換("#994ece")
    Case "じめん": 着色セル.Interior.Color = カラーコードをRGB値に変換("#aa7c3a")
    Case "こおり": 着色セル.Interior.Color = カラーコードをRGB値に変換("#45d7fe")
    Case "かくとう": 着色セル.Interior.Color = カラーコードをRGB値に変換("#fea202")
    Case "エスパー": 着色セル.Interior.Color = カラーコードをRGB値に変換("#ff6384")
    Case "ゴースト": 着色セル.Interior.Color = カラーコードをRGB値に変換("#704472")
    Case "ドラゴン": 着色セル.Interior.Color = カラーコードをRGB値に変換("#5562d4")
    Case "あく": 着色セル.Interior.Color = カラーコードをRGB値に変換("#504549")
    Case "はがね": 着色セル.Interior.Color = カラーコードをRGB値に変換("#6bafd1")
    Case "フェアリー": 着色セル.Interior.Color = カラーコードをRGB値に変換("#fdb1ff")
    Case "": 着色セル.Interior.ColorIndex = 0
End Select

※ 以下の汎用関数を標準モジュールに設置してください。

' カラーコード ⇒ RGB値
Function カラーコードをRGB値に変換(ByVal カラーコード As String) As Long

    ' 7文字なら先頭記号を除去
    If Len(カラーコード) = 7 Then カラーコード = Right(カラーコード, 6)

    カラーコードをRGB値に変換 = RGB("&H" & Left(カラーコード, 2) _
                                  , "&H" & Mid(カラーコード, 3, 2) _
                                  , "&H" & Right(カラーコード, 2))
End Function

定数定義(Enum)

' 値ごとに着色
Select Case 着色セル.Value
    Case "ノーマル": 着色セル.Interior.Color = Colorタイプ.ノーマル
    Case "くさ": 着色セル.Interior.Color = Colorタイプ.くさ
    Case "ほのお": 着色セル.Interior.Color = Colorタイプ.ほのお
    Case "みず": 着色セル.Interior.Color = Colorタイプ.みず
    Case "でんき": 着色セル.Interior.Color = Colorタイプ.でんき
    Case "むし": 着色セル.Interior.Color = Colorタイプ.むし
    Case "ひこう": 着色セル.Interior.Color = Colorタイプ.ひこう
    Case "いわ": 着色セル.Interior.Color = Colorタイプ.いわ
    Case "どく": 着色セル.Interior.Color = Colorタイプ.どく
    Case "じめん": 着色セル.Interior.Color = Colorタイプ.じめん
    Case "こおり": 着色セル.Interior.Color = Colorタイプ.こおり
    Case "かくとう": 着色セル.Interior.Color = Colorタイプ.かくとう
    Case "エスパー": 着色セル.Interior.Color = Colorタイプ.エスパー
    Case "ゴースト": 着色セル.Interior.Color = Colorタイプ.ゴースト
    Case "ドラゴン": 着色セル.Interior.Color = Colorタイプ.ドラゴン
    Case "あく": 着色セル.Interior.Color = Colorタイプ.あく
    Case "はがね": 着色セル.Interior.Color = Colorタイプ.はがね
    Case "フェアリー": 着色セル.Interior.Color = Colorタイプ.フェアリー
    Case "": 着色セル.Interior.ColorIndex = 0
End Select

※ 以下の定数定義を標準モジュールに設置してください。

Public Enum Colorタイプ
    ノーマル = 10066329
    くさ = 2473794
    ほのお = 2778109
    みず = 16683306
    でんき = 56573
    むし = 2533023
    ひこう = 16698009
    いわ = 9222332
    どく = 13520537
    じめん = 3833002
    こおり = 16701253
    かくとう = 172798
    エスパー = 8676351
    ゴースト = 7488624
    ドラゴン = 13918805
    あく = 4801872
    はがね = 13741931
    フェアリー = 16757245
End Enum

この値はRGB値といい、RGB関数が返す値そのままです。

イミディエイトウィンドウに

?RGB(153, 153, 153)

と入力することで入手できます。

あるいはセルの背景色から直接取得することもでき、

?Selection.Interior.Color

としても入手できます。

いずれにせよひと手間かかりますが、
一度定数定義すると以降のメンテナンスや色変更が楽になりますので、
状況に応じて使い分けてください。

ソースコードの生成

上記の色設定はソースコード上で編集してもよいのですが、
ワークシートを用いてコードを生成する方法もあります。

コード生成シート

単に&でつなげただけの関数ですが、
これだけでもかなりメンテナンスが楽になります。


この関数をセットしたファイルをアップしておきますので、
よろしければご活用ください。


色分けCase文コード生成.xlsx(Excelファイルダウンロードリンク)


ちなみに配布ファイルの関数は画像よりちょっと複雑になっていますが、
これは先ほど紹介した「等幅フォントによるインデント揃え」をやっています。

選択範囲に着色を実行するマクロ

イベントプロシージャによる自動着色ではなく、
選択範囲に対して着色を実行するマクロも紹介します。

イベントを使用したくない場合はこちらを使用してください。


ほぼ同じロジックのコードですので解説は割愛します。

Sub 選択範囲のセルを値ごとに色分けする()

    Dim 対象セル範囲 As Range
    Set 対象セル範囲 = Selection
    
    Dim 着色セル As Range
    For Each 着色セル In 対象セル範囲
    
        Select Case 着色セル.Value
            Case "ノーマル": 着色セル.Interior.Color = RGB(153, 153, 153)
            Case "くさ": 着色セル.Interior.Color = RGB(66, 191, 37)
            Case "ほのお": 着色セル.Interior.Color = RGB(253, 99, 42)
            Case "みず": 着色セル.Interior.Color = RGB(42, 145, 254)
            Case "でんき": 着色セル.Interior.Color = RGB(253, 220, 0)
            Case "むし": 着色セル.Interior.Color = RGB(159, 166, 38)
            Case "ひこう": 着色セル.Interior.Color = RGB(153, 202, 254)
            Case "いわ": 着色セル.Interior.Color = RGB(188, 184, 140)
            Case "どく": 着色セル.Interior.Color = RGB(153, 78, 206)
            Case "じめん": 着色セル.Interior.Color = RGB(170, 124, 58)
            Case "こおり": 着色セル.Interior.Color = RGB(69, 215, 254)
            Case "かくとう": 着色セル.Interior.Color = RGB(254, 162, 2)
            Case "エスパー": 着色セル.Interior.Color = RGB(255, 99, 132)
            Case "ゴースト": 着色セル.Interior.Color = RGB(112, 68, 114)
            Case "ドラゴン": 着色セル.Interior.Color = RGB(85, 98, 212)
            Case "あく": 着色セル.Interior.Color = RGB(80, 69, 73)
            Case "はがね": 着色セル.Interior.Color = RGB(107, 175, 209)
            Case "フェアリー": 着色セル.Interior.Color = RGB(253, 177, 255)
            Case "": 着色セル.Interior.ColorIndex = 0
        End Select

    Next

End Sub