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.
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
- Escrever uma macro que filtre tblReports apenas para fevereiro, usando
AutoFilter Field:=1. - Estender para filtrar a Região (Field:=2) apenas para "East" e "West" ao mesmo tempo, usando
xlFilterValues. - 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.
1. Filtrando para fevereiro
Field:=1refere-se à primeira coluna da Tabela, não da planilha — Month é a coluna 1 dentro detblReports, independentemente de qual coluna da planilha ela esteja fisicamente.Criteria1recebe o texto exato para o qual você está filtrando, entre aspas.- O comando
AutoFilteré aplicado emtbl.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 deOperator:=xlFilterValues— esquecer esse operador é o erro mais comum aqui. - Ambos os filtros (Month e Region) podem estar ativos ao mesmo tempo — basta chamar
AutoFilterduas vezes, uma para cada coluna.
3. Limpando filtros e classificando
- Verifique
tbl.AutoFilter.FilterModeantes de chamarShowAllData— chamar quando nada está filtrado gera um erro. - O objeto
Sortprecisa de.SortFields.Clearprimeiro, depois um.SortFields.Add2para 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.
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.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo