web-dev-qa-db-ja.com

Range.Interior.Color(またはその他のColorプロパティ)からRGB値を返します

セルの背景色を徐々に黒に変更しようとしていたのですが、Range.Interior.ColorメソッドがLongを返すことがわかりました。 MSDNのドキュメントを見ると、この数値が何を表しているかについてはほとんど何もありません。このlongからRGB値を返す方法はありますか。 RGB(赤、緑、青)関数の反対が効果的に必要です。

15
CodeJockey

短い答え:

これには組み込みの機能はありません。独自の関数を作成する必要があります。

ロングアンサー:

Interior.Colorプロパティから返されるlongは、htmlの色の表示に使用される典型的な16進数の10進変換です。 「66FF66」。さらに、定数xlNone(-4142)を渡して、背景に色を付けないようにセルを設定できますが、そのようなセルにはGetプロパティから白RGB(255, 255, 255)とマークされます。これを知って、適切なRGB値の1つまたはすべてを返す関数を作成できます。

幸いなことに、親切なアラン・ワイアット氏はここでそれをやった!

色のRGB値の決定

12
CodeJockey

その「任意の」数は、RGB値の数学的な組み合わせ(B * 256 ^ 2 + G * 256 + R)と、16進数から10進数への16進数カラー値の変換です(基数16から基数10)。あなたはそれを見たいです。ちょうど異なるベース。以下は、Excel用に作成したXLAMアドインファイルで使用する方法です。この方法は何度も重宝しています。アドインファイルにドキュメントを含めました。

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'   Function            Color
'   Purpose             Determine the Background Color Of a Cell
'   @Param rng          Range to Determine Background Color of
'   @Param formatType   Default Value = 0
'                       0   Integer
'                       1   Hex
'                       2   RGB
'                       3   Excel Color Index
'   Usage               Color(A1)      -->   9507341
'                       Color(A1, 0)   -->   9507341
'                       Color(A1, 1)   -->   91120D
'                       Color(A1, 2)   -->   13, 18, 145
'                       Color(A1, 3)   -->   6
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function Color(rng As Range, Optional formatType As Integer = 0)     As Variant
    Dim colorVal As Variant
    colorVal = Cells(rng.Row, rng.Column).Interior.Color
    Select Case formatType
        Case 1
            Color = Hex(colorVal)
        Case 2
            Color = (colorVal Mod 256) & ", " & ((colorVal \ 256) Mod 256) & ", " & (colorVal \ 65536)
        Case 3
            Color = Cells(rng.Row, rng.Column).Interior.ColorIndex
        Case Else
            Color = colorVal
    End Select
End Function
38
Mark Balhoff

ワイアット氏がRGBの色の高速方式を使用しているのを見るのは良いことです

R = C Mod 256
G = C \ 256 Mod 256
B = C \ 65536 Mod 256

これは、一部の人が推奨する左中右の16進strを使用するものよりも何倍も高速です

15
Harry S

他の答えは私にはうまくいきませんでした。見つけた:

R = C And 255
G = C \ 256 And 255
B = C \ 256 ^ 2 And 255

そして、それは適切に機能しました。

2
kraft hannes

16進数の値については、HTMLにエクスポートする場合、奇妙な動作をすることに注意してください。

ColorVal番号から16進数を返すのではなく、個々の色から16進数文字列を作成するのが理想的です。

セルが緑/青のような「純粋な」色の場合、無効な16進数を取得できるからです。

RED-RGB(255,0,0)は 'FF'を返します-'FF0000'を返す必要があります

青-RGB(0,0,255)は 'FF00000'を返します-'0000FF'を返す必要があります

ここに画像の説明を入力

これらを使用してHTML/CSSカラー出力を作成した場合、青色のセルは赤色になります。

RGB値に基づいて各2文字の16進「チャンク」をアセンブルするようにスクリプトを変更し、1文字の出力が返される先頭の0をパディングするUDFを使用します(これを読んでいる場合は、同様のものを作成できます)

Color = ZeroPad(Hex((colorVal Mod 256)), 2) & ZeroPad(Hex(((colorVal \ 256) Mod 256)), 2) & ZeroPad(Hex((colorVal \ 65536)), 2)

-編集:UDFのコードを含めるのを忘れた...

Function ZeroPad(text As String, Cnt As Integer) As String
'Text is the string to pad
'Cnt is the length to pad to, for example  ZeroPad(12,3) would return a string '012' , Zeropad(12,8) would return '00000012' etc..
Dim StrLen As Integer, StrtString As String, Padded As String, LP As Integer


StrLen = Len(Trim(text))


    If StrLen < Cnt Then

        For LP = 1 To Cnt - StrLen

            Padded = Padded & "0"

        Next LP

    End If

ZeroPad = Padded & Trim(text)

ENDOF:


End Function

BTW-フォームエディターに表示される16進コードが必要な場合(通常のHTML 16進色とは別に、独自の標準があります)

    Case 4  ' ::: VBA FORM HEX :::
    Color = "&H00" & ZeroPad(Hex((colorVal \ 65536)), 2) &  ZeroPad(Hex(((colorVal \ 256) Mod 256)), 2) & ZeroPad(Hex((colorVal Mod 256)), 2) & "&"
0
Johnny MMXVII

マークバルホフのVBAスクリプトは正常に動作します。すべてのクレジットは彼に行きます。

条件付きで書式設定されたセルの色コード/インデックスも取得したい場合は、コードを次のように修正できます。

'----------------------------------------------------------------
'   Function            Color
'   Purpose             Determine the Background Color Of a Cell
'   @Param rng          Range to Determine Background Color of
'   @Param formatType   Default Value = 0
'                       0   Integer             color of cell, not considering conditional formatting color
'                       1   Hex                 color of cell, not considering conditional formatting color
'                       2   RGB                 color of cell, not considering conditional formatting color
'                       3   Excel Color Index   color of cell, not considering conditional formatting color
'                       4   Integer             "real" visible color of cell (as the case may be the conditional formatting color)
'                       5   Hex                 "real" visible color of cell (as the case may be the conditional formatting color)
'                       6   RGB                 "real" visible color of cell (as the case may be the conditional formatting color)
'                       7   Excel Color Index   "real" visible color of cell (as the case may be the conditional formatting color)
'   Usage               Color(A1)      -->   9507341
'                       Color(A1, 0)   -->   9507341
'                       Color(A1, 1)   -->   91120D
'                       Color(A1, 2)   -->   13, 18, 145
'                       Color(A1, 3)   -->   6
'-----------------------------------------------------------------
Function Color(rng As Range, Optional formatType As Integer = 0) As Variant
    Dim colorVal As Variant
    Select Case formatType
        Case 0 To 3
            colorVal = Cells(rng.Row, rng.Column).Interior.Color
        Case 4 To 7
            colorVal = Cells(rng.Row, rng.Column).DisplayFormat.Interior.Color
    End Select
    Select Case formatType
        Case 0
            Color = colorVal
        Case 1
            Color = Hex(colorVal)
        Case 2
            Color = (colorVal Mod 256) & ", " & ((colorVal \ 256) Mod 256) & ", " & (colorVal \ 65536)
        Case 3
            Color = Cells(rng.Row, rng.Column).Interior.ColorIndex
        Case 4
            Color = colorVal
        Case 5
            Color = Hex(colorVal)
        Case 6
            Color = (colorVal Mod 256) & ", " & ((colorVal \ 256) Mod 256) & ", " & (colorVal \ 65536)
        Case 7
            Color = Cells(rng.Row, rng.Column).DisplayFormat.Interior.ColorIndex
    End Select
End Function
0
dumpguy