Ocultar linhas com base em múltiplas células

Ocultar linhas com base em múltiplas células

Meu banco de dados está ficando enorme e estou tentando tornar as coisas um pouco mais gerenciáveis. O que estou basicamente tentando fazer é:

Se a célula E:E = "Completa" oculta a linha correspondente
Caso contrário, se a célula F:F = "Completa" oculta a mesma linha/correspondente

Isso continuará durante as 52 semanas do ano, além de um número infinito de linhas dependendo dos dados

Eu tentei um código simples:

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

Isso compila, mas não acontece muito mais.

Qualquer ajuda seria ótimo.

Responder1

OK, vamos separar isso.

Seus comandos endereçam linhas e colunas inteiras como blocos, mas na verdade não avaliam a célula atual. Um valor de texto no VBA deve estar entre aspas duplas, caso contrário, o Excel esperará que seja uma variável ou objeto nomeado.

Pelo que entendi, você deseja examinar as colunas E a Z para inserir a palavra "Completo". O evento Worksheet_Change atua sobre um Target, ou seja, a célula que foi alterada. Para ver se a célula está nas colunas E a Z, você pode verificar se Target cruza esse intervalo.

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

Este comando retorna um objeto de intervalo. Se a célula alterada não estiver no intervalo especificado, nada será retornado. Então, o próximo é um pouco negativo duplo, mas queremos que as coisas aconteçam se o objeto de interseção fornãoNADA. Isso escreve da seguinte maneira

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

Em seguida você deseja verificar se o valor da célula de destino é “Completo”. Pode ser uma boa ideia fazer com que isso não faça distinção entre maiúsculas e minúsculas, então agrupar target em a UCasecuidará disso.

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

O código para ocultar a linha precisa obter o número da linha da célula de destino. Isso pode ser feito com Target.Row, que pode então ser alimentado no Rows()comando semelhante ao que você usou, mas apenas para a linha da célula de destino.

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

Até agora o 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

... e isso funcionará para linhas individuais. Mas se você copiar o "Completo" em várias linhas de uma só vez, o destino conterá mais de uma linha e o código precisará ser ajustado para refletir isso. Declare um intervalo chamado cel e, em seguida, percorra cada cel no intervalo de destino. Os comandos UCase e Rows agora precisarão endereçar celem vez 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

E aí está.

informação relacionada