Как получить соответствующее шестнадцатеричное значение цвета RGB в Excel / VBA?

Я пытаюсь установить общедоступную константу цвета в моем коде VBA. Обычно я могу использовать:

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

однако нет никакого способа опубликовать const из-за функции RGB. Я преобразовал это значение RGB в Hex с помощью онлайн-конвертера, и я вернулся b7dee8

использование:

BLUE = &HB7DEE8

результаты в совершенно другой цвет. Я думаю, что это может быть цвет RGBA, и я пробовал b7dee8__ и получил цвет довольно близко (с последней цифрой В8), но я хотел бы знать, как на самом деле найти правильное значение.

Примечание: мне действительно не нужен код для преобразования этого в hex, мне просто нужно знать, как его найти, потому что у меня есть пять постоянных цветов, которые я использую на своем листе Excel, и я хотел бы их настроить.

5 ответов


вам придется изменить байты в порядке

BLUE = &HE8DEB7

чтобы получить правильное значение цвета.


причина кажущегося разворота заключается в том, что функция RGB() фактически создает значение BGR.

более конкретно, красный байт-это байт низкого порядка, а синий байт-байт высокого порядка (или треть из четырех, по крайней мере).

попробуйте этот пример в окне immediate:

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() в окне Immediate, как указано выше (введите Ctrl+G, чтобы открыть и закройте его), затем используйте полученное шестнадцатеричное значение в качестве константы. Если значение меньше 6 цифр, вы можете заполнить его слева нулями, но это технически не надо:

x = RGB(183, 222, 232)
? "Public Const MyBlue = &h" & hex(x)
Public Const MyBlue = &hE8DEB7

затем скопируйте последнюю строку в свой код.


OK, следующее примет цвет ячейки в 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

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)


Я проверил этот код, не могу действительно следовать ответу Говарда

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