excel - texto - macro para cambiar color celda segun valor
Establecer un color de fuente en VBA (4)
Quiero establecer el color de fuente de una celda a un valor RGB específico.
Si uso
ActiveCell.Color = RGB(255,255,0)
Me pongo amarillo, pero si uso un valor RGB más exótico como:
ActiveCell.Color = RGB(178, 150, 109)
Acabo de recuperar un color gris.
¿Por qué no puedo usar cualquier valor RGB? ¿Y sabes alguna solución alternativa?
Gracias.
Excel solo usa los colores en la paleta de colores. Cuando configura una celda con el valor RGB, elige la que está en la paleta más cercana. Puede actualizar la paleta con sus colores y luego elegir su color y eso funcionará.
Esto le permitirá ver lo que está actualmente en la paleta:
Public Sub checkPalette()
Dim i As Integer, iRed As Integer, iGreen As Integer, iBlue As Integer
Dim lcolor As Long
For i = 1 To 56
lcolor = ActiveWorkbook.Colors(i)
iRed = lcolor Mod &H100 ''get red component
lcolor = lcolor / &H100 ''divide
iGreen = lcolor Mod &H100 ''get green component
lcolor = lcolor / &H100 ''divide
iBlue = lcolor Mod &H100 ''get blue component
Debug.Print "Palette " & i & ": R=" & iRed & " B=" & iBlue & " G=" & iGreen
Next i
End Sub
Esto te permitirá configurar la paleta
Public Sub setPalette(palIdx As Integer, r As Integer, g As Integer, b As Integer)
ActiveWorkbook.Colors(palIdx) = RGB(r, g, b)
End Sub
Gracias por las respuestas y los comentarios también.
Realmente me causó grandes problemas porque mi cliente tenía otros complementos instalados en Excel que también alteraban la paleta de colores.
Terminé reemplazando algunos colores en la paleta y luego asigné a mis elementos el ColorIndex específico, pero no es lindo.
Sub color()
bj = CStr(Hex(ActiveCell.Interior.Color))
If Len(bj) < 6 Then
Do Until Len(bj) = 6
bj = "0" & bj
Loop
End If
R = CLng("&H" & Right(bj, 2))
bj = Left(bj, Len(bj) - 2)
G = CLng("&H" & Right(bj, 2))
bj = Left(bj, Len(bj) - 2)
B = CLng("&H" & bj)
End Sub
Un consejo rápido: la paleta de Excel tiene dos filas de colores que rara vez se usan y, por lo general, se pueden establecer en valores personalizados sin cambios visibles en las hojas de otras personas.
Aquí está el código para crear un conjunto razonable de colores de "tonos suaves" que son mucho menos ofensivos que los valores predeterminados:
Public Sub SetPalePalette(Optional wbk As Excel.Workbook) '' This subroutine creates a custom palette of pale tones which you can use for controls, headings and dialogues ''
'' ** THIS CODE IS IN THE PUBLIC DOMAIN ** '' Nigel Heffernan http://Excellerando.Blogspot.com
'' The Excel color palette has two hidden rows which are rarely used: '' Row 1: colors 17 to 24 '' Row 2: colors 25 to 32 - USED BY SetGrayPalette in this workbook ''
'' Code to capture existing Screen Updating settting and, if necessary, '' temporarily suspend updating while this procedure generates irritating '' flickers onscreen... and restore screen updating on exit if required.
Dim bScreenUpdating As Boolean
bScreenUpdating = Application.ScreenUpdating
If bScreenUpdating = True Then Application.ScreenUpdating = False End If
''If Application.ScreenUpdating <> bScreenUpdating Then '' Application.ScreenUpdating = bScreenUpdating ''End If
If wbk Is Nothing Then Set wbk = ThisWorkbook End If
With wbk
.Colors(17) = &HFFFFD0 '' pale cyan
.Colors(18) = &HD8FFD8 '' pale green.
.Colors(19) = &HD0FFFF '' pale yellow
.Colors(20) = &HC8E8FF '' pale orange
.Colors(21) = &HDBDBFF '' pale pink
.Colors(22) = &HFFE0FF '' pale magenta
.Colors(23) = &HFFE8E8 '' lavender
.Colors(24) = &HFFF0F0 '' paler lavender
Terminar con
Si Application.ScreenUpdating <> bScreenUpdating Then Application.ScreenUpdating = bScreenUpdating Terminara si
End Sub
Public Sub SetGreyPalette () ''Esta subrutina crea una paleta personalizada de greyshades que puede usar para controles, encabezados y diálogos
'' ** ESTE CÓDIGO ESTÁ EN EL DOMINIO PÚBLICO ** ''Nigel Heffernan http://Excellerando.Blogspot.com
''La paleta de colores de Excel tiene dos filas ocultas que rara vez se usan: ''Fila 1: colores de 17 a 24'' - USADO POR SetPalePalette en este libro de trabajo ''Fila 2: colores 25 a 32
''Código para capturar la configuración de pantalla existente y, de ser necesario, ''suspender temporalmente la actualización mientras este procedimiento genera irritación parpadea en la pantalla ... ¡recuerde restaurar la actualización de la pantalla al salir!
Dim bScreenUpdating como booleano
bScreenUpdating = Application.ScreenUpdating
Si bScreenUpdating = True Then Application.ScreenUpdating = False Terminara si
''Si Application.ScreenUpdating <> bScreenUpdating Then ''Application.ScreenUpdating = bScreenUpdating ''Terminara si
Con ThisWorkbook .Colors (25) = & HF0F0F0 .Colors (26) = & HE8E8E8 .Colors (27) = & HE0E0E0 .Colors (28) = & HD8D8D8 .Colors (29) = y HD0D0D0 .Colors (30) = & HC8C8C8 ''& HC0C0C0'' Skipped & HC0C0C0: este es el gris normal del 25% en la paleta principal .Colors (31) = & HB8B8B8 ''Tenga en cuenta que las lagunas son cada vez más amplias: el ojo humano es más sensible .Colors (32) = & HA8A8A8 ''a los cambios en grises claros, por lo que esto se percibirá como una escala lineal Terminar con
''La columna de la derecha de la paleta predeterminada de Excel especifica los siguientes grises:
''Colores (56) = & H333333 ''Colores (16) = & H808080 ''Colores (48) = & H969696 ''Colores (15) = & HC0C0C0'' el valor predeterminado ''25% gris ''
''Esto debe modificarse para mejorar el'' espacio ''de color y hacer que los colores sean fácilmente distinguibles:
Con ThisWorkbook . Colores (56) = & H505050 .Colors (16) = & H707070 .Colors (48) = & H989898 ''.Colors (15) = & HC0C0C0 Terminar con
Si Application.ScreenUpdating <> bScreenUpdating Then Application.ScreenUpdating = bScreenUpdating Terminara si
End Sub
Puede optar por escribir una función ''CaptureColors'' y ''ReinstateColors'' para los eventos Open () y BeforeClose () de cada libro de trabajo o incluso para cada evento de activación y desactivación de la hoja de trabajo.
Tengo un código en algún lugar que crea un degradado de color "térmico" para los gráficos en 3-D, que le da una progresión de azul "frío" a rojos "calientes" en treinta y dos pasos. Esto es más difícil de lo que piensas: un gradiente de colores que el sistema visual humano percibirá como ''intervalos iguales'' (que se ejecuta en una escala logarítmica de intensidad y tiene ponderaciones no lineales para el rojo, el verde y el azul como colores ''fuertes'' ) lleva tiempo construirlo, y debe usar VBA para obligar a MS Chart a usar los colores que especifique, en el orden que especificó.