【Excel VBA】円グラフや棒グラフを色相環(HLS色空間)でカラフルに塗り分けるマクロ

Excelの円グラフや棒グラフを色相環(HLS色空間)を使ってカラフルに塗り分けるExcelマクロを紹介する

スポンサーリンク

はじめに

Excelで円グラフや棒グラフを挿入するとこんな感じの色になる

これを,ワンクリックでこんな感じでカラフルに塗り分けるマクロを紹介する

サンプルファイルのダウンロードはこちら

それではいってみよう

ソースコードの説明

今回使うソースコードはこれ

HLS色空間を使っている

Sub ColorfulColumn() '棒グラフの色をカラフルに塗り分ける
    Dim Num_Hue As Integer '棒グラフの系列数
    Dim dHue As Integer '色相の変化
    Dim Hue As Integer '色相
    Dim Saturation As Integer '彩度
    Dim Luminance As Integer '輝度
    
    Num_Hue = ActiveChart.SeriesCollection.Count 'アクティブな棒グラフの系列数を取得
    Hue = 0 '色相の初期値を設定
    Saturation = 191 '彩度を設定
    Luminance = 191 '輝度を設定
    dHue = Int(256 / Num_Hue)

    For i = 1 To Num_Hue '系列のループ
        ActiveChart.FullSeriesCollection(i).Select '系列を選択
        With Selection.Format.Fill
            .Visible = msoTrue
            .ForeColor.RGB = HSLtoRGB(Hue, Saturation, Luminance) '塗りつぶしの色をRGBで設定
            .Transparency = 0
            .Solid
        End With
        Hue = Hue + dHue
        If Hue > 255 Then Hue = Hue - 255 '色相が255を超えた場合の処理
    Next i
    
End Sub
Sub ColorfulPie() '円グラフの色をカラフルに塗り分ける
    Dim Num_Hue As Integer '棒グラフの系列数
    Dim dHue As Integer '色相の変化
    Dim Hue As Integer '色相
    Dim Saturation As Integer '彩度
    Dim Luminance As Integer '輝度
    
    Num_Hue = ActiveChart.SeriesCollection(1).Points.Count 'アクティブな棒グラフの要素数を取得
    Hue = 0 '色相の初期値を設定
    Saturation = 191 '彩度を設定
    Luminance = 191 '輝度を設定
    dHue = Int(256 / Num_Hue)

    For i = 1 To Num_Hue '要素のループ
        ActiveChart.FullSeriesCollection(1).Points(i).Select '要素を選択
        With Selection.Format.Fill
            .Visible = msoTrue
            .ForeColor.ObjectThemeColor = msoThemeColorAccent1
            .ForeColor.TintAndShade = 0
            .ForeColor.Brightness = 0
            .Solid
        End With
        With Selection.Format.Fill
            .Visible = msoTrue
            .ForeColor.RGB = HSLtoRGB(Hue, Saturation, Luminance) '塗りつぶしの色をRGBで設定
            .Transparency = 0
            .Solid
        End With
        Hue = Hue + dHue
        If Hue > 255 Then Hue = Hue - 255 '色相が255を超えた場合の処理
    Next i
    
End Sub
Function HSLtoRGB(Hue As Integer, Saturation As Integer, Luminance As Integer) As Long 'HSLをRGBに変換する関数
'https://excelribbon.tips.net/T013535_Converting_HSL_to_RGB.html
'https://www.rapidtables.com/convert/color/hsl-to-rgb.html

    Dim r As Integer
    Dim g As Integer
    Dim b As Integer
    Dim C As Double
    Dim X As Double
    Dim m As Double
    Dim rfrac As Double
    Dim gfrac As Double
    Dim bfrac As Double
    Dim hangle As Double
    Dim hfrac As Double
    Dim sfrac As Double
    Dim lfrac As Double

    If (Saturation = 0) Then
        r = 255
        g = 255
        b = 255
    Else
        hangle = (Hue / 255) * 360
        lfrac = Luminance / 255
        sfrac = Saturation / 255

        C = (1 - Abs(2 * lfrac - 1)) * sfrac
        hfrac = hangle / 60
        hfrac = hfrac - Int(hfrac / 2) * 2 'fmod calc
        X = (1 - Abs(hfrac - 1)) * C
        m = lfrac - C / 2

        Select Case hangle
            Case Is < 60
                rfrac = C
                gfrac = X
                bfrac = 0
            Case Is < 120
                rfrac = X
                gfrac = C
                bfrac = 0
            Case Is < 180
                rfrac = 0
                gfrac = C
                bfrac = X
            Case Is < 240
                rfrac = 0
                gfrac = X
                bfrac = C
            Case Is < 300
                rfrac = X
                gfrac = 0
                bfrac = C
            Case Else
                rfrac = C
                gfrac = 0
                bfrac = X
        End Select

        r = Round((rfrac + m) * 255)
        g = Round((gfrac + m) * 255)
        b = Round((bfrac + m) * 255)
    End If

    HSLtoRGB = RGB(r, g, b)

End Function
HLS色空間とは

HLS色空間(エイチエルエスいろくうかん)とは、色相 (Hue)、彩度 (Saturation)、輝度(Lightness / Luminance または Intensity)の3つの成分からなる色空間HSV色空間によく似ている。 HSL、HSIと呼ばれることもある。

HLS色空間 – Wikipedia

上記の通り,色を色相・彩度・輝度で指定する色空間である

色相は0度から360度までの角度で指定されるので,プログラムで角度を等分して計算すればいい感じのカラフルな色を作ることができる

ただし,Excel VBAではHLSは実装されていないのでHSLtoRGB()という自作関数を使ってHSLをRGBに変換している

HSL to RGB conversion | color conversion
HSL to RGB color space converter and conversion formula.
Converting HSL to RGB
When working with colors in Excel you can specify them using either RGB or HSL values. Converting from HSL to RGB can be a challenge, but the information in thi...

Excel VBAにおいて,RGBはLong型の変数として表される

RGB function (Visual Basic for Applications)
Office VBA reference topic
棒グラフと円グラフの違い

棒グラフと円グラフでは色の塗分けられ方のルールが違う

棒グラフでは系列ごとに色が塗り分けられ,円グラフは1つの系列の中の要素ごとに色が塗り分けられている

https://officetanaka.net/excel/vba/graph/22.htm

棒グラフの系列数は.SeriesCollection.Countで取得できる

一方,円グラフの要素数は.SeriesCollection(1).Points.Countで取得できる

使い方

カラフルにしたいグラフを選択してアクティブにする

その状態で「Alt+F8」を押してマクロのウィンドウを開き,棒グラフなら「ColorfulColumn」,円グラフなら「ColorfulPie」を選択して「実行」をクリックする

グラフがカラフルになる

色相環の始まりの色を変更する

「Alt+F8」を押してマクロのウィンドウを開き,棒グラフなら「ColorfulColumn」,円グラフなら「ColorfulPie」を選択して「編集」をクリックする

VBEが開くので,Hueの初期値を変更する

この状態でマクロを実行すると,色相環の始まりの色が変更される(下の画像はHue=127

彩度や輝度を変更する

同様に,SaturationLuminanceの値を変更すれば彩度や輝度を変更できる

(下の画像はSaturation=255Luminance=127

おわりに

Excelの円グラフや棒グラフを色相環を使ってカラフルに塗り分けるExcelマクロを紹介した

Microsoftのデフォルトの謎配色が気に入らないときは使ってみてほしい

Excelの限界

↓おすすめ記事

コメント

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