Relatórios mensais que seguem o mesmo padrão — copiar dados, formatar, nomear o arquivo com a data, salvar como PDF — são candidatos perfeitos para automação com VBA. O que leva 30 minutos de trabalho manual repetitivo pode virar um clique.
Estrutura de uma macro de relatório
Sub GeraRelatórioMensal()
' 1. Referências
Dim wsData As Worksheet, wsReport As Worksheet
Dim ultimaLinha As Long
Set wsData = ThisWorkbook.Sheets("Dados")
Set wsReport = ThisWorkbook.Sheets("Relatório")
' 2. Limpar relatório anterior
wsReport.Cells.ClearContents
' 3. Copiar dados do mês atual
ultimaLinha = wsData.Cells(Rows.Count, "A").End(xlUp).Row
wsData.Range("A1:F" & ultimaLinha).Copy
wsReport.Range("A1").PasteSpecial xlPasteValues
Application.CutCopyMode = False
' 4. Formatar
wsReport.Rows(1).Font.Bold = True
wsReport.Rows(1).Interior.Color = RGB(26, 58, 110)
wsReport.Rows(1).Font.Color = RGB(255, 255, 255)
wsReport.Columns("A:F").AutoFit
' 5. Salvar como PDF
Dim nomeArquivo As String
nomeArquivo = "Relatório_" & Format(Now, "YYYY-MM") & ".pdf"
wsReport.ExportAsFixedFormat xlTypePDF, _
ThisWorkbook.Path & "" & nomeArquivo
MsgBox "Relatório gerado: " & nomeArquivo, vbInformation
End Sub
Filtrando dados pelo mês atual
' Filtrar coluna de data (coluna C) pelo mês atual
wsData.Range("A1:F" & ultimaLinha).AutoFilter _
Field:=3, _
Criteria1:=">=" & CStr(DateSerial(Year(Now), Month(Now), 1)), _
Operator:=xlAnd, _
Criteria2:="<" & CStr(DateSerial(Year(Now), Month(Now)+1, 1))
Filtre antes de copiar para o relatório.
Adicionando totais automaticamente
' Após copiar, adicionar linha de total
Dim ultimaLinhaRel As Long
ultimaLinhaRel = wsReport.Cells(Rows.Count, "A").End(xlUp).Row + 1
wsReport.Cells(ultimaLinhaRel, 1).Value = "TOTAL"
wsReport.Cells(ultimaLinhaRel, 5).Formula = _
"=SUM(E2:E" & (ultimaLinhaRel-1) & ")"
wsReport.Cells(ultimaLinhaRel, 5).Font.Bold = True
Enviando por e-mail (Outlook)
Sub EnviaRelatorio()
Dim outlook As Object, email As Object
Set outlook = CreateObject("Outlook.Application")
Set email = outlook.CreateItem(0)
email.To = "gestor@empresa.com.br"
email.Subject = "Relatório Mensal - " & Format(Now, "MMMM YYYY")
email.Body = "Segue em anexo o relatório do mês."
email.Attachments.Add ThisWorkbook.Path & "\Relatório_" & _
Format(Now, "YYYY-MM") & ".pdf"
email.Send
MsgBox "E-mail enviado com sucesso!"
End Sub
Boas práticas
- Use
Application.ScreenUpdating = Falseno início eTrueno fim para a macro rodar sem piscar a tela - Use
Application.DisplayAlerts = Falsepara suprimir confirmações desnecessárias durante a execução - Sempre trate erros com
On Error GoTo TrataErroe um bloco de tratamento no final - Teste a macro em uma cópia do arquivo antes de usar em produção
Perguntas frequentes
A macro de e-mail funciona sem o Outlook instalado?
Não. O método CreateObject("Outlook.Application") requer o Outlook instalado e configurado com uma conta. Para enviar sem Outlook, use CDO (Collaboration Data Objects) com configuração SMTP direta.
Como agendar a macro para rodar automaticamente sem abrir o arquivo?
Use o Agendador de Tarefas do Windows para abrir o Excel com o arquivo e executar a macro. O comando é: excel.exe /e /r "C:\caminhorquivo.xlsm" com uma macro Auto_Open ou evento Workbook_Open.