Objetivo: Como classificar uma tabela dinâmica automaticamente no Excel.
A tabela dinâmica no Excel é uma poderosa ferramenta de análise.
Com ela o usuário pode unir grandes massas de dados, criando os seus próprios relatórios com os campos desta base, inclusive criando cálculos. Tudo muito rápido e prático.
No entanto uma das funcionalidades desta ferramenta não é muito prática. A classificação de dados nas tabelas dinâmicas podem ser bastante trabalhosas, principalmente quando se trata de valores.
Para se classificar os dados em uma tabela dinâmica, basta você clicar no botão sobre a coluna e clicar em classificar:
O problema consiste em quando queremos que a tabela dinâmica seja organizada por um determinado campo e este não é o primeiro campo, sendo necessário que todos os campos sejam classificados por este. Para isto deve-se clicar em uma coluna e clicar no botão de classificação e na opção Mais Opções de Classificação, selecionar se será classificado de forma crescente ou decrescente e o campo.
Esta operação tem que ser repetida para todos os campos da esquerda para a direita até o campo definido. O que gera um grande trabalho.
Os códigos VBA Excel criados abaixo realizam a classificação de forma crescente ou de forma decrescente, bastando clicar no título da coluna da tabela Excel e clicar no botão Classificar.
Para utilizar o código siga o passo-a-passo deste artigo: Habilitar a guia desenvolvedor no Excel e copiar códigos VBA da internet.
Sub lsClassificarTabelaDinamicaMaiorMenor()
'Baseado no site chandoo.org
' Programmer: Jeff Weir
' Contact: weir.jeff@gmail.com or jeff.weir@HeavyDutyDecisions.co.nz
'Formata a tabela dinâmica com sua formatação preferida, formatação default
'Configurações realizadas
' 1. Mostrar de forma tabulada os dados
' 2. Ligar a opção de repetir linhas
' 3. Desliga os subtotais
' 4. Liga o total final de coluna
' 5. Desliga a opção de ajustar a tabela dinâmica
' 7. Desliga a opção de salvar os dados da tabela dinâmica como arquivo
' 8. Formata os campos de soma de valor no formato decimal separado por ponto
' 9. Ajusta as colunas da tabela dinâmica
' 10. Retira do nome dos valores as descrições Contagem, Soma
Dim pc As PivotCache
Dim pf As PivotField
Dim pt As PivotTable
Dim lo As ListObject
Dim rng As Range
Dim strLabel As String
Dim strFormat As String
Dim i As Long
Dim wksSource As Worksheet
Dim lRange As String
'Verifica se estamos lidando com uma versão do Excel que suporta ListObjects
'Versões superiores ao Excel 2007
If Application.Version >= 14 Then
On Error Resume Next
Set pt = ActiveCell.PivotTable
On Error GoTo errhandler
If pt Is Nothing Then
MsgBox "Selecione o campo da tabela dinâmica pelo qual quer classificar!"
GoTo errhandler
End If
pt.PivotCache.Refresh
lCampo = pt.PivotFields(ActiveCell.Value).Name
lRange = ActiveCell.Address
'Limpa a classificação da tabela
With pt
If ActiveCell.CurrentRegion.Cells.Count > 1 Then
For i = 1 To .PivotFields.Count - .DataFields.Count
Set pf = .PivotFields(i)
With pf
.AutoSort xlManual, pf.SourceName
On Error Resume Next
On Error GoTo errhandler
End With
Next i
End If
End With
'Classifica a tabela pelo campo desejado
With pt
If ActiveCell.CurrentRegion.Cells.Count > 1 Then
For i = .PivotFields.Count - .DataFields.Count - 1 To 1 Step -1
Set pf = .PivotFields(i)
With pf
If pf.Name <> "Values" Then
.AutoSort xlDescending, lCampo
On Error Resume Next
On Error GoTo errhandler
End If
End With
Next i
End If
End With
'Calcula e atualiza a tela
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlAutomatic
End With
With pt
.ManualUpdate = False
.TableRange2.Select
End With
pt.PivotCache.MissingItemsLimit = xlMissingItemsNone
ActiveCell.CurrentRegion.EntireColumn.AutoFit
Range(lRange).Select
'Tratamento de erros
Err.Clear
errhandler:
If Err.Number > 0 Then
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlAutomatic
End With
If Err.Number = 1004 Then
MsgBox "Selecione o cabeçalho do campo da tabela dinâmica que quer classificar!"
Else
MsgBox "Atenção, ocorreu um erro: Error#" & Err.Number & vbCrLf & Err.Description _
, vbCritical, "Error", Err.HelpFile, Err.HelpContext
End If
End If
End If
End Sub
Sub lsClassificarTabelaDinamicaMenorMaior()
'Baseado no site chandoo.org
' Programmer: Jeff Weir
' Contact: weir.jeff@gmail.com or jeff.weir@HeavyDutyDecisions.co.nz
'Formata a tabela dinâmica com sua formatação preferida, formatação default
'Configurações realizadas
' 1. Mostrar de forma tabulada os dados
' 2. Ligar a opção de repetir linhas
' 3. Desliga os subtotais
' 4. Liga o total final de coluna
' 5. Desliga a opção de ajustar a tabela dinâmica
' 7. Desliga a opção de salvar os dados da tabela dinâmica como arquivo
' 8. Formata os campos de soma de valor no formato decimal separado por ponto
' 9. Ajusta as colunas da tabela dinâmica
' 10. Retira do nome dos valores as descrições Contagem, Soma
Dim pc As PivotCache
Dim pf As PivotField
Dim pt As PivotTable
Dim lo As ListObject
Dim rng As Range
Dim strLabel As String
Dim strFormat As String
Dim i As Long
Dim wksSource As Worksheet
Dim lRange As String
'Verifica se estamos lidando com uma versão do Excel que suporta ListObjects
'Versões superiores ao Excel 2007
If Application.Version >= 14 Then
On Error Resume Next
Set pt = ActiveCell.PivotTable
On Error GoTo errhandler
If pt Is Nothing Then
MsgBox "Selecione o campo da tabela dinâmica pelo qual quer classificar!"
GoTo errhandler
End If
pt.PivotCache.Refresh
lCampo = pt.PivotFields(ActiveCell.Value).Name
lRange = ActiveCell.Address
'Limpa a classificação da tabela
With pt
If ActiveCell.CurrentRegion.Cells.Count > 1 Then
For i = 1 To .PivotFields.Count - .DataFields.Count
Set pf = .PivotFields(i)
With pf
.AutoSort xlManual, pf.SourceName
On Error Resume Next
On Error GoTo errhandler
End With
Next i
End If
End With
'Classifica a tabela pelo campo desejado
With pt
If ActiveCell.CurrentRegion.Cells.Count > 1 Then
For i = .PivotFields.Count - .DataFields.Count - 1 To 1 Step -1
Set pf = .PivotFields(i)
With pf
If pf.Name "Values" Then
.AutoSort xlAscending, lCampo
On Error Resume Next
On Error GoTo errhandler
End If
End With
Next i
End If
End With
'Calcula e atualiza a tela
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlAutomatic
End With
With pt
.ManualUpdate = False
.TableRange2.Select
End With
pt.PivotCache.MissingItemsLimit = xlMissingItemsNone
ActiveCell.CurrentRegion.EntireColumn.AutoFit
Range(lRange).Select
'Tratamento de erros
Err.Clear
errhandler:
If Err.Number > 0 Then
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlAutomatic
End With
If Err.Number = 1004 Then
MsgBox "Selecione o cabeçalho do campo da tabela dinâmica que quer classificar!"
Else
MsgBox "Atenção, ocorreu um erro: Error#" & Err.Number & vbCrLf & Err.Description _
, vbCritical, "Error", Err.HelpFile, Err.HelpContext
End If
End If
End If
End Sub
Abraço
Marcos Rieper
Curso Excel Completo – Do Básico ao VBA
Quer aprender Excel do Básico, passando pela Avançado e chegando no VBA? Clique na imagem abaixo:








