Macro para ocultar filas según color

Quisiera que me colaborara con la corrección de la siguiente macro:

Sub esconderfilas2()
Dim str
str = Range("K9:O9").Address
Range(str).Select
For i = 1 To 200
For Each str In Selection
If Selection.Interior.Color = RGB(51, 153, 102) Or Selection.Interior.Color = RGB(255, 255, 255) Then
ActiveCell.EntireRow.Hidden = True
Else
ActiveCell.EntireRow.Hidden = False
End If
ActiveCell.Offset(1, 0).Select
Next
Next i
End Sub

La idea es que la macro seleccione las celdas K9, L9, M9, N9, O9, y determine si todas tienen al menos el color verde RGB(51, 153, 102) o el color blanco RGB(255, 255, 255), de tal forma que si 4 de ellas tienen uno de estos dos colores pero la quinta no lo tiene entonces no oculte la fila entera, pero si 3 de ellas tienen el color verde y 2 el blanco especificado entonces se ocultará la fila (o en el caso que todos sean verdes o blancos).

1 Respuesta

Respuesta
2

Al leer tu pregunta me parece que se deben ocultar las columnas y en vez de las filas. Ya que no lo tengo claro, te cree dos funciones: La primera te oculta o muestra las filas y la segunda te oculta o muestra las columnas. A continuación te coloco el código con varios comentarios indicando la operación de las instrucciones.

'copiar desde aqui

Option Explicit
Dim Verde, Blanco, Rango
Sub esconderfilas3()
Dim str, ConteoBlancas, ConteoVerdes, ConteoOtroColor
'Aquí puedes cambiar los colores
Verde = 5287936 'RGB(51, 153, 102)
Blanco = RGB(255, 255, 255)
ConteoBlancas = 0
ConteoVerdes = 0
ConteoOtroColor = 0
Rango = "K9:O9"
str = Range(Rango).Address
Range(str).Select
'Primero contamos las Verdes, las blancas y otro color
For Each str In Selection
If str.Interior.Color = Verde Then
ConteoVerdes = ConteoVerdes + 1
ElseIf str.Interior.Color = Blanco Then
ConteoBlancas = ConteoBlancas + 1
Else
ConteoOtroColor = ConteoOtroColor + 1
End If
Next
'A partir de aquí colocas las condiciones que requieras
'Si cuatro tienen filas verdes
If ConteoVerdes = 4 Then
'No ocultar Filas Verdes, mostrar Filas Blancas
'OcultarFilas True, False
OcultarColumnas True, False
'Si cuatro tienen filas Blancas
ElseIf ConteoBlancas = 4 Then
'Mostrar Filas Blancas y Verdes
OcultarFilas False, False
'Si tres verdes y dos blancas oculta la fila
ElseIf ConteoVerdes = 3 And ConteoBlancas = 2 Then
'Ocultar Filas Verdes, Mostrar Filas Blancas
OcultarFilas False, True
'Si todas son verdes oculta la fila
ElseIf ConteoVerdes = 5 Then
'Ocultar Filas verdes
OcultarFilas False, True
'Si todas son blancas oculta la fila
ElseIf ConteoBlancas = 5 Then
OcultarFilas True, False
'Ocultar Filas
End If
End Sub
'Función que permite Ocultar las filas Blancas y Verdes
'Si OcultarBlancas= True, Oculta las blancas
'Si OcultarBlancas=False, Muestra las blancas
'Si OcultarVerdes=True, OCulta las verdes
'Si OcultarVerdes=False, muestra las Verdes
Function OcultarFilas(OcultarBlancas As Boolean, OcultarVerdes As Boolean)
Dim Celda, Fila
Celda = Range(Rango).Address
'Recorro nuevamente para verificar las verdes y blancas a Ocultar o Mostrar
For Each Celda In Selection
Fila = "" & Celda.Row & ":" & Celda.Row
If Celda.Interior.Color = Verde Then
'Oculta o Muestra la Fila Verde
Rows(Fila).EntireRow.Hidden = OcultarVerdes
ElseIf Celda.Interior.Color = Blanco Then
'Oculta o Muestra la Fila Blanca
Rows(Fila).EntireRow.Hidden = OcultarBlancas
End If
Next
End Function
'Función que permite ocutar o mostrar las columnas Blancas y verdes
Function OcultarColumnas(OcultarBlancas As Boolean, OcultarVerdes As Boolean)
Dim Celda, Columna
Celda = Range(Rango).Address
'Recorro nuevamente para verificar las verdes y blancas a Ocultar o Mostrar
For Each Celda In Selection
Columna = Celda.Column
If Celda.Interior.Color = Verde Then
'Oculta o Muestra la Columna Verde
Columns(Columna).EntireColumn.Hidden = OcultarVerdes
ElseIf Celda.Interior.Color = Blanco Then
'Oculta o Muestra la Columna Blanca
Columns(Columna).EntireColumn.Hidden = OcultarBlancas
End If
Next
End Function

'copiar hasta aqui

Recuerda, este fue desarrollado en office 2010

Un Abrazo

Juan Carlos

Hola muchas gracias por la respuesta. Copie todo el código y lo corrí pero no me funcionó, por lo tanto cree uno nuevo a partir del que me pasaste de acuerdo a lo poco que se de macros generando este:

Option Explicit
Dim Verde, Blanco, Rango, i
Sub esconderfilas3()
Dim str, ConteoBlancas, ConteoVerdes, ConteoOtroColor
Verde = RGB(51, 153, 102)
Blanco = RGB(255, 255, 255)
Rango = "K9:O9"
For i = 1 To 10
str = Range(Rango).Address
Range(str).Select
ConteoBlancas = 0
ConteoVerdes = 0
ConteoOtroColor = 0
For Each str In Selection
If str.Interior.Color = Verde Then
ConteoVerdes = ConteoVerdes + 1
ElseIf str.Interior.Color = Blanco Then
ConteoBlancas = ConteoBlancas + 1
Else
ConteoOtroColor = ConteoOtroColor + 1
End If
If ConteoOtroColor >= 1 Then
ActiveCell.EntireRow.Hidden = False
End If
Next
Next i
End Sub

La idea que me planteaste de contar las celdas con color verde y blanco en cada rango me parece interesante pues si el conjunto de celdas tienen al menos una celda con otro color no se debe ocultar. Ahora el problema es que no consigo que, al verificar el primer rango especificado (k9:o9), busque el que le sigue (k10:o10) y así sucesivamente. Me gustaría poder enviarte el archivo para que sea más claro lo que tengo y lo que deso conseguir.

Gracias.

Mi correo [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas