Home » エクセルマクロ・Excel VBAの使い方 » ユーザー定義関数 » RGB値を取得するユーザー定義関数


RGB値を取得するユーザー定義関数

VBAでは各種オブジェクトのColorプロパティを使うことで、オブジェクトの色を表すLong型の数値を取得できます。

これをLong型の数値ではなく、赤・緑・青それぞれの値・RGB値を取得したいということが、結構あります。

「excel2013 vba rgb色取得」
「カラー値からrgbを取得 vba excel2010」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスも時折あります。

VBAのRGB関数に、

RGB値を取得するユーザー定義関数

Red・Green・Blueそれぞれの値を指定することで、各種オブジェクトのColorプロパティに指定するLong値を作れますが、逆の関数は用意されていません。

[スポンサードリンク]

RGB値を取得するユーザー定義関数

そんな、Colorプロパティで取得したようなLong値を、RGB値にするユーザー定義関数を作ってみました。


Function ToRGB(ByVal ColorValue As Long) As String
 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

 ToRGB = r & "," & g & "," & b
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/00FFFFFFFFFF
「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で割った余りを並べるのと同じ考え方です。

関連語句
VBA, Visual Basic for Applications
[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » ユーザー定義関数 » RGB値を取得するユーザー定義関数

TrackBack:0

TrackBack URL

Home » エクセルマクロ・Excel VBAの使い方 » ユーザー定義関数 » RGB値を取得するユーザー定義関数

「ユーザー定義関数」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.