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

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.