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 UCase
cuidará 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 cel
em 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á.