エクセル雑感
マクロ記録での色のマイナス数値について

ExcelマクロVBAとエクセル関数についての私的雑感
最終更新日:2020-06-16

マクロ記録での色のマイナス数値について


ツイッターで出したVBAのお題です。
マクロの記録で文字色などの色を指定するとマイナス数値で記録される場合がありますが、このマイナス数値は何かを問う問題です。


お題のツイート

https://twitter.com/yamaoka_ss/status/1272119270026051587

【エクセル問題】
マクロの記録で文字色を指定するとマイナス数値で記録される場合があります。
黄色の場合 -16711681 と記録されます。
しかしVBAのRGB関数では、
黄色は、RGB(255,255,0)=65535
では問題です。
RGBの値から -16711681 これを算出してください。
※シート関数、VBAどちらでも可

VBA マクロ 色 マイナス数値

問題の回答と解説

以下のツイートからの一連のスレッドで解説しています。

https://twitter.com/yamaoka_ss/status/1272174665360830464

Colorのマイナス数値を算出する前に、
RGB関数を説明する必要がありそうです。
RGB関数を説明するには必然的に16進数の説明も入ってきます。
では順に説明します。


RGB関数は、
引数(Red,Green,Blue)の色のRGB値を長整数(Long)で返します。
黒:RGB(0,0,0) … 0
赤:RGB(255,0,0) … 255
緑:RGB(0,255,0) … 65280
青:RGB(0,0,255) … 16711680
白:RGB(255,255,255) … 16777215
RGBの引数の後ろの方が数値が大きくなります。


VBAで、
10進数を16進数にする場合は、Hex関数を使います。
16進数を10進数にする場合は、&Hに続けて16進数を指定します。
イミディエイトで、
?Hex(255) → FF
?&HFF ・・・ 255
8進数は、OCT関数と&Oです。
2進数は、&Bですが関数はありません。
シート関数のDec2Binは511までしか使えません。
追加説明


関数名 機能
BIN2DEC 2 進数を 10 進数に変換します
BIN2HEX 2 進数を 16 進数に変換します
BIN2OCT 2 進数を 8 進数に変換します
OCT2BIN 8 進数を 2 進数に変換します
OCT2DEC 8 進数を 10 進数に変換します
OCT2HEX 8 進数を 16 進数に変換します
DEC2BIN 10 進数を 2 進数に変換します
DEC2HEX 10 進数を 16 進数に変換します
DEC2OCT 10 進数を 8 進数に変換します
HEX2BIN 16 進数を 2 進数に変換します
HEX2DEC 16 進数を 10 進数に変換します
HEX2OCT 16 進数を 8 進数に変換します

RGB関数を&Hで表すと、
赤:RGB(255,0,0) → &H0000FF
緑:RGB(0,255,0) → &H00FF00
青:RGB(0,0,255) → &HFF0000
白:RGB(255,255,255) → &HFFFFFF
RGBの順番が逆になるのでちょっと混乱しやすいです。
これは3バイトの数値で表していることになります。


VBAのIntegerは2バイト、Longは4バイト、
3バイト数値はありません。
RGB関数の戻り値はLongなので4バイトです。
つまり上位の1バイトが使われていません。
4バイトのうちの3バイトしか使っていません。
RGB関数は上位の1バイト00として10進数値を返しています。
RGB(255,255,255) → &H00FFFFFF


Longの範囲は、-2,147,483,648 ~ 2,147,483,647
-2,147,483,648は、&H80000000
2,147,483,647は、&H7FFFFFFF
大小が逆転しているように見えますが、これは、
&H00000000~&H7FFFFFFFが正数
&H80000000~&HFFFFFFFFが負数
追加説明
4バイト数値を2進数にした時、最上位(一番左)ビットが1の場合がマイナスになります。
(2バイト数値の場合も考え方は同じです。)
&H7FFFFFFF → 0111 1111 1111 1111 1111 1111 1111 1111 → 2147483,647
&H7FFFFFFE → 0111 1111 1111 1111 1111 1111 1111 1110 → 2147483,646
・・・
&H00000010→0000 0000 0000 0000 0000 0000 0000 0010 → 2
&H00000001→0000 0000 0000 0000 0000 0000 0000 0001 → 1
&H00000000→0000 0000 0000 0000 0000 0000 0000 0000 → 0
&HFFFFFFFF → 1111 1111 1111 1111 1111 1111 1111 1111 → -1
&HFFFFFFFE → 1111 1111 1111 1111 1111 1111 1111 1110 → -2
・・・
&H80000001 → 1000 0000 0000 0000 0000 0000 0000 0001 → -2147483647
&H80000000 → 1000 0000 0000 0000 0000 0000 0000 0000 → -2147483648
最上位ビットは符号に使われるので、4バイトで表せる数値は2^31という事になります。

データ型 格納できる範囲
Integer -32,768 ~ 32,767
Long -2,147,483,648 ~ 2,147,483,647
LobgLong -9223372036854775808 ~ 9223372036854775807

Hex関数や&Hでは、Longの範囲までしか対応されません。
LongLongの範囲は対応されていません。

なんとなく見えてきたでしょうか。
黄色は、
RGB(255,255,0) → &H00FFFF → 65535
&HFF00FFFF → -16711681
この数値がマクロ記録の数値です。
VBAで黄色を設定する場合は、
vbYellow
65535
RGB(255,255,0)
&H00FFFF
&HFF00FFFF
-16711681
どれでも黄色になります。


定数 RGB 16進
vbBlack 0,0,0 &H0
vbRed 255,0,0 &HFF
vbGreen 0,255,0 &HFF00
vbBlue 0,0,255 &HFF0000
vbYellow 255,255,0 &HFFFF
マゼンタ vbMagenta 255,0,255 &HFF00FF
シアン vbCyan 0,255,255 &HFFFF00
vbWhite 255,255,255 &HFFFFFF

Colorプロパティの設定値一覧
塗りつぶし、文字色、等々の色指定は結構悩ましいものがあります、Excel2003までなら、ColoIndexで56色だけだったので簡単でしたが、Excel2007以降は、フルカラーがつかえるようになった為、色指定が悩ましくなりました。Colorプロパティに設定する色定数について、色見本とともに一覧にまとめておきます。


マクロ記録でマイナス数値になった場合、
例えば、
その他の色で(200,200,200)これで記録すると、
-3618616
イミディエイトで、
?Hex(-3618616) → FFC8C8C8
先頭のFFは消してしまいましょう。
&HC8C8C8
または2桁ずつ10進にして、
?&HC8=200
RGB(200,200,200)
このように書き換えられます。
追加解説
「その他の色」→「ユーザー設定で、RGB(100,150,200)これで記録すると、
-3618616
イミディエイトで、
?Hex(-3618616) → FFC89664
先頭のFFは消してしまいましょう。
&C89664
または2桁ずつ10進にして、
?&HC8=200
?&H96=150
?&H64=100
RGB(100,1500,200)
16進とRGBの順番が逆になるので注意してください。


説明は以上です。
参考の回答数式としては、
R:A2=255
G:B2=255
B:C2=0
=(C2*256^2+B2*256+A2)-(256^3)=-16711681
()は無くて良いですが見やすいように付けてみました。
以上で解説は終わりです。
追加解説
BITORを使いたいところですが、BITORの引数には正数しか指定できません。

VBAのOrは、ビットOrを求めてくれるので、
?RGB(255,255,0) Or &HFF000000 → -16711681




同じテーマ「エクセル雑感」の記事

IFステートメントの判定
日付の謎:IsDateとCDate
ツイッター投稿用に文字数と特定文字で区切る
マクロ記録での色のマイナス数値について
VBAのString型の最大文字数について
Variantの数値型と文字列型の比較
Variant仮引数にRange.Valueを配列で渡す方法
Variant仮引数のByRefとByValの挙動違い
100桁の正の整数値の足し算
「VBA Match関数の限界」についての誤解
VBAで数値を漢数字に変換する方法


新着記事NEW ・・・新着記事一覧を見る

タプル(tuple型、イミュータブル)|Python入門(9月15日)
リスト(list型、配列)|Python入門(9月14日)
文字列操作(str型)|Python入門(9月13日)
greeenはgreenに、greeeeeNをGReeeeNに変換|エクセル雑感(9月13日)
while文とデバッグ(ステップイン)|Python入門(9月12日)
入力規則で○△を入れる数を制限する方法|エクセル雑感(9月12日)
コレクションの要素を削除する場合|エクセル雑感(9月11日)
for文とイテラブルオブジェクト|Python入門(9月10日)
if文とインデントによるブロック|Python入門(9月9日)
ショートカット(Ctrl+Shift+n)抜け番ばどれだ|エクセル雑感(9月8日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ