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

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

  1. Digite GenerateMonthlyReport exatamente 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.
  2. Altere targetMonth para "January" e execute novamente — confirme que o relatório é atualizado para refletir o novo mês.
  3. Adicione uma linha ao final do Sub, antes do MsgBox, que exporta a planilha Reports para PDF usando ExportAsFixedFormat conforme mostrado acima.
Dicas
expand arrow

1. Executando GenerateMonthlyReport como está

  • Certifique-se de que a planilha Pivot e a Tabela Dinâmica ptProfitByRegion do exercício anterior realmente existem — este Sub atualiza 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 Sub e confirme que a tabela Reports agora é filtrada para January.

3. Adicionando uma linha de exportação para PDF

  • Esta é exatamente a mesma linha ExportAsFixedFormat apresentada anteriormente no capítulo — você está exportando a planilha ws, 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.Path com um nome que inclua targetMonth, 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 MsgBox confirmar a conclusão — caso contrário, a mensagem de confirmação apareceria antes do arquivo realmente existir.
Solução
expand arrow
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.

Note
Nota

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.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 5

Pergunte à IA

expand

Pergunte à IA

ChatGPT

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

  1. Digite GenerateMonthlyReport exatamente 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.
  2. Altere targetMonth para "January" e execute novamente — confirme que o relatório é atualizado para refletir o novo mês.
  3. Adicione uma linha ao final do Sub, antes do MsgBox, que exporta a planilha Reports para PDF usando ExportAsFixedFormat conforme mostrado acima.
Dicas
expand arrow

1. Executando GenerateMonthlyReport como está

  • Certifique-se de que a planilha Pivot e a Tabela Dinâmica ptProfitByRegion do exercício anterior realmente existem — este Sub atualiza 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 Sub e confirme que a tabela Reports agora é filtrada para January.

3. Adicionando uma linha de exportação para PDF

  • Esta é exatamente a mesma linha ExportAsFixedFormat apresentada anteriormente no capítulo — você está exportando a planilha ws, 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.Path com um nome que inclua targetMonth, 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 MsgBox confirmar a conclusão — caso contrário, a mensagem de confirmação apareceria antes do arquivo realmente existir.
Solução
expand arrow
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.

Note
Nota

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.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

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