12

次の方法でオレンジ色を設定しようとしています。

WorkSheet.Range("A1:A5").Interior.color = 49407

WorkSheet.Range("A1:A5").Interior.color = &HC0FF 'Hex value of 49407

これら2つはまったく同等であるはずではありませんか?設定されている色が異なります。

4

4 に答える 4

37

いいえ、これらの値は同等ではありません:&HC0FFは -16129 ですが、&HC0FF&49407 です。

かなり古い言語である VBA は、デフォルトで 16 ビット整数を使用します。この時代では、int ではなく常に long が必要ですが、VBA に問い合わせる必要があります。

&HC0FF16 進数から 16 ビットの定数を定義する構造です。この値の符号ビットは、16 ビット値として解釈されるときに設定される (オン、負) ため、-16129 に変換されます。これはひどいと思うかもしれませんが、これはバグではありません! -16129 (符号付き整数として) を 32 ビット形式で使用すると、上位 16 ビット全体に 1 が伝搬され、青の値 255 になります。

ここで本当に必要だったのは、32 ビットの 16 進定数です: &HC0FF&. 最後のエクストラ&は、これが int ではなく long 定数であることを VBA に伝えます。32 ビットで解釈すると、これは正の値なので、探している 10 進数に相当します。

つまり、末尾に&.

余談ですが、この VBA の 16 ビットへの傾向は、式 16000 * 16000 などで 16 ビット演算をオーバーフローさせる 10 進定数を使用する場合にも、私たちを苦しめる可能性があります。そのため、10 進定数の末尾も使用する必要がある場合があり&ます (または最初に long に割り当てます)。

于 2012-09-30T15:48:23.293 に答える
11

これにより、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
于 2012-09-29T16:26:53.847 に答える
8

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 の逆シーケンスについて心配する必要はありません。

于 2012-09-28T18:42:12.677 に答える
4

通常、カラーコードは 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番目の例を追加しました。

于 2012-09-28T17:48:05.573 に答える