VBA colorear rangos discontinuos si se da una condición

Te hago otra consulta, recién estoy empezando con las macros y tengo muchísimas dudas.

Quiero colorear de amarillo un rango de celdas discontinuos si se da una condición.

Ej.

Si la celda C3 es > 0 y <5, coloree las celdas E3, E23, E43, E63, E83, E103, E123, E143, cuyos valores sean menores a 0.70.

Pero si C3 = 5 coloree las celdas E3, E23, E43, E63, E83, E103, E123, E143, cuyos valores sean menores a 0.66.

Si la celda C4, es > 0 y <5, coloree las celdas E4, E24, E44, E64, E84, E104, E124, E144, que sean menores a 0.70.

Pero si C4 = 5 coloree las celdas E4, E24, E44, E64, E84, E104, E124, E144,, que sean menores a 0.66.

Y así sucesivamente...

Intente hacerlo, pero me colorea todo el rango.

1 respuesta

Respuesta
1

.02/11/16

Buenas noches, Pablo

Digamos primero que lo que querés hacer es muy complicado para iniciarse en macros.

Hasta tal vez podría resolverse con Formato Condicional aunque también sería difícil.

Es posible hacer eso dejando una rutina de Visual Basic basada en eventos.

Para que funcione, activá el editor de Visual Basic (presiona Alt+F11) y en el panel de la izquierda buscá la hoja donde queres que esto ocurra. Da doble click sobre ella. (Otra forma de llegar a este punto es hacer click derecho sobre la solapa de esta hoja y elegir la opción "Ver Código)

Allí pegá el siguiente código:

Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== PABLO, modifica estos datos de acuerdo a tu proyecto:
    IniCelda = "C3" ' Primer celda donde tomar
    LimInferior = 0 'dato para comparar el valor en la celda de la columna C
    LimSuperior = 5 'dato para comparar el valor en la celda de la columna C
    TopeMenor = 0.7 'dato para comparar el valor en la celda de la columna E si en C es menor que 5
    TopeIgual = 0.66 'dato para comparar el valor en la celda de la columna E si es igual a 5
    CadaLineas = 20 'Distancia entre celdas a colorear
    CantCeldas = 7 ' cantidad de celda a colorear
    DesvCol = 2 ' columnas a la derecha de la referencia (o sea la columna E)
    ColorCelda = 20 ' código de color a dar a las celdas
'---- fin Variables
'
'---- inicio de rutina:
'  
ColTarget = Target.Column
ColContr = Range(IniCelda).Column
If ColContr = ColTarget Then
    If Target.Offset(0, 0).Value > LimInferior And Target.Offset(0, 0).Value < LimSuperior Then
        Tope = TopeMenor
    ElseIf Target.Offset(0, 0).Value = LimSuperior Then
        Tope = TopeIgual
    Else
        Tope = 1
    End If
    For LaFila = 0 To CantCeldas
        With Target.Offset(LaFila * CadaLineas, DesvCol)
            If Tope = 1 Then
                .Interior.ColorIndex = 0
            Else
                If .Value < Tope Then
                    .Interior.ColorIndex = ColorCelda
                Else
                    .Interior.ColorIndex = 0
                End If
            End If
        End With
    Next
End If
End Sub

Como verás, hay algunas variables al principio del código que orientan a la rutina a ver donde actuar y los límites a considerar. Al lado de cada una de ellas está una explicación.

Esta es una rutina automática que funciona cada vez que se ingrese un dato en la columna C.

Gracias por responder,

no me esta sirviendo la rutina basada en eventos, porque la idea es anidar esa macro a otras que ya tengo armadas.

La columna C que puse tiene que ser mayor que 0 y menor que 5 son fechas( lunes es 1, martes 2....).

SI necesitas mas información para poder responderme avisame.

Saludos

.

Ok, Pablo

Podrás usar aquella misma rutina con algunas adaptaciones.

El asunto es que dependerá de la celda seleccionada para colorear las que correspondan de acuerdo a la posición relativa a ella que aplique

Te pasó -a continuación- el código que pedías:

Sub ColorEa()
'---- Variables modificables ----
'=== PABLO, modifica estos datos de acuerdo a tu proyecto:
    IniCelda = "C3" ' Primer celda donde tomar
    LimInferior = 0 'dato para comparar el valor en la celda de la columna C
    LimSuperior = 5 'dato para comparar el valor en la celda de la columna C
    TopeMenor = 0.7 'dato para comparar el valor en la celda de la columna E si en C es menor que 5
    TopeIgual = 0.66 'dato para comparar el valor en la celda de la columna E si es igual a 5
    CadaLineas = 20 'Distancia entre celdas a colorear
    CantCeldas = 7 ' cantidad de celda a colorear
    DesvCol = 2 ' columnas a la derecha de la referencia (o sea la columna E)
    ColorCelda = 20 ' código de color a dar a las celdas
'---- fin Variables
'
'---- inicio de rutina:
'
ColContr = Left(IniCelda, 1) & ActiveCell.Row
Range(ColContr).Select
    If ActiveCell.Offset(0, 0).Value > LimInferior And ActiveCell.Offset(0, 0).Value < LimSuperior Then
        Tope = TopeMenor
    ElseIf ActiveCell.Offset(0, 0).Value = LimSuperior Then
        Tope = TopeIgual
    Else
        Tope = 1
    End If
    For LaFila = 0 To CantCeldas
        With ActiveCell.Offset(LaFila * CadaLineas, DesvCol)
            If Tope = 1 Then
                .Interior.ColorIndex = 0
            Else
                If .Value < Tope Then
                    .Interior.ColorIndex = ColorCelda
                Else
                    .Interior.ColorIndex = 0
                End If
            End If
        End With
    Next
End Sub

Bien, espero que te sirva como necesitás. Avisame si no.

Abrazo

Fer

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas