Как получить соответствующее шестнадцатеричное значение цвета RGB в Excel / VBA? - PullRequest
8 голосов
/ 14 мая 2011

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

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

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

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

BLUE = &HB7DEE8

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

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

Ответы [ 5 ]

11 голосов
/ 14 мая 2011

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

BLUE = &HE8DEB7

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

10 голосов
/ 15 мая 2011

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

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

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

3 голосов
/ 10 июня 2015

ОК, в 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
1 голос
/ 02 октября 2014
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)

0 голосов
/ 14 мая 2011

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

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
...