どうでもいいプログラム研究所

とある編集者によるIT、Web、ソフトウェア、プログラミングに関する雑記と覚え書き

Excel VBAでセルや文字の色のRGB値を調べる

Excel VBAを使っていると、ColorIndexプロパティやRGB関数を使ってセルや文字の色を指定するシーンは多いと思います。でも、逆にセルや文字から色を調べたいときはどうすればよいでしょうか。

ColorIndexプロパティを使えば色番号は簡単にわかりますが、一方でRGB値をサクッと調べられるプロパティはありません。 そこで、RGB値を調べる方法を以下に記します。

塗りつぶしメニューの色を調べてみる

以下のキャプチャのように、A1セルに「フォント」→「塗りつぶし」のメニュー内で左から5番目にある青色を塗ってみました。試しにこの色のRGB値を調べてみたいと思います。

f:id:tdyu5021:20190504001214j:plain

RGB値をメッセージボックスで表示してみる

早速ですが、以下がこの色のRGBそれぞれの値をMsgboxで表示するコードです(私が考えたものでなく拾い物です)。
(※追記:よりシンプルな方法があるとコメントで指摘されたのでその方法を最後に記します。

Sub Test()

Dim R As Integer
Dim G As Integer
Dim B As Integer
Dim MyColor As Long

MyColor = Range("a1").Interior.Color

R = Val("&H" & Left(Hex(MyColor And 255), 2)) '・・・・・・・①'
G = Val("&H" & Left(Hex(MyColor And (256 ^ 2 - 256 ^ 1)), 2))'・・②'
B = Val("&H" & Left(Hex(MyColor And (256 ^ 3 - 256 ^ 2)), 2))'・・③'
MsgBox "R:" & R & vbCrLf & "G:" & G & vbCrLf & "B:" & B
End Sub

上記を実行すると、

R:68
G:114
B:196 

とメッセージが表示されます。
つまり、このA1のセルの色は、Rが68、Gが114、Bが196ということがわかりました。

結局、RGB値を調べているのは、上記のコードの①~③の部分だけです。
このコードは拾い物なので、私は①~③の中にある数式(?)でなぜRGBのそれぞれの値が導き出せるのかまでは理解していません。

理屈はわからないけど、とりあえずこのコードをコピペすれば使えるので、知らなくても実用には問題はないでしょう。

上記のコードの中の、Hexは10進数を16進数に変換する関数、Valは、引数に文字列をとり、その文字列の中から数値として抜き出せる部分を返すという関数です。いずれも自分はあまり使わない関数で、このコードを見たときに初めて知りました。
この関数ももし機会があれば調べてみたいと思います。

追記:
コメントで指摘がありましたが上記のコードのうち、R、G、Bに値を入れるコードは以下で大丈夫だそうです。

R = MyColor Mod 256
G = Int(MyColor / 256) Mod 256
B = Int(MyColor / 256 / 256)

めちゃくちゃシンプルですね!これでよかったのか・・