セルの背景色を徐々に黒に変更しようとしていたのですが、Range.Interior.ColorメソッドがLongを返すことがわかりました。 MSDNのドキュメントを見ると、この数値が何を表しているかについてはほとんど何もありません。このlongからRGB値を返す方法はありますか。 RGB(赤、緑、青)関数の反対が効果的に必要です。
短い答え:
これには組み込みの機能はありません。独自の関数を作成する必要があります。
ロングアンサー:
Interior.Colorプロパティから返されるlongは、htmlの色の表示に使用される典型的な16進数の10進変換です。 「66FF66」。さらに、定数xlNone(-4142)を渡して、背景に色を付けないようにセルを設定できますが、そのようなセルにはGet
プロパティから白RGB(255, 255, 255)
とマークされます。これを知って、適切なRGB値の1つまたはすべてを返す関数を作成できます。
幸いなことに、親切なアラン・ワイアット氏はここでそれをやった!
その「任意の」数は、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
ワイアット氏がRGBの色の高速方式を使用しているのを見るのは良いことです
R = C Mod 256
G = C \ 256 Mod 256
B = C \ 65536 Mod 256
これは、一部の人が推奨する左中右の16進strを使用するものよりも何倍も高速です
他の答えは私にはうまくいきませんでした。見つけた:
R = C And 255
G = C \ 256 And 255
B = C \ 256 ^ 2 And 255
そして、それは適切に機能しました。
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) & "&"
マークバルホフの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