VBAでは各種オブジェクトに用意されているColorプロパティを使うことで、オブジェクトの色を表すLong型の数値を取得できます。
これをLong型の数値ではなく、赤・緑・青それぞれの値・RGB値を取得したいということが、結構あります。
「excel2013 vba rgb色取得」
「カラー値からrgbを取得 vba excel2010」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスも時折あります。
VBAのRGB関数に、
Red・Green・Blueそれぞれの値を指定することで、各種オブジェクトのColorプロパティに指定するLong値を作れますが、逆の関数は用意されていません。
RGB値を取得するユーザー定義関数
そんな、Colorプロパティで取得したようなLong値を、RGB値にするユーザー定義関数を作ってみました。
Dim r As Byte, g As Byte, b As Byte
r = ColorValue \ 256 ^ 0 Mod 256
g = ColorValue \ 256 ^ 1 Mod 256
b = ColorValue \ 256 ^ 2 Mod 256
End Function
赤・緑・青の3つの数値を返す必要があるので、戻り値をどうするのかいくつか方法が考えられます。
配列にして返すのが真面目な作りなようにも思いますが、Excelのワークシートからも使うことを考えると、戻り値が配列になっていると使い辛く、それより何らかの文字で区切られたR・G・Bの値が連結された文字列として返されるほうが、使いやすそうなので、戻り値をR・G・Bそれぞれの値を「,」(カンマ)を区切り文字として連結した文字列としました。
R・G・Bそれぞれの値を取得するロジック
ロジック的には、
r = ColorValue \ 256 ^ 0 Mod 256
g = ColorValue \ 256 ^ 1 Mod 256
b = ColorValue \ 256 ^ 2 Mod 256
の部分が、ポイントです。
Windows上の色は、R・G・Bそれぞれに8ビット(10進数の0~255、16進数の00~FF)を割り当てた合計24ビットを使って表現できます。
この値がリトルエンディアンで「B・G・R」の順に、
bbbbbbbb gggggggg rrrrrrrr(1文字が1ビットを表しています)
と、並んでいます。
10進数と16進数で見ると、
Rには 0~255/000000~0000FF
Gには 256~65,535/0000FF~00FFFF
Bには 65,536~16,777,215/00FFFF~FFFFFF
といった数値が、それぞれ割り当てられています。
この数値の並びから、
Rの値だけを取り出しているのが、
r = ColorValue \ 256 ^ 0 Mod 256
Gの値だけを取り出しているのが、
g = ColorValue \ 256 ^ 1 Mod 256
Bの値だけを取り出しているのが、
b = ColorValue \ 256 ^ 2 Mod 256
です。
割り算の商・整数部だけを計算する演算子「\」を使った、
「ColorValue \ 256 ^ 0」の割り算で、
BとGとRの、0~16,777,215/00FFFF~FFFFFF
「ColorValue \ 256 ^ 1」の割り算で、
BとGの、256~16,777,215/00FFFF~FFFFFF
「ColorValue \ 256 ^ 2」の割り算で、
Bの、65,536~16,777,215/00FFFF~FFFFFF
を取得して、
演算子「Mod」を使った「〇〇 Mod 256」という、余りだけを求める割り算で、
r = ColorValue \ 256 ^ 0 Mod 256
g = ColorValue \ 256 ^ 1 Mod 256
b = ColorValue \ 256 ^ 2 Mod 256
R・G・Bだけのそれぞれの値を取得しています。
この余りを求めるというのは、(算数で習った)10進数を2進数にする基数変換を行うときに、2で割った余りを並べるのと同じ考え方です。
最終更新日時:2023-04-04 04:26
- Newer:条件付き書式が設定されているかをVBAで調べる
- Older:過去の日付かどうかを判定する
Home » エクセルマクロ・Excel VBAの使い方 » ユーザー定義関数 » RGB値を取得するユーザー定義関数