青 + 黄 = 緑色?(失敗談)

セルやフォントに着色する際、手っ取り早く「色定数(ColorConstants)」で指定する方法がある。
f:id:Infoment:20190716220544p:plain
例えばセルを赤で塗りつぶしたい場合、本来なら

Selection.Interior.Color = 255

となるところ、Excelが準備してくれている定数を用いることで、このような記述が可能になる。

Selection.Interior.Color = vbRed

vbRed=255と予め設定されているため、コードを読んでいても「赤色だね」と直感的に理解することが出来て大変便利だ。

他にXlRgbColorというものもあって、こちらは更に多くの色が準備されている。
f:id:Infoment:20190716221024p:plain

今回は簡単のため、種類の少ない色定数で話をする。
まず、メンバーと値と色の関係は下表のとおり。

メンバー   値     色  
vbBlack 0
vbBlue 16711680
vbCyan 16776960
vbGreen 65280
vbMagenta 16711935
vbRed 255
vbWhite 16777215
vbYellow 65535

このままの値だと分かりにくいので、赤と緑と青の成分に分けて表示してみる。
なお、計算式は、過去に扱ったものを引っ張り出して使ってみた。
infoment.hatenablog.com

Enum myColorIndex
    ciR = 1
    ciG
    ciB
End Enum

Function GetRGBInfo(target_range As Range, color_index As myColorIndex) As Long
    Dim tempColor(myColorIndex.ciR To myColorIndex.ciB)
    Dim myColor As Long
        myColor = target_range.Interior.Color
        tempColor(ciR) = myColor Mod 256
        tempColor(ciG) = ((myColor - tempColor(ciR)) / 256) Mod 256
        tempColor(ciB) = (myColor - tempColor(ciR) - 256 * tempColor(ciG)) / 256 ^ 2
        
    GetRGBInfo = tempColor(color_index)
End Function

これを用いて求めた結果が ↓ こちら。

メンバー   値     色   R G B
vbBlack 0 0 0 0
vbBlue 16711680 0 0 255
vbCyan 16776960 0 255 255
vbGreen 65280 0 255 0
vbMagenta 16711935 255 0 255
vbRed 255 255 0 0
vbWhite 16777215 255 255 255
vbYellow 65535 255 255 0

ここで面白い(と思った)のが、各色定数は数値なのだから、足し算が可能ということ。例えば、このように「青+黄」という記述が可能だ。

Sub test()
    Selection.Interior.Color = vbBlue + vbYellow
End Sub

これが絵具なら、青に黄を混ぜれば緑色になる。しかし先ほどの表にあるように、青と黄を足せば R=G=B=255 となって、vbWhite つまり白色になってしまう。光の三原色なのだから、当たり前と言えば当たり前なのだが、絵具感覚で色の足し算をすると全く違う色になってしまうので注意が必要だ。

ところで、つい最近までこれを(絵具のようになると)勘違いしていたのは誰?
はい、それは私です。

参考まで。