如何在 Excel/VBA 中获取 RGB 颜色的相应十六进制值?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6003324/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I get the corresponding Hex value of an RGB color in Excel/VBA?
提问by Brandon
I'm trying to set a public const of a color in my VBA code. Normally, I can use:
我试图在我的 VBA 代码中设置一个颜色的公共常量。通常,我可以使用:
Dim BLUE As Long
BLUE = RGB(183, 222, 232)
However, there's no way to public const that because of the RGB function. I converted this RGB value to Hex using an online converter, and I got back B7DEE8
但是,由于 RGB 功能,无法公开 const 。我使用在线转换器将此 RGB 值转换为十六进制,然后返回 B7DEE8
Using:
使用:
BLUE = &HB7DEE8
results in a completely different color. I think this may actually be an RGBA color, and I've tried B7DEE8__ and got the color pretty close (with the last digit being B8), but I'd like to know how to actually find the correct value.
导致完全不同的颜色。我认为这实际上可能是一种 RGBA 颜色,我试过 B7DEE8__ 并且颜色非常接近(最后一位数字是 B8),但我想知道如何实际找到正确的值。
Note: I don't really need code to convert this to hex, I just need to know how to find it, because I have five constant colors I use on my Excel sheet, and I'd like to set them up.
注意:我真的不需要代码将其转换为十六进制,我只需要知道如何找到它,因为我在 Excel 工作表上使用了五种恒定颜色,我想设置它们。
回答by Howard
You'll have to reverse the bytes into order
您必须将字节反转为顺序
BLUE = &HE8DEB7
to get the correct color value.
以获得正确的颜色值。
回答by Todd
The reason for the apparent reversal is that the RGB() function actually creates a BGR value.
出现明显反转的原因是 RGB() 函数实际上创建了一个 BGR 值。
More specifically, the red byte is the low order byte and the blue byte is the high order byte (or third of four at least).
更具体地说,红色字节是低位字节,蓝色字节是高位字节(或至少四分之三)。
Try this example in the Immediate window:
在立即窗口中试试这个例子:
x = RGB(255, 0, 128) ' full red, half blue
? hex(x)
8000FF
x = RGB(128, 0, 255) ' half red, full blue
? hex(x)
FF0080
Note that the "full" byte (255 or FF) and the "half-full" byte (128 or 80) end up on the opposite sides in each result. That's why you need to specify the hex constant in the reverse order from what you'd expect to get the same value.
请注意,“满”字节(255 或 FF)和“半满”字节(128 或 80)在每个结果中以相反的方向结束。这就是为什么您需要以与您期望获得相同值的相反顺序指定十六进制常量。
Also, no need to use an online converter. The Hex() function provides the hex value of the number given to it, and Int will take a string in hex format and return the decimal value:
此外,无需使用在线转换器。Hex() 函数提供给它的数字的十六进制值,而 Int 将采用十六进制格式的字符串并返回十进制值:
? Int("&hff0000")
16711680
Update:
更新:
So to use this information to create your hex constants, you just run your RGB() and Hex() statements in the Immediate window as above (type Ctrl+G to open and close it), then use the resulting Hex value as your constant. If the value is less than 6 digits long, you can pad it on the left with zeros, but that's technically not necessary:
所以要使用这些信息来创建你的十六进制常量,你只需像上面一样在立即窗口中运行你的 RGB() 和 Hex() 语句(键入 Ctrl+G 打开和关闭它),然后使用生成的十六进制值作为你的常量. 如果该值的长度小于 6 位,您可以在左侧填充零,但这在技术上没有必要:
x = RGB(183, 222, 232)
? "Public Const MyBlue = &h" & hex(x)
Public Const MyBlue = &hE8DEB7
then copy that last line into your code.
然后将最后一行复制到您的代码中。
回答by Amit Kohli
OK, the following will take the color of a cell in Excel 2010 and provide a valid Hexcode:
好的,以下内容将采用 Excel 2010 中单元格的颜色并提供有效的十六进制代码:
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
回答by iliketocode
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
note that excel RGB values are backwards (BGR)
请注意,excel RGB 值是向后的 (BGR)
回答by Arnoldiusss
I tested this code, cant realy follow Howard's answer
我测试了这段代码,不能真正按照霍华德的回答
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

