"Macro para dar Formato condicional a un rango de celdas separadas"

Para Dante Amor

Hola Dante, necesito ayuda para una macro que me cambie tanto el color de fondo como el de la fuente en un rango de celdas que están separados en la misma hoja. Según el texto que tenga el rango de celdas, que será ND, PD, E y D, se pondrá con una combinación de colores diferente. Además ¿cómo podría hacer que cuando me sitúe en esa hoja, se ejecute la macro? Y así tener siempre actualizados los colores siempre que me sitúe en esa hoja pero sin accionar manualmente un botón.

La macro con la que estoy trabajando es la siguiente y siempre se me para en la línea SetRange:

Sub BanderasColores_M()
Dim celdas As Object
Dim rng As Range

Set .Range = ("M10,M20:M49")

For Each celda In rng
valor = celda.Value
    If valor = "D" Then
    celda.Interior.Color = RGB(153, 255, 102)
    ElseIf valor = "D" Then
    celda.Font.Color = RGB(0, 0, 0)
    ElseIf valor = "PD" Then
    celda.Interior.Color = RGB(255, 128, 33)
    ElseIf valor = "PD" Then
    celda.Font.Color = RGB(0, 0, 0)
    ElseIf valor = "ND" Then
    celda.Interior.Color = RGB(255, 0, 0)
    ElseIf valor = "ND" Then
    celda.Font.Color = RGB(255, 255, 255)
    ElseIf valor = "E" Then
    celda.Interior.Color = RGB(255, 255, 255)
    ElseIf valor = "E" Then
    celda.Font.Color = RGB(255, 0, 0)
    End If
Next celda
End Sub

Para que se active además he colocado el siguiente código en ThisWorkbook:

Private Sub Workbook_Open()

BanderasColores_M

End Sub

Como puedo hacer para que se active cuando me sitúe en la hoja.

1 respuesta

Respuesta
1

Te anexo la macro con las actualizaciones.

Sub BanderasColores_M()
'Por.Dante Amor
    Set rng = Range("M10,M20:M49")
    For Each celda In rng
        Select Case celda.Value
        Case "D"
            celda.Interior.Color = RGB(153, 255, 102)
            celda.Font.Color = RGB(0, 0, 0)
        Case "PD"
            celda.Interior.Color = RGB(255, 128, 33)
            celda.Font.Color = RGB(0, 0, 0)
        Case "ND"
            celda.Interior.Color = RGB(255, 0, 0)
            celda.Font.Color = RGB(255, 255, 255)
        Case "E"
            celda.Interior.Color = RGB(255, 255, 255)
            celda.Font.Color = RGB(255, 0, 0)
        End Select
    Next
End Sub

Además de poner la llamada a la macro en el evento Open, te recomiendo que lo pongas en el evento Change de la hoja, para que cada vez que cambies un dato en ese rango, se actualice el color.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Por.Dante Amor
    If Not Intersect(Target, Range("M10,M20:M49")) Is Nothing Then
        BanderasColores_M
    End If
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. Del lado derecho copia la macro

Saludos. Dante Amor

Si es lo que necesitas.

Te cambio las macros

Sub BanderasColores_M()
'Por.Dante Amor
    Set Rng = Range("M10,M20:M49")
    For Each celda In Rng
        Select Case UCase(celda.Value)
        Case "D"
            celda.Interior.Color = RGB(153, 255, 102)
            celda.Font.Color = RGB(0, 0, 0)
        Case "PD"
            celda.Interior.Color = RGB(255, 128, 33)
            celda.Font.Color = RGB(0, 0, 0)
        Case "ND"
            celda.Interior.Color = RGB(255, 0, 0)
            celda.Font.Color = RGB(255, 255, 255)
        Case "E"
            celda.Interior.Color = RGB(255, 255, 255)
            celda.Font.Color = RGB(255, 0, 0)
        End Select
    Next
End Sub

En el evento de la hoja

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Not Intersect(Target, Range("M10,M20:M49")) Is Nothing Then
        BanderasColores_M
    End If
End Sub

Saludos.Dante Amor

Gracias Dante,  funciona en parte pero me está dando problemas porque forma parte de un libro un tanto complicado y tambien tenía su activación desde Private Sub WorkSheet en la página del libro donde está el rango a considerar, al principio funciona pero al cambiar dos o tres veces a esa página, da un error de de depuración. 

Respecto a tu recomendación de la macro:

Private Sub Worksheet_Change(ByVal Target As Range) 'Por.Dante Amor If Not Intersect(Target, Range("M10,M20:M49")) Is Nothing Then BanderasColores_M End If End Sub

El problema es que el resultado proviene de una fórmula que si recuerdas está adjunta a dos casillas de verificación de otra de las consultas que te hice hace tiempo, es decir, si clico una de las casillas u otra en la fórmula lo detecto y pongo un código  ( E o A) si no estan clicadas las dos casillas pongo una (PE) y si clico las dos casillas a la vez pone una (E). En base a esas 4 letras obtengo un color u otro en la celda, pero al ser a través del resultado de una fórmula y no introduciendo manualmente el dato, tu macro Private Sub WS Change....no hace nada. Por favor si puedes ayudarme cambiandola, te lo agradecería mucho. Otra opción es aplicar los formatos condicionales directamente desde Excel (Estilos, Formato Condicional) pero como es para Excel 2007 versión Inglés, no sé si me dará problemas. ¿Tu que crees?¿Me puedes aconsejar al respecto? 

Muchas gracias por todo.

Te cambio las macro.

En tus eventos de hoja, solamente pon esta macro, borra las otras

Private Sub Worksheet_Activate()
    BanderasColores_M
End Sub

La otra macro está bien:

Sub BanderasColores_M()
'Por.Dante Amor
    Set Rng = Range("M10,M20:M49")
    For Each celda In Rng
        Select Case UCase(celda.Value)
        Case "D"
            celda.Interior.Color = RGB(153, 255, 102)
            celda.Font.Color = RGB(0, 0, 0)
        Case "PD"
            celda.Interior.Color = RGB(255, 128, 33)
            celda.Font.Color = RGB(0, 0, 0)
        Case "ND"
            celda.Interior.Color = RGB(255, 0, 0)
            celda.Font.Color = RGB(255, 255, 255)
        Case "E"
            celda.Interior.Color = RGB(255, 255, 255)
            celda.Font.Color = RGB(255, 0, 0)
        End Select
    Next
End Sub

Entonces si vas a otra hoja y regresas a la hoja con a macro, en automático pondrá los colores.


Si lo prefieres, configura el formato condicional de esta forma:

Saludos. Dante Amor

Sigue dándome problemas, y cuando realizo cambios en la casilla de verificación hay que salir de la hoja y volver a entrar para que me actualice los estados. La instrucción "Private Sub WorkSheet_Activate()" ya la tenía en las páginas para activar las diferentes macros que tengo como formato condicional, pero hay algo que no me permite funcionar. Me da un error tipo 1004  La estructura de mi libro es la siguiente:

El libro consta de 5 hojas:

Hoja 1. Recoge datos y en función de si hay o no disponibilidad, las banderas adquieren un color. Es una hoja de para ver los estados.

Hoja 2, importante porque en la columna Reserva de producto (Uds) se meten las unidades de reserva manualmente. Se presiona Reservar y si no hay errores y no se pone la bandera de error rroja en la columna N, pasa a ejecutar la MACRO RESERVAR, que nos lleva a la hoja Datos Cliente, rellenamos un dato de Cliente y pulsamos Registrar Cliente, si no hay errores, nos crea una copia de la hoja de Cliente, se registra en la Hoja Seguimiento de Clientes con sus 2 casillas de verificación y cuando un cliente retire o anule la reserva, lo clicamos para que quede constancia del estado de esa reserva. la operativa es sencilla, pero todas las macros refernetes a Formato Condicional, fallan con un Error 1004. No sé que hacer ya. He de comentarte entre todos los casos de formato condicional que valoro en la hoja, tambien existe uno en el que el valor de la celda es "", no sé si es allí donde radica el problema, pero fallan todos.

Si puedes echarle un vistazo te lo agradecería, te adjunto el fichero por Email para que lo veas funcionando. Se autoprotege automáticamente, pero si lo desproteges, no tiene contraseña, por si quieres ver alguna celda en particular.

Por otro lado en su día ya le puse formato condicional desde Excel Estilos y funcionaba todo correctamente, pero con Excel 2010. En Excel 2007 no sé su comportamiento.

Si no ves que puede fallar, ¿Tú crees que utilizando el formato condicional de Excel, no me dará problemas con Excel 2007 versión Inglés?

Las 2 opciones me funcionan bien.

En el archivo que te envié las 2 opciones funcionan bien.

Por eso te puse el formato condicional, no hay ninguna fórmula, no hay problema si está en inglés.

Te pone error porque tienes la hoja protegida, debes desprotegerla primero, de esta forma, antes de los cambios de color, desproteges la hoja con ActiveSheet. Unprotect, al final de los cambios, vuelves a proteger la hoja con ActiveSheet. Protect

Sub Alertas_N()
' Libro realizado por: Miguel Angel Franco Lommers
' Formato condicional para fuente e interior de celda de la columna N en hoja RESERVAR
' Carga cuando abrimos el libro o cuando nos poosicionamos sobre la misma hoja.
    ActiveSheet.Unprotect
    Set rng = Range("N9", "N16:N45")
    For Each celda In rng
        Select Case UCase(celda.Value)
        Case "E1"
            celda.Interior.Color = RGB(255, 0, 0)
            celda.Font.Color = RGB(255, 255, 255)
        Case "E2"
            celda.Interior.Color = RGB(255, 0, 0)
            celda.Font.Color = RGB(255, 255, 255)
        Case "E3"
            celda.Interior.Color = RGB(255, 0, 0)
            celda.Font.Color = RGB(255, 255, 255)
        Case ""
            celda.Interior.Color = RGB(255, 255, 255)
        End Select
    Next
    ActiveSheet.Protect
End Sub

Realiza los cambios para tus demás macros.

Saludos. Dante Amor

¡Gracias! Eres grande, voy a probar lo que me comentas, lo cierto es que con las demás macros tuve que hacer eso que  me comentas pero en las macros referenctes a formato condicional no lo pensé y tienes mucha razón. Lo pruebo. Muchas gracias por tu pronta respuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas