2012-09-28 13 views

Respuesta

28

No, esos valores no son equivalentes: &HC0FF es -16.129, mientras que &HC0FF& es 49407.

VBA, al ser un lenguaje bastante antiguo, usa números enteros de 16 bits de forma predeterminada.En este día y edad, más o menos quieres largos siempre en lugar de enteros, pero tienes que pedirle a VBA.

&HC0FF es una construcción que define una constante de 16 bits desde hexadecimal. Debido a que el bit de signo en este valor se establece (activado, negativo) cuando se interpreta como un valor de 16 bits, de ahí la conversión a -16129. Podemos considerar que esto apesta, ¡pero no es un error! Cuando usa -16129 (como un entero con signo), en formato de 32 bits, los 1 se propagan a través de los 16 bits principales y eso da como resultado el valor azul de 255.

Lo que realmente quería aquí es un 32 bits constante de hexadecimal: &HC0FF&. El & extra en el extremo le dice a VBA que esta es una constante larga en lugar de una int. Interpretado en 32 bits, este es un valor positivo, por lo que da el equivalente decimal que está buscando.

En resumen, solicite constantes hexadecimales largas con el & posterior.

Como un lado, esta propensión de VBA hacia 16 bits también puede mordernos cuando se usan constantes decimales, como en una expresión 16000 * 16000, que rebasará la aritmética de 16 bits. Por lo tanto, a veces es necesario utilizar también el & final en constantes decimales (o asignar uno primero a uno largo).

+0

¡Brillante! Exactamente lo que estaba buscando. –

+0

Respuesta increíble. Vi la diferencia negativa, pero no tenía idea de por qué estaba sucediendo hasta que leí tu respuesta. ¡Muy informativo! – danielpiestrak

4

Un código de color generalmente se compone de tres valores, ROJO, VERDE, AZUL. Su Hexcode falta uno de los tres y Excel está autocompletando con FF. Entonces, su color C0FF se transforma para ser FFC0FF.

Aquí hay un programa de ejemplo para que pueda verlo en acción, crear una nueva hoja y ejecutarlo.

' C0FF will be changed to be FFC0FF 
Range("A1").Interior.Color = &HC0FF 
Range("A1").Select 
ActiveCell.FormulaR1C1 = Range("A1").Interior.Color 
Range("A2").Select 
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)" 

' 49407 is actually 00C0FF 
Range("B1").Interior.Color = 49407 
Range("B1").Select 
ActiveCell.FormulaR1C1 = Range("B1").Interior.Color 
Range("B2").Select 
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)" 

' Use RGB to have better control over your results 
' Switch the order when doing so: 00C0FF => 00 Blue C0 Green FF Red 
Range("C1").Interior.Color = RGB(&HFF, &HC0, &H0) 
Range("C1").Select 
ActiveCell.FormulaR1C1 = Range("C1").Interior.Color 
Range("C2").Select 
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)" 

EDIT: añadido un tercer ejemplo para ilustrar el cambio de los colores como se sugiere en una respuesta diferente.

+0

Eso despeja muchas cosas. ¡Gracias! He cambiado a especificar los valores RGB por separado, pero me pregunto si es posible hacer que Excel lo lea como '00C0FF' directamente. –

6

Creo que las respuestas de Gimp y Johannes se pierden la cuestión clave.

Un color en la pantalla de una computadora se define especificando la cantidad de rojo, azul y verde que necesita. Para cada uno de los tres colores, especifique un número entre 0 y 255. Estos tres números normalmente se especifican como un solo número al concatenar los tres números separados. Con Html, usted especifica un color como #RRGGBB donde RR, GG y BB son números hexadecimales o puede reemplazar RRBBGG por el equivalente decimal. Con Excel, la secuencia se invierte para que & HBBGGRR o el equivalente decimal.

49407 es el equivalente decimal de 00C0FF cual significa para Excel Azul = 0, Verde = 192 y Rojo = 255.

Pero & HC0FF o & H00C0FF es -16129 o Azul = 255, Verde = 192 y Rojo = 255. Esto parece ser un defecto en la conversión H &. No puedo encontrar modos de conseguir C0FF convertido a 49407.

Si usted insiste en el uso de la conversión & H, lo mejor que puedo ofrecer es:

Range("A1:A5").Interior.color = &H01C0FF 

Ésta es azul = 1, Verde = 192 y Rojo = 255 y no puedo decir la diferencia de Blue = 0, verde = 192 y rojo = 255.

Pero yo recomendaría:

Range("A1:A5").Interior.color = RGB(255,192,0) 

porque la función RGB siempre devuelve un número positivo y no tiene que preocuparse por la secuencia inversa de Excel.

+0

¡Gran respuesta, gracias, esto me estaba volviendo loco! – Sergio

+0

sí, no puede omitir los 0 principales ... la respuesta sobre el tamaño int es muy buena, pero esta es en gran medida la respuesta práctica –

4

Esto convertirá los colores hexagonal formato que haya a la larga RGB que Office utiliza para los colores RGB:

Function HexToLongRGB(sHexVal As String) As Long 
    Dim lRed As Long 
    Dim lGreen As Long 
    Dim lBlue As Long 

    lRed = CLng("&H" & Left$(sHexVal, 2)) 
    lGreen = CLng("&H" & Mid$(sHexVal, 3, 2)) 
    lBlue = CLng("&H" & Right$(sHexVal, 2)) 

    HexToLongRGB = RGB(lRed, lGreen, lBlue) 

End Function 
+0

+1, también permite copiar valores hexadecimales de f.ex . Photoshop o un selector de color directamente en una tabla de base de datos. –

Cuestiones relacionadas