Ocultar filas basadas en múltiples celdas

Ocultar filas basadas en múltiples celdas

Mi base de datos se está volviendo enorme y estoy tratando de hacer las cosas un poco más manejables. Lo que básicamente estoy tratando de hacer es:

Si la celda E:E = "Completa", oculte la fila correspondiente
. De lo contrario, si la celda F:F = "Completa", oculte la misma fila/correspondiente.

Esto continuará durante las 52 semanas del año, más un número infinito de Filas dependiendo de los datos.

He probado un código simple:

Private Sub Worksheet_Change(check)

    If Range("E:Z") = Complete Then
        Rows("3:7000").EntireRow.Hidden = True
    Else
        Rows("3:7000").EntireRow.Hidden = False
    End If

Esto se compila pero no sucede mucho más.

Cualquier ayuda sería genial.

Respuesta1

Bien, analicemos esto.

Sus comandos abordan filas y columnas completas como bloques, pero en realidad no evalúan la celda actual. Un valor de texto en VBA debe estar entre comillas dobles; de lo contrario, Excel esperará que sea una variable u objeto con nombre.

Según tengo entendido, desea mirar las columnas E a Z para ingresar la palabra "Completo". El evento Worksheet_Change actúa sobre un Objetivo, es decir, la celda que se modificó. Para ver si la celda está en las columnas E a Z, puede verificar si Target se cruza con ese rango.

Intersect(Target, Range("E:Z"))

Este comando devuelve un objeto de rango. Si la celda modificada no está en el rango especificado, no se devuelve nada. Entonces, el siguiente es un poco doblemente negativo, pero queremos que sucedan cosas si el objeto de intersección esnoNADA. Este escribe lo siguiente

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
'   do something
End If

A continuación, desea comprobar si el valor de la celda de destino es "Completo". Podría ser una buena idea hacer que esto no distinga entre mayúsculas y minúsculas, por lo que envolver el objetivo en a UCasese encargará de eso.

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        ' some code to hide the row
    End If
End If

El código para ocultar la fila debe obtener el número de fila de la celda de destino. Eso se puede hacer con Target.Row, que luego se puede enviar al Rows()comando similar al que usó, pero solo para la fila de la celda de destino.

Rows(Target.Row).EntireRow.Hidden = True

Hasta ahora el código será

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        Rows(Target.Row).EntireRow.Hidden = True
    End If
End If

End Sub

... y eso funcionará para filas individuales. Pero si copia el "Completo" en varias filas de una sola vez, el objetivo contendrá más de una fila y el código deberá ajustarse para reflejar eso. Declare un rango llamado cel y luego recorra cada celda en el rango objetivo. Los comandos UCase y Rows ahora necesitarán dirigirse celen lugar deTarget

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cel As Range
If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    For Each cel In Target
        If UCase(cel.Value) = "COMPLETE" Then
            Rows(cel.Row).EntireRow.Hidden = True
        End If
    Next cel
End If

End Sub

Y ahí lo tienes.

información relacionada