Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Classificação e Filtragem de Dados | Automatizando Tabelas e Relatórios
VBA do Excel para Automação Empresarial

Classificação e Filtragem de Dados

Deslize para mostrar o menu

A filtragem restringe o que está visível sem alterar os dados subjacentes — fundamental para criar um relatório que exiba apenas um mês ou uma região por vez.

Figura 4.2

AutoFiltro Básico

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter não exclui nem move nenhum dado — apenas oculta as linhas que não correspondem, exatamente como se você clicasse na seta suspensa e desmarcasse tudo, exceto January, manualmente. Field:=1 conta as colunas a partir de 1 dentro da própria Tabela (Month, Region, Sales, Expenses, Profit, Target — portanto, Region seria Field:=2, Profit Field:=5), por isso essa linha precisa ser mantida em sincronia caso as colunas sejam reordenadas.

Filtros com Múltiplas Condições

Filtrar para mais de um valor na mesma coluna exige xlFilterValues e um array de critérios:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

Compare com o filtro de valor único acima: Criteria1 agora contém um Array(...) de valores aceitáveis em vez de uma única string, e Operator:=xlFilterValues é o que informa ao AutoFilter para tratar esse array como uma lista de correspondências, em vez de tentar interpretá-lo como uma única expressão de critério. Se omitir Operator:=xlFilterValues, essa linha pode gerar erro ou se comportar de forma inesperada — é fácil esquecer e vale a pena conferir sempre que Criteria1 for uma lista.

Filtrar por uma condição numérica — por exemplo, apenas linhas onde Profit excede Target por uma boa margem — utiliza operadores de comparação:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

Note que ">15000" é escrito como texto entre aspas, mesmo sendo uma comparação numérica — o AutoFilter sempre espera Criteria1 como uma string, e ele mesmo interpreta o símbolo >. Escrever Criteria1:=15000 sem o > filtraria apenas as linhas exatamente iguais a 15000, em vez de maiores que esse valor, o que é um erro comum.

Ordenação

O objeto Sort suporta múltiplas chaves, exatamente como a caixa de diálogo Dados → Classificar:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear é executado primeiro para que chaves de ordenação remanescentes de uma execução anterior da macro (ou de uma ordenação manual feita pelo usuário) não se combinem silenciosamente com as novas — sempre limpe antes de adicionar. A ordem em que as duas chamadas .Add2 aparecem importa tanto quanto suas configurações Order:=xlAscending/xlDescending: a primeira adicionada se torna a chave primária de ordenação (Month), e a segunda serve como critério de desempate dentro de cada grupo (Profit, do maior para o menor dentro de cada mês). .Header = xlYes informa ao Excel que a linha 1 é um cabeçalho e nunca deve ser movida pela ordenação; .Apply é o comando que realmente executa a ordenação — tudo antes disso apenas monta as instruções.

Limpar Filtros

Sempre limpe os filtros no início de uma macro de relatório, para que cada execução comece de um estado conhecido e sem filtros:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode é um valor Boolean que fica True sempre que algum filtro está restringindo as linhas visíveis da Tabela — verificar isso antes evita um erro de execução, já que chamar ShowAllData quando nada está filtrado gera um erro em vez de simplesmente não fazer nada.

Tarefa

  1. Escrever uma macro que filtre tblReports apenas para fevereiro, usando AutoFilter Field:=1.
  2. Estender para filtrar a Região (Field:=2) apenas para "East" e "West" ao mesmo tempo, usando xlFilterValues.
  3. Limpar ambos os filtros e, em seguida, classificar a tabela por Região em ordem crescente e depois por Lucro em ordem decrescente, utilizando o objeto Sort mostrado acima.
Dica
expand arrow

1. Filtrando para fevereiro

  • Field:=1 refere-se à primeira coluna da Tabela, não da planilha — Month é a coluna 1 dentro de tblReports, independentemente de qual coluna da planilha ela esteja fisicamente.
  • Criteria1 recebe o texto exato para o qual você está filtrando, entre aspas.
  • O comando AutoFilter é aplicado em tbl.Range, não diretamente na planilha.

2. Adicionando o filtro de Região

  • Região é a segunda coluna da tabela, então é um número Field:= diferente do filtro de Month.
  • Para filtrar dois valores na mesma coluna, utilize Criteria1:=Array(...) com ambos os valores, além de Operator:=xlFilterValues — esquecer esse operador é o erro mais comum aqui.
  • Ambos os filtros (Month e Region) podem estar ativos ao mesmo tempo — basta chamar AutoFilter duas vezes, uma para cada coluna.

3. Limpando filtros e classificando

  • Verifique tbl.AutoFilter.FilterMode antes de chamar ShowAllData — chamar quando nada está filtrado gera um erro.
  • O objeto Sort precisa de .SortFields.Clear primeiro, depois um .SortFields.Add2 para cada nível de ordenação — a ordem em que você adiciona define qual é a chave primária e qual é o critério de desempate, não a ordem em que aparecem na tabela.
  • Região em ordem crescente deve ser adicionada antes de Lucro em ordem decrescente, já que Região é a ordenação principal.
Solução
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

Execute FilterFebruaryEastWest e você verá apenas as linhas de fevereiro para as regiões East e West visíveis. Depois, execute ClearFiltersAndSort — todas as linhas reaparecem, ordenadas primeiro por Região (alfabeticamente) e, dentro de cada Região, o maior Lucro aparece primeiro.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 2

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 4. Capítulo 2
some-alt