No.017
ColorプロパティとRGB関数について、Color値からRGB、RGBからColor値を求める方法 《Color・RGB関数》
2003/2007/2010/2013/2016/2019
セルの色などの色設定は、VBAの記述では Color プロパティ を使用します。
まずは、Color プロパティ の設定方法をおさらいします。
例えば、セルに塗りつぶしの色を設定する場合
セル参照.Interior.Color = 設定値
となります。
右辺の設定値の書き方にいくつか方法がありますので、以下に箇条書きします。
RGB 関数 については後述、以下、対象セルの塗りつぶしの色に生粋の青を設定する場合です。
- RGB 関数 の答えの値を指定(10進数)...
対象セル.Interior.Color = 16711680 - RGB 関数 をそのまま指定 ...
対象セル.Interior.Color = RGB(0,0,255) - RGB 関数 の答えを指定(&H のあとBGRの順に16進数)...
対象セル.Interior.Color = &HFF0000 - 色を表す定数を指定 ...
対象セル.Interior.Color = vbBlue
セルの色を青に設定するマクロ記録を行うと、1番目の RGB 関数 の答えの値「16711680」が記述されるわけですが、この値がどのようにして求められているのか、まずは RGB 関数 についてご案内します。
<RGB 関数>
RGB 関数 の引数は、順番に赤(R)、緑(G)、青(B)です。
それぞれの引数には 0~255 までの数値を設定します。
上記箇条書きの2番目のような設定です。
セルの色を生粋の青という場合、[塗りつぶしの色] の [その他の色] をクリック、[色の設定]ダイアログ ボックスの [ユーザー設定]タブ にある [赤][緑][青]の値が、順に 0, 0, 255 と設定されている状態です。
この青の場合の RGB 関数 の数値の答えを導く計算式は、次の式となります。
256*256*青の数値 + 256*緑の数値 + 赤の数値
256*256 は、256の2乗で、65536 という値です。したがって、青の場合の計算は
65536*255 + 256*0 + 0 = 16711680
ということなのです。
<Color プロパティ の設定値を求める>
セルに色がもともと設定してあるときに、その色の Color プロパティ の設定値(RGB 関数 の値)を取得したい場合や、同じ色に設定したい場合です。
Color プロパティ は設定と取得が両方できますので、簡単です。
セルA1の塗りつぶしの色の Color プロパティ の設定値を取得するには、
Range("A1").Interior.Color
セルA1の色と同じ色を、セルC1に設定するには、
Range("C1").Interior.Color = Range("A1").Interior.Color
となります。
<Color プロパティ の設定値から RGB を求める>
取得された Color プロパティ の設定値、つまり RGB 関数 の答えから、RGBそれぞれの値を求める式とVBAをご案内します。
例えば、Color プロパティ の設定値が「9051535」となる色の RGB を求めてみます。
RGB 関数 は、
65536*青の数値 + 256*緑の数値 + 赤の数値
の計算値です。
青から順に式で求めていきます。
青 ...= Int(9051535 / 65536) = 138
青は、Color プロパティ の設定値 を 65536 で割り、小数値を切り捨てた値で、今回 138 です。
緑 ...= Int((9051535 - 65536 * 138) / 256) = 29
緑は、Color プロパティ の設定値 から青の値を引き、その値を 256 で割って小数値を切り捨てた値、今回 29 です。
赤 ...= 9051535 - (65536 * 138) - (256 * 29) = 143
赤は、Color プロパティ の設定値 から青の値と緑の値を引いた値、今回 143 となります。
<VBA で選択セルの Color プロパティ の設定値と RGB を取得>
では最後、VBAでご紹介します。
選択しているセルの、塗りつぶしの色の Color プロパティ の設定値(変数 ColNo)と 各R(変数 ColR)G(変数 ColG)B(変数 ColB) の値を各変数に求めます。
各値は今回メッセージ(2回)で表示しています。
Sub sample()
Dim ColNo As Long
Dim ColR As Integer, ColG As Integer, ColB As Integer
ColNo = Selection.Interior.Color
MsgBox "color:" & ColNo
ColB = Int(ColNo / 65536)
ColG = Int((ColNo - 65536 * ColB) / 256)
ColR = ColNo - (65536 * ColB) - (256 * ColG)
MsgBox "赤:" & ColR & " /緑:" & ColG & " /青:" & ColB
End Sub