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
Dim n As Long: n = ColorValue
r = n \ 256 ^ 0 Mod 256
g = n \ 256 ^ 1 Mod 256
b = n \ 256 ^ 2 Mod 256
End Function
赤・緑・青の3つの数値を返す必要があるので、戻り値をどうするのかいくつか方法が考えられます。
配列にして返すのが真面目な作りなようにも思いますが、Excelのワークシートからも使うことを考えると、戻り値が配列になっていると使い辛く、それより何らかの文字で区切られたR・G・Bの値が連結された文字列として返されるほうが、使いやすそうなので、戻り値をR・G・Bそれぞれの値を「,」(カンマ)を区切り文字として連結した文字列としました。
R・G・Bそれぞれの値を取得するロジック
ロジック的には、
r = n \ 256 ^ 0 Mod 256
g = n \ 256 ^ 1 Mod 256
b = n \ 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 = n \ 256 ^ 0 Mod 256
Gの値だけを取り出しているのが、
g = n \ 256 ^ 1 Mod 256
Bの値だけを取り出しているのが、
b = n \ 256 ^ 2 Mod 256
です。
割り算の商・整数部だけを計算する演算子「\」を使った、
「n \ 256 ^ 0」の割り算で、
BとGとRの、0~16,777,215/00FFFF~FFFFFF
「n \ 256 ^ 1」の割り算で、
BとGの、256~16,777,215/00FFFF~FFFFFF
「n \ 256 ^ 2」の割り算で、
Bの、65,536~16,777,215/00FFFF~FFFFFF
を取得して、
演算子「Mod」を使った「〇〇 Mod 256」という、余りだけを求める割り算で、R・G・Bだけのそれぞれの値を取得しています。
この余りを求めるというのは、算数で習った、10進数を2進数にする基数変換を行うときに、2で割った余りを並べるのと同じ考え方です。
Home » エクセルマクロ・Excel VBAの使い方 » ユーザー定義関数 » RGB値を取得するユーザー定義関数
- Newer:条件付き書式が設定されているかをVBAで調べる
- Older:過去の日付かどうかを判定する
TrackBack:0
- TrackBack URL