Objetivo: Formatar tabela dinâmica Excel automaticamente. VBA Excel.
No dia-a-dia muitas vezes a tabela dinâmica resolve nossos problemas, sendo uma das ferramentas mais úteis que o Excel nos oferece.
Com ela podemos sumarizar os dados e apresentá-los das mais diversas formas e com várias opções, mas há sempre formatações que realizamos sempre que as criamos.
Um exemplo disto é a alteração do nome dos campos de valor inseridos, retirando o “Contagem de” e o “Soma de”, e além disso formatando para repetir os valores das listas e formatar os valores para que fiquem no formato de Número separado por ponto e com duas casas decimais. Tudo isso consome tempo.
Encontrei um código VBA no site chandoo.org, ao qual realizei algumas alterações, colocando em português e acrescentando outras formatações que achava interessante.
Este código realiza uma formatação padrão na sua tabela dinâmica, bastando para isso você criar sua tabela dinâmica e, selecionando uma das suas células, executar a macro.
Veja neste artigo como copiar os procedimentos acima e incluir na sua pasta pessoal de Macros neste artigo: http://guiadoexcel.com.br/habilitando-a-guia-desenvolvedor-e-copiando-procedimentos-vba-sub-da-internet
Veja neste outro artigo como criar botões de atalho para os procedimentos criados para que eles fiquem conforme abaixo: http://guiadoexcel.com.br/criar-botoes-de-atalho-para-macros-e-procedimento-vba.
Abaixo o código fonte devidamente comentado e com as alterações citadas acima:
Sub InstantPivot()
'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
'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
Set lo = ActiveCell.ListObject
If lo Is Nothing Then Set lo = ActiveSheet.ListObjects.Add(xlSrcRange, Selection.CurrentRegion, , xlYes)
Set rng = Cells(ActiveSheet.UsedRange.Row, ActiveSheet.UsedRange.Columns.Count + ActiveSheet.UsedRange.Column + 1)
Set pc = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=lo)
Set pt = pc.CreatePivotTable(TableDestination:=rng)
Else:
'Verifica se o objeto pt é baseado em um ListObject.
' * Se for, definir como ListObject
' * Se não, retorna os dados para um ListObject
On Error Resume Next
Set lo = Range(pt.SourceData).ListObject
On Error GoTo errhandler
If lo Is Nothing Then
Set rng = Application.Evaluate(Application.ConvertFormula(pt.SourceData, xlR1C1, xlA1))
Set wksSource = rng.Parent
Set lo = wksSource.ListObjects.Add(xlSrcRange, rng, , xlYes)
pt.ChangePivotCache ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=lo.Name)
End If
End If
With pt
.ColumnGrand = True
.RowGrand = False
.RowAxisLayout xlTabularRow
.RepeatAllLabels xlRepeatLabels
.ShowTableStyleRowHeaders = False
.ShowDrillIndicators = False
.HasAutoFormat = False
.SaveData = False
.ManualUpdate = True
If ActiveCell.CurrentRegion.Cells.Count > 1 Then
For i = 1 To .PivotFields.Count - .DataFields.Count 'The .DataField.Count bit is just in case the pivot already exists
Set pf = .PivotFields(i)
With pf
If pf.Name "Values" Then
.Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
On Error Resume Next
.NumberFormat = lo.DataBodyRange.Cells(1, i).NumberFormat
On Error GoTo errhandler
End If
End With
Next i
End If
End With
' Obter DataFields para coincidir com a formatação do campo de origem
' Note-se que isso só vai ser necessárias no caso de que estamos
' executando este código em uma tabela dinâmica já existente
On Error GoTo errhandler
If pt.DataFields.Count > 0 Then
For Each pf In pt.DataFields
If pf.Function xlCount Then pf.NumberFormat = "#,##0.00" 'pt.PivotFields(pf.SourceName).NumberFormat
' Acabar com 'Soma de', se possível
On Error Resume Next
pf.Caption = pf.SourceName & " "
On Error GoTo errhandler
Next pf
End If
'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
'Tratamento de erros
Err.Clear
errhandler:
If Err.Number > 0 Then
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlAutomatic
End With
MsgBox "Atenção, ocorreu um erro: Error#" & Err.Number & vbCrLf & Err.Description _
, vbCritical, "Error", Err.HelpFile, Err.HelpContext
End If
End If
End Sub
Abraço
Marcos Rieper



