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 UCase
se 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 cel
en 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.