2011-05-14 6 views
8

Sto provando a impostare un const pubblico di un colore nel mio codice VBA. Normalmente, posso usare:Come si ottiene il valore esadecimale corrispondente di un colore RGB in Excel/VBA?

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

Tuttavia, non c'è modo di const pubblico che a causa della funzione RGB. Ho convertito questo valore RGB a Hex utilizzando un convertitore online, e sono tornato B7DEE8

Usando:

BLUE = &HB7DEE8 

risultati in un colore completamente diverso. Penso che questo possa essere in realtà un colore RGBA, e ho provato B7DEE8__ e ho ottenuto un colore piuttosto vicino (con l'ultima cifra in B8), ma mi piacerebbe sapere come trovare effettivamente il valore corretto.

Nota: non ho davvero bisogno di codice per convertirlo in esadecimale, ho solo bisogno di sapere come trovarlo, perché ho cinque colori costanti che uso sul mio foglio Excel, e mi piacerebbe impostarli su.

risposta

10

Dovrete invertire i byte in ordine

BLUE = &HE8DEB7 

per ottenere il valore colore corretto.

+0

Oh wow, è stato semplice. Grazie! Sai perché? – Brandon

+1

@Brandon Non so se ci possa essere una risposta a questa domanda. Tuttavia è almeno documentato per es. [Qui] (http://msdn.microsoft.com/en-us/library/dd952824%28v=office.12%29.aspx). – Howard

-1

Ho provato questo codice, non posso davvero seguire la risposta di Howard

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

Basta aggiungere un'altra riga: 'MsgBox Hex (BLU) 'E8DEB7' e vedrai che i byte dei colori sono invertiti. – Howard

9

La ragione per l'inversione apparente è che la funzione RGB() in realtà crea un valore BGR.

In particolare, il byte rosso è il byte di ordine basso e il byte blu è il byte di ordine superiore (o il terzo di quattro almeno).

Prova questo esempio nella finestra Immediata:

x = RGB(255, 0, 128) ' full red, half blue 
? hex(x) 
8000FF 

x = RGB(128, 0, 255) ' half red, full blue 
? hex(x) 
FF0080 

noti che il byte "pieno" (255 o FF) e il byte "mezzo pieno" (128 o 80) finiscono sui lati opposti in ogni risultato. Ecco perché è necessario specificare la costante esadecimale nell'ordine inverso rispetto a quello che ci si aspetta di ottenere lo stesso valore.

Inoltre, non è necessario utilizzare un convertitore online. La funzione Hex() fornisce il valore esadecimale del numero dato ad essa, e Int avrà una stringa in formato esadecimale e restituire il valore decimale:

? Int("&hff0000") 
16711680 

Aggiornamento:

Quindi, per utilizzare questo informazioni per creare le costanti esadecimali, è sufficiente eseguire le istruzioni RGB() e Hex() nella finestra Immediata come sopra (digitare Ctrl + G per aprirlo e chiuderlo), quindi utilizzare il valore esadecimale risultante come costante. Se il valore è inferiore a 6 cifre, è possibile pad sulla sinistra con gli zeri, ma che non è tecnicamente necessario:

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

quindi copiare che ultima riga nel codice.

+0

Purtroppo, poiché sto cercando di impostare i colori come costanti pubbliche, non posso usare Hex() o RGB() per definirli, in quanto non sono costanti. Ma informazioni molto utili, grazie! – 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 

nota che eccellono i valori RGB sono indietro (BGR)

+0

Ho appena provato questo ... il 'hex (interior.color)' non ti porta lì ... Prova questo per esempio. Il colore excel '10192433' corrisponde a RGB '49, 134,155 'che DOVREBBE corrispondere all'esagono' 31869b' .... ma esadecimale (10192433) = '9BD7C4'. –

+0

Non ho riscontrato questo problema. Ho provato a riprodurre ciò che hai detto, ma anche usare 'MsgBox (Hex (10192433)) 'mostra correttamente 9B8631 per me ... (Sono su Excel 2013) – SourceSeeker

+0

@SourceSeeker sì, questo colore (10192433) è R-49 G-134 B-155 sulla cartella colori, es. R-31 G- 86 B- 9b in esadecimale (31 86 9b insieme, un colore simile al tourquoise, perché XL visualizza i valori RGB effettivamente invertiti, in BGR (probabilmente a causa dell'endianità)); ma, il valore esadecimale di 10192433 è in realtà 9b 86 31. nota come i bit sono capovolti: è in BGR anziché in RGB. se XL lo visualizzava come RGB, il numero decimale sarebbe in realtà 3245723 invece di 10192433. – iliketocode

1

OK, il seguente prenderà il colore di una cella in Excel 2010 e fornire un Hexcode valida:

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