次の方法でオレンジ色を設定しようとしています。
WorkSheet.Range("A1:A5").Interior.color = 49407
と
WorkSheet.Range("A1:A5").Interior.color = &HC0FF 'Hex value of 49407
これら2つはまったく同等であるはずではありませんか?設定されている色が異なります。
いいえ、これらの値は同等ではありません:&HC0FF
は -16129 ですが、&HC0FF&
49407 です。
かなり古い言語である VBA は、デフォルトで 16 ビット整数を使用します。この時代では、int ではなく常に long が必要ですが、VBA に問い合わせる必要があります。
&HC0FF
16 進数から 16 ビットの定数を定義する構造です。この値の符号ビットは、16 ビット値として解釈されるときに設定される (オン、負) ため、-16129 に変換されます。これはひどいと思うかもしれませんが、これはバグではありません! -16129 (符号付き整数として) を 32 ビット形式で使用すると、上位 16 ビット全体に 1 が伝搬され、青の値 255 になります。
ここで本当に必要だったのは、32 ビットの 16 進定数です: &HC0FF&
. 最後のエクストラ&
は、これが int ではなく long 定数であることを VBA に伝えます。32 ビットで解釈すると、これは正の値なので、探している 10 進数に相当します。
つまり、末尾に&
.
余談ですが、この VBA の 16 ビットへの傾向は、式 16000 * 16000 などで 16 ビット演算をオーバーフローさせる 10 進定数を使用する場合にも、私たちを苦しめる可能性があります。そのため、10 進定数の末尾も使用する必要がある場合があり&
ます (または最初に long に割り当てます)。
これにより、16 進数形式の色が、Office が RGB 色に使用する RGB Long に変換されます。
Function HexToLongRGB(sHexVal As String) As Long
Dim lRed As Long
Dim lGreen As Long
Dim lBlue As Long
lRed = CLng("&H" & Left$(sHexVal, 2))
lGreen = CLng("&H" & Mid$(sHexVal, 3, 2))
lBlue = CLng("&H" & Right$(sHexVal, 2))
HexToLongRGB = RGB(lRed, lGreen, lBlue)
End Function
Gimp と Johannes からの回答はどちらも重要な問題を見逃していると思います。
コンピューター画面の色は、必要な赤、青、緑の量を指定することによって定義されます。3 つの色のそれぞれについて、0 から 255 までの数値を指定します。これらの 3 つの数値は、通常、3 つの個別の数値を連結することによって 1 つの数値として指定されます。Html では、RR、GG、および BB が 16 進数である #RRGGBB として色を指定するか、RRBBGG を 10 進数に置き換えることができます。Excel では順序が逆になるため、&HBBGGRR または 10 進数に相当します。
49407 は 00C0FF に相当する 10 進数で、Excel では青 = 0、緑 = 192、赤 = 255 を意味します。
ただし、&HC0FF または &H00C0FF は -16129 または青 = 255、緑 = 192、赤 = 255 です。これは &H 変換の欠陥のようです。とにかく、C0FF を 49407 に変換する方法が見つかりません。
&H 変換の使用を主張する場合、私が提供できる最善の方法は次のとおりです。
Range("A1:A5").Interior.color = &H01C0FF
これは、青 = 1、緑 = 192、赤 = 255 で、青 = 0、緑 = 192、赤 = 255 との違いはわかりません。
しかし、私はお勧めします:
Range("A1:A5").Interior.color = RGB(255,192,0)
RGB 関数は常に正の数を返すため、Excel の逆シーケンスについて心配する必要はありません。
通常、カラーコードは RED、GREEN、BLUE の 3 つの値で構成されます。あなたの Hexcode には 3 つのうちの 1 つが欠けており、Excel はそれを FF で自動入力しています。したがって、色 C0FF は FFC0FF に変換されます。
ここにサンプルプログラムがあるので、実際の動作を確認し、新しいシートを作成して実行できます。
' C0FF will be changed to be FFC0FF
Range("A1").Interior.Color = &HC0FF
Range("A1").Select
ActiveCell.FormulaR1C1 = Range("A1").Interior.Color
Range("A2").Select
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"
' 49407 is actually 00C0FF
Range("B1").Interior.Color = 49407
Range("B1").Select
ActiveCell.FormulaR1C1 = Range("B1").Interior.Color
Range("B2").Select
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"
' Use RGB to have better control over your results
' Switch the order when doing so: 00C0FF => 00 Blue C0 Green FF Red
Range("C1").Interior.Color = RGB(&HFF, &HC0, &H0)
Range("C1").Select
ActiveCell.FormulaR1C1 = Range("C1").Interior.Color
Range("C2").Select
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"
編集:別の回答で提案されているように、色の切り替えを説明するために3番目の例を追加しました。