Criando Relatórios Automatizados
Deslize para mostrar o menu
O padrão de relatório mensal Todo relatório automatizado neste curso segue o mesmo formato: limpar o estado anterior, filtrar ou resumir os dados, atualizar ou reconstruir a saída visual, aplicar formatação de apresentação e confirmar a conclusão para o usuário.
Exemplo Prático: Relatório Mensal com Um Clique
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "March"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Apply export-ready formatting
With ws.PageSetup
.Orientation = xlLandscape
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = tbl.Range.Address
End With
' 5. Confirm completion
MsgBox targetMonth & " report is ready — filtered, " & _
"refreshed, and print-formatted."
End Sub
Os cinco comentários numerados não são apenas rótulos — eles representam literalmente o padrão de relatório apresentado anteriormente nesta seção, um passo para cada estágio. Alguns detalhes que merecem destaque:
targetMonth As String, definido com um valor fixo próximo ao topo, é a única linha que a tarefa pede para alterar para "January" — porque todos os passos seguintes leem dessa única variável, em vez de repetir a palavra "March" em outros pontos do Sub, assim, mudar o mês alvo do relatório nunca exige alterar mais de uma linha;- O passo 3 envolve o RefreshTable em On Error Resume Next / On Error GoTo 0 pelo mesmo motivo que o macro de construção de Tabela Dinâmica fez na seção 4.3: se a planilha Pivot ainda não existir, essa linha lançaria um erro e interromperia toda a macro do relatório, em vez de apenas pular um passo que ainda não está pronto;
- O passo 4, PrintArea = tbl.Range.Address, vincula a área de impressão diretamente ao endereço da Tabela, então se linhas forem adicionadas depois via ListRows.Add, a área de impressão ainda corresponderá exatamente aos dados — não é necessário manter a área de impressão separadamente;
- O passo 5, MsgBox, concatena targetMonth ao texto de confirmação, então a mensagem sempre informa qual mês foi realmente processado.
Atualização do Dashboard
Se uma pasta de trabalho contém várias Tabelas Dinâmicas e gráficos alimentando uma planilha de dashboard, RefreshAll recalcula todas as conexões de dados e PivotCache em uma única chamada — a versão de uma linha do que GenerateMonthlyReport faz manualmente para uma única Tabela Dinâmica: ThisWorkbook.RefreshAll
Essa única linha faz o mesmo trabalho do passo 3 em GenerateMonthlyReport, só que na escala da pasta de trabalho inteira, em vez de uma Tabela Dinâmica nomeada — útil quando um dashboard passa a incluir várias Tabelas Dinâmicas, conexões externas de dados ou consultas vinculadas que precisam permanecer sincronizadas.
Formatação pronta para exportação
Além da configuração de página, um relatório finalizado muitas vezes precisa sair do Excel. ExportAsFixedFormat gera um PDF diretamente pelo código:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path retorna a pasta onde a pasta de trabalho atual está salva, sem a barra invertida final — por isso o nome do arquivo é construído concatenando explicitamente "\March_Report.pdf". Se ThisWorkbook ainda não foi salvo, .Path retorna uma string vazia e essa linha tentaria salvar apenas como "\March_Report.pdf" na raiz do drive atual, então vale a pena confirmar que a pasta de trabalho foi salva pelo menos uma vez antes de confiar nesse padrão.
Tarefa
- Digite
GenerateMonthlyReportexatamente como mostrado (você precisará que a planilha Pivot do capítulo anterior já exista) e execute. Confirme que a tabela é filtrada para March e a Tabela Dinâmica é atualizada. - Altere targetMonth para "January" e execute novamente — confirme que o relatório é atualizado para refletir o novo mês.
- Adicione uma linha ao final do Sub, antes do MsgBox, que exporta a planilha Reports para PDF usando ExportAsFixedFormat conforme mostrado acima.
1. Executando GenerateMonthlyReport como está
- Certifique-se de que a planilha Pivot e a Tabela Dinâmica
ptProfitByRegiondo exercício anterior realmente existem — esteSubatualiza uma Tabela Dinâmica existente, não constrói uma do zero. - Digite o procedimento exatamente como mostrado, execute e verifique duas coisas: a tabela Reports deve agora estar filtrada para mostrar apenas as linhas de March, e os números da planilha Pivot devem refletir isso (embora a Tabela Dinâmica resuma todos os meses independentemente do filtro da Reports, já que PivotCaches leem o intervalo completo, não apenas a visualização filtrada).
2. Alterando targetMonth para January
- Apenas uma linha precisa ser alterada — a atribuição
targetMonth = "March"próxima ao topo. - Execute novamente todo o
Sube confirme que a tabela Reports agora é filtrada para January.
3. Adicionando uma linha de exportação para PDF
- Esta é exatamente a mesma linha
ExportAsFixedFormatapresentada anteriormente no capítulo — você está exportando a planilhaws, não a pasta de trabalho inteira. - Construa o nome do arquivo da mesma forma que o exemplo de geração de fatura do capítulo: combine
ThisWorkbook.Pathcom um nome que incluatargetMonth, para que cada execução produza um arquivo com nome distinto, em vez de sobrescrever o mesmo arquivo toda vez. - A posição importa: precisa ser após os passos de filtragem/atualização/formatação, mas antes da mensagem final do
MsgBoxconfirmar a conclusão — caso contrário, a mensagem de confirmação apareceria antes do arquivo realmente existir.
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim chtObj As ChartObject
Dim printRange As Range
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "January"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Build a print area that covers the table AND the chart
On Error Resume Next
Set chtObj = ws.ChartObjects(1)
If Not chtObj Is Nothing Then
Set printRange = Union(tbl.Range, ws.Range(chtObj.TopLeftCell.Address, _
chtObj.BottomRightCell.Address))
Else
Set printRange = tbl.Range
End If
On Error GoTo 0
On Error Resume Next
With ws.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = printRange.Address
End With
On Error GoTo 0
' 5. Export the filtered report to PDF
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & targetMonth & "_Report.pdf", _
Quality:=xlQualityStandard
' 6. Confirm completion
MsgBox targetMonth & " report is ready — filtered, refreshed, and exported."
End Sub
Execute uma vez com targetMonth = "March" e outra com "January" — você deverá obter dois PDFs separados (March_Report.pdf e January_Report.pdf) ao lado da sua pasta de trabalho, cada um refletindo os dados filtrados corretamente no momento da execução.
Se uma caixa de diálogo aparecer pedindo para você escolher uma impressora (em vez de o código falhar imediatamente), selecione qualquer opção disponível — incluindo "Microsoft Print to PDF", "Microsoft XPS Document Writer" ou qualquer outra impressora listada, até mesmo um driver de fax. A impressora específica escolhida não importa aqui; o VBA só precisa de alguma impressora selecionada para satisfazer o processo de PageSetup/exportação, já que o Excel executa essas operações pelo subsistema de impressão nos bastidores, independentemente de qual impressora esteja ativa.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Criando Relatórios Automatizados
O padrão de relatório mensal Todo relatório automatizado neste curso segue o mesmo formato: limpar o estado anterior, filtrar ou resumir os dados, atualizar ou reconstruir a saída visual, aplicar formatação de apresentação e confirmar a conclusão para o usuário.
Exemplo Prático: Relatório Mensal com Um Clique
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "March"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Apply export-ready formatting
With ws.PageSetup
.Orientation = xlLandscape
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = tbl.Range.Address
End With
' 5. Confirm completion
MsgBox targetMonth & " report is ready — filtered, " & _
"refreshed, and print-formatted."
End Sub
Os cinco comentários numerados não são apenas rótulos — eles representam literalmente o padrão de relatório apresentado anteriormente nesta seção, um passo para cada estágio. Alguns detalhes que merecem destaque:
targetMonth As String, definido com um valor fixo próximo ao topo, é a única linha que a tarefa pede para alterar para "January" — porque todos os passos seguintes leem dessa única variável, em vez de repetir a palavra "March" em outros pontos do Sub, assim, mudar o mês alvo do relatório nunca exige alterar mais de uma linha;- O passo 3 envolve o RefreshTable em On Error Resume Next / On Error GoTo 0 pelo mesmo motivo que o macro de construção de Tabela Dinâmica fez na seção 4.3: se a planilha Pivot ainda não existir, essa linha lançaria um erro e interromperia toda a macro do relatório, em vez de apenas pular um passo que ainda não está pronto;
- O passo 4, PrintArea = tbl.Range.Address, vincula a área de impressão diretamente ao endereço da Tabela, então se linhas forem adicionadas depois via ListRows.Add, a área de impressão ainda corresponderá exatamente aos dados — não é necessário manter a área de impressão separadamente;
- O passo 5, MsgBox, concatena targetMonth ao texto de confirmação, então a mensagem sempre informa qual mês foi realmente processado.
Atualização do Dashboard
Se uma pasta de trabalho contém várias Tabelas Dinâmicas e gráficos alimentando uma planilha de dashboard, RefreshAll recalcula todas as conexões de dados e PivotCache em uma única chamada — a versão de uma linha do que GenerateMonthlyReport faz manualmente para uma única Tabela Dinâmica: ThisWorkbook.RefreshAll
Essa única linha faz o mesmo trabalho do passo 3 em GenerateMonthlyReport, só que na escala da pasta de trabalho inteira, em vez de uma Tabela Dinâmica nomeada — útil quando um dashboard passa a incluir várias Tabelas Dinâmicas, conexões externas de dados ou consultas vinculadas que precisam permanecer sincronizadas.
Formatação pronta para exportação
Além da configuração de página, um relatório finalizado muitas vezes precisa sair do Excel. ExportAsFixedFormat gera um PDF diretamente pelo código:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path retorna a pasta onde a pasta de trabalho atual está salva, sem a barra invertida final — por isso o nome do arquivo é construído concatenando explicitamente "\March_Report.pdf". Se ThisWorkbook ainda não foi salvo, .Path retorna uma string vazia e essa linha tentaria salvar apenas como "\March_Report.pdf" na raiz do drive atual, então vale a pena confirmar que a pasta de trabalho foi salva pelo menos uma vez antes de confiar nesse padrão.
Tarefa
- Digite
GenerateMonthlyReportexatamente como mostrado (você precisará que a planilha Pivot do capítulo anterior já exista) e execute. Confirme que a tabela é filtrada para March e a Tabela Dinâmica é atualizada. - Altere targetMonth para "January" e execute novamente — confirme que o relatório é atualizado para refletir o novo mês.
- Adicione uma linha ao final do Sub, antes do MsgBox, que exporta a planilha Reports para PDF usando ExportAsFixedFormat conforme mostrado acima.
1. Executando GenerateMonthlyReport como está
- Certifique-se de que a planilha Pivot e a Tabela Dinâmica
ptProfitByRegiondo exercício anterior realmente existem — esteSubatualiza uma Tabela Dinâmica existente, não constrói uma do zero. - Digite o procedimento exatamente como mostrado, execute e verifique duas coisas: a tabela Reports deve agora estar filtrada para mostrar apenas as linhas de March, e os números da planilha Pivot devem refletir isso (embora a Tabela Dinâmica resuma todos os meses independentemente do filtro da Reports, já que PivotCaches leem o intervalo completo, não apenas a visualização filtrada).
2. Alterando targetMonth para January
- Apenas uma linha precisa ser alterada — a atribuição
targetMonth = "March"próxima ao topo. - Execute novamente todo o
Sube confirme que a tabela Reports agora é filtrada para January.
3. Adicionando uma linha de exportação para PDF
- Esta é exatamente a mesma linha
ExportAsFixedFormatapresentada anteriormente no capítulo — você está exportando a planilhaws, não a pasta de trabalho inteira. - Construa o nome do arquivo da mesma forma que o exemplo de geração de fatura do capítulo: combine
ThisWorkbook.Pathcom um nome que incluatargetMonth, para que cada execução produza um arquivo com nome distinto, em vez de sobrescrever o mesmo arquivo toda vez. - A posição importa: precisa ser após os passos de filtragem/atualização/formatação, mas antes da mensagem final do
MsgBoxconfirmar a conclusão — caso contrário, a mensagem de confirmação apareceria antes do arquivo realmente existir.
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim chtObj As ChartObject
Dim printRange As Range
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "January"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Build a print area that covers the table AND the chart
On Error Resume Next
Set chtObj = ws.ChartObjects(1)
If Not chtObj Is Nothing Then
Set printRange = Union(tbl.Range, ws.Range(chtObj.TopLeftCell.Address, _
chtObj.BottomRightCell.Address))
Else
Set printRange = tbl.Range
End If
On Error GoTo 0
On Error Resume Next
With ws.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = printRange.Address
End With
On Error GoTo 0
' 5. Export the filtered report to PDF
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & targetMonth & "_Report.pdf", _
Quality:=xlQualityStandard
' 6. Confirm completion
MsgBox targetMonth & " report is ready — filtered, refreshed, and exported."
End Sub
Execute uma vez com targetMonth = "March" e outra com "January" — você deverá obter dois PDFs separados (March_Report.pdf e January_Report.pdf) ao lado da sua pasta de trabalho, cada um refletindo os dados filtrados corretamente no momento da execução.
Se uma caixa de diálogo aparecer pedindo para você escolher uma impressora (em vez de o código falhar imediatamente), selecione qualquer opção disponível — incluindo "Microsoft Print to PDF", "Microsoft XPS Document Writer" ou qualquer outra impressora listada, até mesmo um driver de fax. A impressora específica escolhida não importa aqui; o VBA só precisa de alguma impressora selecionada para satisfazer o processo de PageSetup/exportação, já que o Excel executa essas operações pelo subsistema de impressão nos bastidores, independentemente de qual impressora esteja ativa.
Obrigado pelo seu feedback!