9

我正在尝试在我的 VBA 代码中设置颜色的公共常量。通常,我可以使用:

Dim BLUE As Long
BLUE = RGB(183, 222, 232)

但是,由于 RGB 功能,无法公开 const 。我使用在线转换器将此 RGB 值转换为十六进制,然后返回 B7DEE8

使用:

BLUE = &HB7DEE8

导致完全不同的颜色。我认为这实际上可能是一种 RGBA 颜色,我已经尝试过 B7DEE8__ 并且颜色非常接近(最后一位数字是 B8),但我想知道如何实际找到正确的值。

注意:我真的不需要代码来将其转换为十六进制,我只需要知道如何找到它,因为我在 Excel 工作表上使用了五种不变的颜色,我想设置它们。

4

6 回答 6

11

您必须将字节反转为顺序

BLUE = &HE8DEB7

以获得正确的颜色值。

于 2011-05-14T17:03:16.517 回答
11

出现明显反转的原因是 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

然后将最后一行复制到您的代码中。

于 2011-05-15T01:34:50.767 回答
4

好的,下面将采用 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
于 2015-06-10T14:27:59.920 回答
2
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)

于 2014-10-01T21:12:36.393 回答
0

这是另一个在 MS Access 中也可以使用的函数,它解释了反向 RGB 顺序:

Function VBA_RGB_To_HEX(iRed As Integer, iGreen As Integer, iBlue As Integer) As String
    Dim sHex As String
    sHex = "#" & VBA.Right$("00" & VBA.Hex(iBlue), 2) & VBA.Right$("00" & VBA.Hex(iGreen), 2) & VBA.Right$("00" & VBA.Hex(iRed), 2)
    VBA_RGB_To_HEX = sHex
End Function
于 2022-02-03T20:37:35.140 回答
-1

我测试了这段代码,不能真正遵循霍华德的回答

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
于 2011-05-14T17:17:23.877 回答