2011-05-14 9 views
8

Próbuję ustawić publicznej const koloru w moim kodzie VBA. Zwykle mogę użyć:Jak uzyskać odpowiednią wartość szesnastkową koloru RGB w programie Excel/VBA?

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

Jednak nie ma sposobu, aby publicznie to ograniczyć z powodu funkcji RGB. I konwertowane tej wartości RGB do Hex wykorzystaniem konwertera internetowego, a ja wróciłem B7DEE8

Zastosowanie:

BLUE = &HB7DEE8 

wyników w zupełnie innym kolorze. Myślę, że to może być kolor RGBA i próbowałem B7DEE8__ i uzyskałem kolor dość blisko (ostatnią cyfrą jest B8), ale chciałbym wiedzieć, jak właściwie znaleźć właściwą wartość.

Uwaga: Naprawdę nie potrzebuję kodu, aby przekonwertować to na hex, po prostu muszę wiedzieć, jak go znaleźć, ponieważ mam pięć stałych kolorów, których używam na arkuszu Excela, i chciałbym je ustawić w górę.

Odpowiedz

10

Musisz odwrócić bajty w celu

BLUE = &HE8DEB7 

aby uzyskać prawidłową wartość koloru.

+0

Och, wow, to było proste. Dzięki! Czy wiesz, dlaczego tak jest? – Brandon

+1

@Bandon Nie wiem, czy istnieje jakakolwiek odpowiedź na to pytanie. Niemniej jednak jest to przynajmniej udokumentowane, np. [tutaj] (http://msdn.microsoft.com/en-us/library/dd952824%28v=office.12%29.aspx). – Howard

-1

testowałem ten kod, cant naprawdę śledzić odpowiedzi Howarda

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 
+0

Po prostu dodaj kolejną linię: 'MsgBox Hex (BLUE) 'E8DEB7', a zobaczysz, że bajty kolorów są odwrócone. – Howard

9

Powodem pozornego odwrócenia jest to, że funkcja RGB() faktycznie tworzy wartość BGR.

Bardziej szczegółowo, czerwony bajt jest bajtem małego rzędu, a niebieski bajt jest bajtem wyższego rzędu (lub co najmniej trzecim z czterech).

Spróbuj przykład w oknie 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 

Zauważ, że „pełna” bajt (255 lub FF) i bajt „do połowy” (128 lub 80) kończy się po przeciwnych stronach w każdym wyniku. Dlatego musisz określić stałą heksadecymalną w odwrotnej kolejności, w stosunku do oczekiwanej wartości.

Nie trzeba również używać konwertera online. Funkcja Hex() podaje wartość hex liczby podanej do niego i Int odbędzie ciąg w formacie szesnastkowym i zwrócić wartość dziesiętną:

? Int("&hff0000") 
16711680 

Aktualizacja:

więc do korzystania z tego informacje do tworzenia stałych heksadecymalnych, wystarczy uruchomić instrukcje RGB() i Hex() w oknie Natychmiastowym jak wyżej (wpisz Ctrl + G, aby je otworzyć i zamknąć), a następnie użyj wynikowej wartości Hex jako stałej. Jeśli wartość jest mniejsza niż długości 6 cyfr, można go pad po lewej stronie zerami, ale nie jest to konieczne ze względów technicznych:

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

skopiuj że ostatni wiersz w kodzie.

+0

Niestety, ponieważ próbuję ustawić kolory jako stałe publiczne, nie mogę użyć Hex() lub RGB() do zdefiniowania ich, ponieważ nie są one stałe. Ale bardzo przydatne informacje, dziękuję! – Brandon

1
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 

uwaga, że ​​celują wartości RGB są do tyłu (BGR)

+0

Po prostu wypróbowałem to ... 'hex (interior.color)' nie dostanie się tam ... Spróbuj na przykład. Kolor Excela "10192433" odpowiada RGB '49, 134,155 ', który POWINNY odpowiadać heksowi '31869b' ... ale hex (10192433) =' 9BD7C4'. –

+0

Nie napotykam tego problemu. Próbowałem odtworzyć to, co powiedziałeś, ale nawet przy użyciu 'MsgBox (Hex (10192433)) poprawnie pokazuje mi 9B8631 ... (Jestem w programie Excel 2013) – SourceSeeker

+0

@SourceSeeker tak, ten kolor (10192433) to R-49 G-134 B-155 na karcie kolorów, tj. R-31 G- 86 B- 9b na heksie (31 86 9b razem, kolor turkusowy, ponieważ XL wyświetla wartości RGB faktycznie odwrócone, w BGR (prawdopodobnie ze względu na endianness)); ale wartość heksadecymalna 10192433 jest w rzeczywistości 9b 86 31. zauważ, jak bity są odwrócone - jest w BGR zamiast RGB. jeśli XL wyświetlał go jako RGB, liczba dziesiętna byłaby rzeczywiście 3245723 zamiast 10192433. – iliketocode

1

OK dodaje odbędzie koloru komórki w programie Excel 2010 i podać prawidłowy 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