RGB値と整数値を相互変換

中級VBA

Interior.Color プロパティとRGB関数

 Rangeのプロパティである Interior.Color はRGB関数を使って設定する事ができます。
 セルの背景色を設定できる Interior.Color はシート上でセルの背景色を変更した場合でも値を取得するのに便利です。
 マクロの記録では、 Interior.Color の整数値は取得できますが、RGB関数の赤、緑、青のそれぞれの値を得る事はできません。

RGB関数が出力する整数値

 RGB関数は赤、緑、青の3つの値をそれぞれ 0~225 で設定します。
 結果は以下のような式で計算されて出力されます。

  R値G値×256B値×256×256

Interior.Color の整数値からR,G,B値を取得

 上記で得られた1つの整数値からR,G,B値をそれぞれ取得するには以下のようなプロシージャが考えられます。

'RGB値を得る
Function getR(ByVal cNum As Long) As Long
    getR = cNum Mod 256
End Function

Function getG(ByVal cNum As Long) As Long
    getG = Int(cNum / 256) Mod 256
End Function

Function getB(ByVal cNum As Long) As Long
    getB = Int(cNum / 256 / 256)
End Function

 これらのプロシージャは引数にInterior.Color の値を入れるとR,G,B値を得る事ができます。
 あるセル(A1)に設定された背景色をRGB値で取得するには以下のようにします。

Sub testColor()
    Dim cNum As Long
    cNum = Range("A1").Interior.Color
    Range("A1") = getR(cNum) & "," & getG(cNum) & "," & getB(cNum)
End Sub

Interior.Color で「塗りつぶしなし」は設定できない

 Interior.Colorでは、16777216色(256の3乗)が指定できます。ただし「塗りつぶしなし」の指定はできませんので注意が必要です。
 「塗りつぶしなし」の指定は、Rangeのプロパティである、Interior.ColorIndex を使います。こちらは56色の指定しかできませんが、その他に「塗りつぶしなし」の指定ができます。


 「塗りつぶしなし」を指定するには以下のようにします。

 Range("A1").Interior.ColorIndex = xlNone

 xlNone は定数で、を指定しても同じです。
 Interior.Colorで「塗りつぶしなし」を指定することはできませんが、セルの背景色を取得すると 16777215 が得られます。これは RGB(255,255,255) と同じで「白」を取得したのと同じです。

 ただし、あくまで「白」と「塗りつぶしなし」は別物になりますので注意してください。

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