2011-05-14 332 views
8

Estoy tratando de establecer un const público de un color en mi código VBA. Normalmente, puedo usar:¿Cómo obtengo el valor hexadecimal correspondiente de un color RGB en Excel/VBA?

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

Sin embargo, no hay manera de const público que debido a la función RGB. Convertí este valor RGB a Hex utilizando un convertidor de línea, y regresé B7DEE8

Usando:

BLUE = &HB7DEE8 

resultados en un color completamente diferente. Creo que esto puede ser realmente un color RGBA, y probé B7DEE8__ y obtuve el color bastante cerca (siendo el último dígito B8), pero me gustaría saber cómo encontrar el valor correcto.

Nota: Realmente no necesito código para convertir esto a hexadecimal, solo necesito saber cómo encontrarlo, porque tengo cinco colores constantes que uso en mi hoja de Excel, y me gustaría configurarlos arriba.

Respuesta

10

Vas a tener que invertir los bytes en orden

BLUE = &HE8DEB7 

para obtener el valor de color correcto.

+0

Oh wow, eso fue simple. ¡Gracias! ¿Sabes por qué es eso? – Brandon

+1

@Brandon No sé si puede haber alguna respuesta a esta pregunta. Sin embargo, al menos está documentado, p. [aquí] (http://msdn.microsoft.com/en-us/library/dd952824%28v=office.12%29.aspx). – Howard

-1

He probado este código, no puede seguir realmente la respuesta de 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

Simplemente agregue otra línea: 'MsgBox Hex (BLUE) 'E8DEB7' y verá que los bytes de color están invertidos. – Howard

9

La razón de la aparente inversión es que la función RGB() crea realmente un valor BGR.

Más específicamente, el byte rojo es el byte de orden inferior y el byte de azul es el byte alto orden (o tercero de cuatro por lo menos).

Prueba este ejemplo en la ventana Inmediato:

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

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

Tenga en cuenta que el byte de "lleno" (255 o FF) y el byte "medio llena" (128 o 80) terminan en los lados opuestos en cada resultado. Es por eso que necesita especificar la constante hexadecimal en el orden inverso de lo que esperaría obtener el mismo valor.

Además, no es necesario utilizar un convertidor en línea. La función Hex() proporciona el valor hexadecimal del número dado a él, e Int tomará una cadena en formato hexadecimal y devolver el valor decimal:

? Int("&hff0000") 
16711680 

Actualización:

Así que para utilizar este información para crear sus constantes hexadecimales, solo ejecuta sus instrucciones RGB() y Hex() en la ventana Inmediato como se indicó anteriormente (escriba Ctrl + G para abrir y cerrar), luego use el valor hexadecimal resultante como su constante. Si el valor es menor de 6 dígitos de longitud, puede rellenarlo a la izquierda con ceros, pero eso no es técnicamente necesario:

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

luego copiar la última línea en el código.

+0

Desafortunadamente, como intento establecer los colores como constantes públicas, no puedo usar Hex() o RGB() para definirlos, ya que no son constantes. Pero información muy útil, ¡gracias! – 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 que sobresalen valores RGB están al revés (BGR)

+0

Acabo de probar esto ... el 'hex (interior.color)' no te lleva hasta allí ... Prueba esto por ejemplo. El color excel '10192433' corresponde a RGB '49, 134,155 'que DEBERÍA corresponder al hex' 31869b' .... pero hex (10192433) = '9BD7C4'. –

+0

No encuentro este problema. He intentado reproducir lo que ha dicho, pero incluso el uso de 'MsgBox (Hex (10192433))' muestra correctamente 9B8631 a mí ... (estoy en Excel 2013) – SourceSeeker

+0

@SourceSeeker sí, este color (10192433) es R-49 G-134 B-155 en la carta de colores, es decir. R-31 G- 86 B- 9b en hexágono (31 86 9b juntos, un color similar al color turquesa, porque XL muestra valores RGB realmente invertidos, en BGR (posiblemente debido a endianness)); pero, el valor hexadecimal de 10192433 es en realidad 9b 86 31. observe cómo los bits se voltean, está en BGR en lugar de RGB. Si XL está representada como RGB, el número decimal en realidad sería 3.245.723 en lugar de 10192433. – iliketocode

1

bien, el siguiente tomará el color de una celda en Excel 2010 y proporcionar una Hexcode válida:

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 
Cuestiones relacionadas