如何在 Excel/VBA 中获取 RGB 颜色的相应十六进制值?
Posted
技术标签:
【中文标题】如何在 Excel/VBA 中获取 RGB 颜色的相应十六进制值?【英文标题】:How do I get the corresponding Hex value of an RGB color in Excel/VBA? 【发布时间】:2011-08-25 14:09:20 【问题描述】:我正在尝试在我的 VBA 代码中设置颜色的公共常量。通常,我可以使用:
Dim BLUE As Long
BLUE = RGB(183, 222, 232)
但是,由于 RGB 功能,无法公开 const。我使用在线转换器将此 RGB 值转换为十六进制,然后我得到了 B7DEE8
使用:
BLUE = &HB7DEE8
产生完全不同的颜色。我认为这实际上可能是一种 RGBA 颜色,我已经尝试过 B7DEE8__ 并且颜色非常接近(最后一位数字是 B8),但我想知道如何实际找到正确的值。
注意:我真的不需要代码来将其转换为十六进制,我只需要知道如何找到它,因为我在 Excel 工作表上使用了五种恒定颜色,我想设置它们.
【问题讨论】:
【参考方案1】:您必须将字节反转
BLUE = &HE8DEB7
获取正确的颜色值。
【讨论】:
@Brandon 我不知道这个问题是否有任何答案。尽管如此,它至少已记录在案,例如here.【参考方案2】:明显反转的原因是 RGB() 函数实际上创建了一个 BGR 值。
更具体地说,红色字节是低位字节,蓝色字节是高位字节(或至少四分之三)。
在立即窗口中试试这个例子:
x = RGB(255, 0, 128) ' full red, half blue
? hex(x)
8000FF
x = RGB(128, 0, 255) ' half red, full blue
? hex(x)
FF0080
请注意,“满”字节(255 或 FF)和“半满”字节(128 或 80)在每个结果中都位于相反的两侧。这就是为什么您需要以与您期望获得相同值相反的顺序指定十六进制常量。
另外,无需使用在线转换器。 Hex() 函数提供给它的数字的十六进制值,Int 将取一个十六进制格式的字符串并返回十进制值:
? Int("&hff0000")
16711680
更新:
因此,要使用这些信息来创建十六进制常量,您只需在上面的即时窗口中运行 RGB() 和 Hex() 语句(键入 Ctrl+G 打开和关闭它),然后使用生成的十六进制值作为你的常数。如果该值的长度小于 6 位,您可以在左侧用零填充它,但这在技术上不是必需的:
x = RGB(183, 222, 232)
? "Public Const MyBlue = &h" & hex(x)
Public Const MyBlue = &hE8DEB7
然后将最后一行复制到您的代码中。
【讨论】:
不幸的是,因为我试图将颜色设置为公共常量,所以我不能使用 Hex() 或 RGB() 来定义它们,因为它们不是常量。但是非常有用的信息,谢谢!【参考方案3】:好的,下面将采用 Excel 2010 中单元格的颜色并提供有效的 Hexcode:
Public Function getHexCol(a As Range)
' In excel type in for example getHexCol(A1) to get the hexcode of the color on A1.
Dim strColour As String
Dim hexColour As String
Dim nColour As Long
Dim nR As Long, nB As Long, nG As Long
strColour = a.Interior.Color
If Len(strColour) = 0 Then Exit Function
nColour = Val(strColour) ' convert string to decimal number
hexColour = Hex(nColour) ' convert decimal number to hex string
While Len(hexColour) < 6 ' pad on left to 6 hex digits
hexColour = "0" & hexColour
Wend
nB = CLng("&H" & Mid(hexColour, 1, 2))
nG = CLng("&H" & Mid(hexColour, 3, 2))
nR = CLng("&H" & Mid(hexColour, 5, 2))
getHexCol = Hex(RGB(nB, nG, nR))
End Function
【讨论】:
【参考方案4】:Function GetRGB(ByVal cell As Range) As String
Dim R As String, G As String
Dim b As String, hexColor As String
hexCode = Hex(cell.Interior.Color)
'Note the order excel uses for hex is BGR.
b = Val("&H" & Mid(hexCode, 1, 2))
G = Val("&H" & Mid(hexCode, 3, 2))
R = Val("&H" & Mid(hexCode, 5, 2))
GetRGB = R & ":" & G & ":" & b
End Function
请注意,excel RGB 值是向后的 (BGR)
【讨论】:
刚刚尝试过...hex(interior.color)
无法让您到达那里...例如试试这个。 excel 颜色 10192433
对应于 RGB '49,134,155' 应该对应于十六进制 31869b
.... 但 hex(10192433) = 9BD7C4
。
我没有遇到这个问题。我试图重现你所说的,但即使使用 MsgBox (Hex(10192433))
正确地向我显示 9B8631...(我在 Excel 2013 上)
@SourceSeeker 是的,这个颜色 (10192433) 在色卡上是 R-49 G-134 B-155,即。 R-31 G- 86 B- 9b 十六进制(31 86 9b 一起,类似绿松石的颜色,因为 XL 以 BGR 显示实际上反转的 RGB 值(可能由于字节序);但是,10192433 的十六进制值实际上是 9b 86 31。注意位是如何翻转的——它是 BGR 而不是 RGB。如果 XL 将其显示为 RGB,则十进制数实际上是 3245723 而不是 10192433。
@iliketocode 我已经注意到 Excel 函数 hex(...)
返回的反之亦然 RGB 值,但我仍然不明白 Amit Kohli 的十六进制值 9BD7C4 来自哪里:“但是 hex(10192433) = @987654328 @"。 9BD7C4 = 9B D7 C4 = 155 215 196 = 12900251 (XL: VALUE OF RGB(155,215,196)) = light tourquoise = C4D79B (XL: VALUE OF HEX(12900251) = BGR)
>换行C4D79B = C4 D7 9B = 196 215 155 = 10213316 (XL: VALUE OF RGB(196,215,155)) = light green = 9BD7C4 (XL: VALUE OF HEX(10213316) = BGR)【参考方案5】:
我测试了这段代码,不能真正按照霍华德的回答
Dim rd, gr, bl As Integer
rd = 183
gr = 222
bl = 232
BLUE = RGB(rd, gr, bl)
hexclr = Format(CStr(Hex(rd)), "00") +
Format(CStr(Hex(gr)), "00") +
Format(CStr(Hex(bl)), "00")
MsgBox hexclr 'B7DEE8
【讨论】:
只需添加另一行:MsgBox Hex(BLUE) 'E8DEB7
,您将看到颜色字节反转。以上是关于如何在 Excel/VBA 中获取 RGB 颜色的相应十六进制值?的主要内容,如果未能解决你的问题,请参考以下文章