Excelの円グラフや棒グラフを色相環(HLS色空間)を使ってカラフルに塗り分けるExcelマクロを紹介する
はじめに
Excelで円グラフや棒グラフを挿入するとこんな感じの色になる
これを,ワンクリックでこんな感じでカラフルに塗り分けるマクロを紹介する
サンプルファイルのダウンロードはこちら
ColorfulChart.xlsm
それではいってみよう
ソースコードの説明
今回使うソースコードはこれ
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に変換している
Excel VBAにおいて,RGBはLong型の変数として表される
棒グラフと円グラフの違い
棒グラフと円グラフでは色の塗分けられ方のルールが違う
棒グラフでは系列ごとに色が塗り分けられ,円グラフは1つの系列の中の要素ごとに色が塗り分けられている
棒グラフの系列数は.SeriesCollection.Count
で取得できる
一方,円グラフの要素数は.SeriesCollection(1).Points.Count
で取得できる
使い方
カラフルにしたいグラフを選択してアクティブにする
その状態で「Alt+F8」を押してマクロのウィンドウを開き,棒グラフなら「ColorfulColumn」,円グラフなら「ColorfulPie」を選択して「実行」をクリックする
グラフがカラフルになる
色相環の始まりの色を変更する
「Alt+F8」を押してマクロのウィンドウを開き,棒グラフなら「ColorfulColumn」,円グラフなら「ColorfulPie」を選択して「編集」をクリックする
VBEが開くので,Hue
の初期値を変更する
この状態でマクロを実行すると,色相環の始まりの色が変更される(下の画像はHue=127
)
彩度や輝度を変更する
同様に,Saturation
やLuminance
の値を変更すれば彩度や輝度を変更できる
(下の画像はSaturation=255
,Luminance=127
)
おわりに
Excelの円グラフや棒グラフを色相環を使ってカラフルに塗り分けるExcelマクロを紹介した
Microsoftのデフォルトの謎配色が気に入らないときは使ってみてほしい
↓おすすめ記事
コメント