Ocultar e exibir linhas com base em vários valores de células (comparação)

0

Estou tentando fazer uma comparação com os detalhes de algumas empresas (a, b, c, d), que é apresentada em uma lista suspensa nas células A1 e B1. Eu estou usando uma rotina VBA (apresentada mais abaixo) para esconder as linhas quando a linha inteira não tem valores, mas permanece unhidden mesmo com um valor presente

Para este exemplo 1, a rotina não deve ocultar nenhuma linha, mas ocultou as linhas 2 e 3, mas a linha 4 não está oculta

    A           B
1   Company A   Company B
2   las vegas
3               boston
4   north       north

Como posso ter certeza de que o VBA não ocultaria as linhas 2 e 3 no exemplo?

Eu usei o seguinte código:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range, c As Range

    Set r = range[a2:b3]
    Application.ScreenUpdating = False
    For Each c In r
        If Len(c.Value) > 0 Then
            c.EntireRow.Hidden = False
        Else
            c.EntireRow.Hidden = True
        End If
    Next c
    Application.ScreenUpdating = True
End Sub

O VBA que usei acima é útil apenas para uma coluna de valores, mas não para várias colunas para comparação.

Como posso conseguir isso?

    
por Craig Sia 08.11.2015 / 07:41

1 resposta

1

Estou um pouco intrigado com o seu problema. Quando eu tento executar sua rotina, ela fica imediatamente engasgada com a linha Set r = , porque Union() deve receber pelo menos dois argumentos. Mas, quando eu mudo isso para Set r = [a2:b3] , ele é executado e oculta a linha 2, mas deixa a linha 3 não exibida.

Isso é o que eu esperava que a rotina fizesse.

Ele verifica cada célula no intervalo A2:B3 individualmente e age nela. Ele atravessa o intervalo de cima para baixo, e depois da esquerda para a direita dentro de cada linha. (Pelo menos esse é o comportamento padrão; talvez seja possível alterá-lo.) Então é isso que acontece:

  1. Veja a célula A2 . Tem um valor, por isso, un ocultamos a linha 2.
  2. Veja a célula B2 . Não tem um valor, por isso, ocultamos a linha 2.
  3. Veja a célula A3 . Não tem um valor, por isso, ocultamos a linha 3.
  4. Veja a célula B3 . Tem um valor, por isso, un ocultamos a linha 3.

E então a linha 2 acaba oculta e a linha 3 acaba sendo exibida.

Você precisa olhar o intervalo, não apenas um monte de células , mas como um monte de linhas (cada uma delas é um monte de células). Você precisa ter outra variável, que assumirá valores lógicos (True / False). Para cada linha, comece definindo a variável como True, o que significa "sim, esta linha não tem dados, até onde eu sei". Então, para cada célula nessa linha, se a célula tiver um valor, defina a variável como False, o que significa "não, essa linha não está em branco". E depois de olhar para todas as células seguidas, defina o atributo Hidden da linha como o valor da variável.

    
por 08.11.2015 / 11:35