マクロ記録での色のマイナス数値について
ツイッターで出したVBAのお題です。
マクロの記録で文字色などの色を指定するとマイナス数値で記録される場合がありますが、このマイナス数値は何かを問う問題です。
お題のツイート
マクロの記録で文字色を指定するとマイナス数値で記録される場合があります。
黄色の場合 -16711681 と記録されます。
しかしVBAのRGB関数では、
黄色は、RGB(255,255,0)=65535
では問題です。
RGBの値から -16711681 これを算出してください。
※シート関数、VBAどちらでも可
問題の回答と解説
RGB関数を説明する必要がありそうです。
RGB関数を説明するには必然的に16進数の説明も入ってきます。
では順に説明します。
引数(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の引数の後ろの方が数値が大きくなります。
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(255,0,0) → &H0000FF
緑:RGB(0,255,0) → &H00FF00
青:RGB(0,0,255) → &HFF0000
白:RGB(255,255,255) → &HFFFFFF
RGBの順番が逆になるのでちょっと混乱しやすいです。
これは3バイトの数値で表していることになります。
3バイト数値はありません。
RGB関数の戻り値はLongなので4バイトです。
つまり上位の1バイトが使われていません。
4バイトのうちの3バイトしか使っていません。
RGB関数は上位の1バイト00として10進数値を返しています。
RGB(255,255,255) → &H00FFFFFF
-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プロパティの設定値一覧
例えば、
その他の色で(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の引数には正数しか指定できません。
?RGB(255,255,0) Or &HFF000000 → -16711681
同じテーマ「ツイッター出題回答 」の記事
IFステートメントの判定
日付の謎:IsDateとCDate
ツイッター投稿用に文字数と特定文字で区切る
マクロ記録での色のマイナス数値について
VBAのString型の最大文字数について
Variantの数値型と文字列型の比較
Variant仮引数にRange.Valueを配列で渡す方法
Variant仮引数のByRefとByValの挙動違い
100桁の正の整数値の足し算
「VBA Match関数の限界」についての誤解
VBAで数値を漢数字に変換する方法
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。