我正在尝试在我的VBA代码中设置一个颜色的公共常量。通常,我可以使用:
Dim BLUE As Long
BLUE = RGB(183, 222, 232)
但是,由于RGB函数的原因,无法公开const。我使用在线转换器将这个RGB值转换为十六进制,然后我得到了B7DEE8
使用:
BLUE = &HB7DEE8
结果会产生完全不同的颜色。我认为这实际上可能是B8颜色,并且我已经尝试过RGBA,并且颜色非常接近(最后一个数字是RGBA),但我想知道如何找到正确的值。
注意:我真的不需要代码来将它转换成十六进制,我只需要知道如何找到它,因为我在Excel工作表上使用了五种常量颜色,并且我想设置它们。
发布于 2011-05-15 01:03:17
您必须将这些字节按顺序反转
BLUE = &HE8DEB7
来获得正确的颜色值。
发布于 2011-05-15 09:34:51
表面上相反的原因是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
请注意,在每个结果中,"full“字节(255或FF)和"half-full”字节(128或80)结束于相反的两端。这就是为什么你需要以相反的顺序指定十六进制常量,而不是你期望得到相同的值。
此外,不需要使用在线转换器。Hex()函数提供给定数字的十六进制值,Int将接受十六进制格式的字符串并返回十进制值:
? Int("&hff0000")
16711680
更新:
因此,要使用此信息创建十六进制常量,只需像上面那样在即时窗口中运行RGB()和十六进制()语句(键入Ctrl+G以打开和关闭它),然后使用结果十六进制值作为常量。如果值的长度小于6位,则可以在左侧填充零,但从技术上讲,这并不是必需的:
x = RGB(183, 222, 232)
? "Public Const MyBlue = &h" & hex(x)
Public Const MyBlue = &hE8DEB7
然后将最后一行复制到您的代码中。
发布于 2015-06-10 22:28:00
好的,下面的代码将采用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
https://stackoverflow.com/questions/6003324
复制相似问题