- ベストアンサー
色コード 変換の法則を教えてください。
Sub Macro1() MsgBox RGB(255, 0, 0) End Sub Sub Macro2() MsgBox RGB(0, 0, 255) End Sub VBAでMacro1を行うと、255が返るのに Macro2だと16711680が返ってきます。 Macro1は赤でMacro2は青です。 どうしてMacro2は返り値が変わってしまうのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
さらに訂正。 誤) 255 は2進数だと、FF になります。 正) 255は16進数表示だと、FFになります。 2進数表示だと、11111111 RGB(255, 0, 0) → 255 は、 16進数 0000FF 2進数 00000000 00000000 11111111 RGB(0, 0, 255) → 16711680 は、 16進数 FF0000 2進数 11111111 00000000 00000000 これを見たら、なんとなく意味が分かりませんか。
その他の回答 (4)
- cj_mover
- ベストアンサー率76% (292/381)
あ、すみません。#4、cjです。 > 現在、この回答はサポートで内容を確認中です。 > ご迷惑おかけいたしますが、今しばらくお待ちください。 って出ちゃいましたが、引っ掛かっちゃったのは、普通のVBの関数名かな? 困ったものですが、解決をお急ぎなら、飛ばしちゃって構いませんので。 こちらの関知しないこととはいえ、ご迷惑おかけしてすみません。
お礼
先ほどまで「サポートで内容を確認中」になってましたね。 なんだったんでしょうね。
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。 (書いているうちに他の回答がありましたが折角なので、お邪魔します) 色を自在にハンドルしたいのなら16進数の扱いにも慣れておいた方がいいと思いますので 簡単な説明を残しておきます。 まずは実験として以下のコードをお試しください。 Sub Re7765983a() Debug.? "赤 R を 16進長整数で表すと " & "&H0000" & Hex(RGB(255, 0, 0)) Debug.? , "数値に直すと 255 * (256 ^ 0) = " & RGB(255, 0, 0) Debug.? "緑 G を 16進長整数で表すと " & "&H00" & Hex(RGB(0, 255, 0)) Debug.? , "数値に直すと 255 * (256 ^ 1) = " & RGB(0, 255, 0) Debug.? "青 B を 16進長整数で表すと " & "&H" & Hex(RGB(0, 0, 255)) Debug.? , "数値に直すと 255 * (256 ^ 2) = " & RGB(0, 0, 255) End Sub VBE画面から、Ctrl + G キーで表示されるイミディエイトウィンドウで結果を確認して下さい。 こんな結果が表示されます。 赤 R を 16進長整数で表すと &H0000FF 数値に直すと 255 * (256 ^ 0) = 255 緑 G を 16進長整数で表すと &H00FF00 数値に直すと 255 * (256 ^ 1) = 65280 青 B を 16進長整数で表すと &HFF0000 数値に直すと 255 * (256 ^ 2) = 16711680 16進数は、各位 0 から 15 までの数字を"0123456789ABCDEF"で表します。 VBAでは、先頭に "&H" を付加するとそのままLong型の数値として扱うことができます。 &H000000 から &HFFFFFF これが10進数では 0 から 16777215 と同じ意味になります。 色に関しては旧来から、16進長整数で扱うことが多いです。 6桁の16進数を2ケタずつ3つに分けて右(下の位)から、RGBそれぞれの値を入れていきます。 RGBそれぞれの最大値が255であることは、ご承知の通りですが、 16進数2ケタで表せる数値も255です。 255は16進数では FF 半分の128は16進数では 80 1/4の64は16進数では 40 となります。 例えば、 赤を50%、緑を25%、青を100%、 で色を合成したい場合は .Color = &HFF4080 のように指定します。 RGB()関数で同じことをすると .Color = RGB(128, 64, 255) で、順番が逆になります。 逆に.Colorで得られる数値をRGB成分で分けるとなると、 Sub Re7765983b() Dim c&, r&, g&, b& c = &HFF4080 ' = 16728192 = RGB(128, 64, 255) r = c Mod 256 b = c \ 256 ^ 2 g = (c Mod 256 ^ 2 - r) \ 256 End Sub のように求めることになります。 また、10進数を16進数に直すには、 Hex()関数で一旦、16進数の文字列を取得します。 DecNum = 64 s = Hex(DecNum) ' s = "40" 取得しておいた文字列をLong型10進長整数にするには v = CLng("&H" & s) ' CLng("&H40") = 64 のように扱います。 とりあえず、以上です。
お礼
複雑で難しいですが何となくわかりました。ありがとうございました。
- hatena1989
- ベストアンサー率87% (378/433)
前の回答の訂正 誤) RGB(256, 0, 0) は、 0+0*256+255*256*256 → 16711680 正) RGB(0, 0, 256) は、 0+0*256+255*256*256 → 16711680
お礼
NO3にてお礼をします。
- hatena1989
- ベストアンサー率87% (378/433)
R+G×256+B× 256×256 という計算をしています。 RGB(255, 0, 0) は、 255+0*256+0*256*256 → 256 RGB(256, 0, 0) は、 0+0*256+255*256*256 → 16711680 です。 255 は2進数だと、FF になります。
お礼
NO3にてお礼をします。
お礼
計算してみたら納得しました。ありがとうございました。