Capítulo 18: Automação Integrada com Microsoft Outlook (Disparo em Lote)

🎯 Objetivo da Aula

Nesta aula, você aprenderá as técnicas corporativas de Interoperabilidade entre Aplicativos do Office (Office Interop). Você descobrirá como controlar o Microsoft Outlook a partir do VBA do Excel, gerando mensagens eletrônicas personalizadas em formato HTML (.HTMLBody), convertendo intervalos da planilha em arquivos PDF de forma autônoma (.ExportAsFixedFormat) e disparando comunicados com anexos em lote (.Attachments.Add e .Send).

Ao final desta aula, você terá desenvolvido o robô de faturamento e disparo de faturas eletrônicas da FastLog S.A.


🏢 Cenário Prático (FastLog S.A.)

Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: Toda sexta-feira, o departamento de contas a receber emitia as faturas de cobrança de 60 clientes corporativos (grandes indústrias e varejistas). O assistente gastava mais de 3 horas em uma rotina braçal exaustiva: filtrava o cliente na planilha, exportava a fatura como PDF, abria o Outlook, digitava o e-mail do cliente, anexava o arquivo gerado e clicava em enviar um a um. Quando errava o anexo, enviava a fatura de uma empresa para o concorrente, gerando quebras de sigilo comercial e incidentes na LGPD.
Sua Missão: Desenvolver o robô corporativo DispararFaturasLote, que percorre a planilha de clientes, gera o comprovante de faturamento em PDF na pasta de arquivos, formata um e-mail corporativo em HTML e realiza o disparo automatizado pelo Outlook em segundos, registrando o status de entrega na própria planilha.


🧠 Fundamentos: A Teoria Traduzida

1. Interoperabilidade entre Excel e Outlook

O VBA do Excel pode se conectar a qualquer aplicativo do Windows que implemente a arquitetura COM. Com o Outlook, instanciamos a aplicação em segundo plano:

flowchart TD
    EXCEL["📊 Excel VBA (Base de Clientes)"] --> PDF["📄 ExportAsFixedFormat (Gera Fatura em PDF)"]
    EXCEL --> OUTLOOK["✉️ Outlook.Application (Late Binding)"]
    OUTLOOK --> MAIL["📬 CreateItem(0) - MailItem"]
    
    subgraph MENSAGEM["Composição do E-mail"]
        MAIL --> T1[".To = 'financeiro@cliente.com'"]
        MAIL --> T2[".Subject = 'Fatura FastLog MDF-101'"]
        MAIL --> T3[".HTMLBody = 'Olá, segue fatura...'"]
        MAIL --> T4[".Attachments.Add = 'Caminho_PDF'"]
    end
    
    MAIL --> ENVIO{"Método de Saída"}
    ENVIO -- .Display --> PREVIEW["👁️ Abre na Tela para Conferência"]
    ENVIO -- .Send --> DISPARO["🚀 Disparo em Segundo Plano"]

    style EXCEL fill:#217346,stroke:#fff,stroke-width:2px,color:#fff
    style PDF fill:#c0392b,stroke:#fff,stroke-width:2px,color:#fff
    style OUTLOOK fill:#0072c6,stroke:#fff,stroke-width:2px,color:#fff
    style MAIL fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff
    style MENSAGEM fill:#2c3e50,stroke:#fff,stroke-width:2px,color:#fff
    style ENVIO fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
    style PREVIEW fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style DISPARO fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff

2. Formatação Profissional com .HTMLBody

Nunca envie e-mails corporativos com texto puro (.Body). A propriedade .HTMLBody permite estilizar fontes, tabelas e cores corporativas utilizando tags HTML padrão:

  • <p style='font-family: Arial;'>: Define a fonte institucional.
  • <b>Texto</b>: Destaca valores e datas em negrito.
  • <br/>: Quebra de linha.

3. Geração Automática de PDF no Excel

O Excel possui o método nativo .ExportAsFixedFormat para gerar arquivos PDF em fração de segundo:

1
2
3
wsFatura.ExportAsFixedFormat Type:=xlTypePDF, _
                             Filename:="C:\FastLog_Faturas\Fatura_101.pdf", _
                             Quality:=xlQualityStandard

📖 Exemplo Guiado: Passo a Passo no Laboratório

No computador do laboratório, acesse o VBE com Alt + F11.

Passo 1: Inserção do Módulo de Automação de E-mails

  1. No menu superior, clique em Inserir ➔ Módulo.
  2. Na janela de propriedades (F4), renomeie o módulo para: modAutomacaoOutlook.
  3. Confirme a presença de Option Explicit.

Passo 2: Estruturação dos Dados de Faturamento no Excel

Na Planilha 1, monte a base na linha 1:

  • A1: ID_Fatura
  • B1: Nome_Cliente
  • C1: Email_Contato
  • D1: Valor_Devido
  • E1: Data_Vencimento
  • F1: Status_Envio

Preencha as linhas de teste com e-mails reais ou simulados:

  • Linha 2: FAT-501 | Ambev Logística | financeiro@empresa.com.br | 18500 | 15/10/2026 | (vazio)
  • Linha 3: FAT-502 | Unilever Brasil | contasapagar@empresa.com.br | 32400 | 18/10/2026 | (vazio)

🛠️ Prática Obrigatória 1: Geração de PDF e Criação de E-mail Único

Construiremos a rotina que gera o documento PDF da fatura e monta o e-mail no Outlook com pré-visualização na tela (.Display).

Passo a Passo no Computador:

  1. No módulo modAutomacaoOutlook, digite a rotina de envio:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
    Option Explicit
    
    Sub EnviarFaturaIndividual()
        Dim objOutlook As Object
        Dim objMail As Object
        Dim ws As Worksheet
        Dim strCaminhoPDF As String
        Dim strCliente As String
        Dim strEmail As String
        Dim curValor As Currency
        Dim dtmVencimento As Date
        Dim strCorpoHTML As String
    
        Set ws = ThisWorkbook.Worksheets(1)
    
        ' Leitura dos dados da linha 2
        strCliente = ws.Range("B2").Value
        strEmail = ws.Range("C2").Value
        curValor = CCur(ws.Range("D2").Value)
        dtmVencimento = CDate(ws.Range("E2").Value)
    
        ' 1. Definição do Caminho e Geração do PDF
        strCaminhoPDF = Environ("USERPROFILE") & "\Desktop\Fatura_" & ws.Range("A2").Value & ".pdf"
    
        ' Exporta o intervalo da fatura para PDF
        ws.Range("A1:E2").ExportAsFixedFormat Type:=xlTypePDF, _
                                              Filename:=strCaminhoPDF, _
                                              Quality:=xlQualityStandard
    
        ' 2. Instanciação do Outlook via Late Binding
        Set objOutlook = CreateObject("Outlook.Application")
        Set objMail = objOutlook.CreateItem(0) ' 0 = olMailItem
    
        ' 3. Montagem do E-mail em HTML Corporativo
        strCorpoHTML = "<div style='font-family: Segoe UI, Arial; font-size: 14px; color: #333;'>" & _
                       "<h2 style='color: #003366;'>FastLog S.A. - Fatura Eletrônica de Frete</h2>" & _
                       "<p>Prezado cliente <b>" & strCliente & "</b>,</p>" & _
                       "<p>Informamos que sua fatura de transporte rodoviário foi emitida e encontra-se disponível:</p>" & _
                       "<ul>" & _
                       "<li><b>Número da Fatura:</b> " & ws.Range("A2").Value & "</li>" & _
                       "<li><b>Valor Total:</b> " & FormatCurrency(curValor) & "</li>" & _
                       "<li><b>Vencimento:</b> " & Format(dtmVencimento, "dd/mm/yyyy") & "</li>" & _
                       "</ul>" & _
                       "<p>O boleto e o espelho fiscal constam anexos a esta mensagem em formato PDF.</p>" & _
                       "<hr style='border: 0; border-top: 1px solid #ccc;'/>" & _
                       "<p style='font-size: 11px; color: #777;'>Mensagem automática enviada pelo sistema FastLog RPA Enterprise 1.0. Não responda a este e-mail.</p>" & _
                       "</div>"
    
        ' 4. Configuração das Propriedades da Mensagem
        With objMail
            .To = strEmail
            .Subject = "FastLog S.A. - Fatura Digital " & ws.Range("A2").Value & " - " & strCliente
            .HTMLBody = strCorpoHTML
            .Attachments.Add strCaminhoPDF ' Anexa o arquivo PDF gerado!
            .Display                       ' Exibe na tela para validação visual do operador
        End With
    
        ' Atualiza status na planilha
        ws.Range("F2").Value = "ENVIADO (PREVIEW)"
        ws.Range("F2").Interior.Color = RGB(220, 255, 220)
    
        Set objMail = Nothing
        Set objOutlook = Nothing
    End Sub
  2. Execução:
    • Posicione o cursor dentro do código e pressione F8 passo a passo.
    • Observe que na sua Área de Trabalho surge o arquivo Fatura_FAT-501.pdf!
    • Na sequência, uma janela do Outlook surge flutuando na tela, perfeitamente diagramada em HTML, com cabeçalho azul, negrito, dados preenchidos e o PDF anexado!

✅ Resultado Esperado (Prática 1):

O Excel assume controle do Outlook, gera o PDF da planilha e monta o e-mail corporativo pronto para conferência.


🛠️ Prática Obrigatória 2: Disparo em Lote Automatizado com Registro de Envio

Agora automatizaremos o processo para a carteira inteira de clientes: a macro percorrerá todas as linhas da planilha, gerará cada fatura e enviará o e-mail diretamente em segundo plano utilizando o método .Send.

Passo a Passo no Computador:

  1. No mesmo módulo, insira a rotina de disparo em lote:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
    Sub DispararFaturasLote()
        Dim objOutlook As Object
        Dim objMail As Object
        Dim ws As Worksheet
        Dim lngUltimaLinha As Long
        Dim i As Long
        Dim strCaminhoPDF As String
        Dim lngEnviados As Long
    
        Set ws = ThisWorkbook.Worksheets(1)
        lngUltimaLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
        If lngUltimaLinha < 2 Then Exit Sub
    
        ' Desativa tela para ganho de velocidade
        Application.ScreenUpdating = False
    
        ' Instancia o Outlook uma única vez fora do laço
        Set objOutlook = CreateObject("Outlook.Application")
        lngEnviados = 0
    
        For i = 2 To lngUltimaLinha
            ' Apenas processa linhas que ainda não foram enviadas
            If ws.Cells(i, 6).Value <> "ENVIADO COM SUCESSO" Then
    
                ' 1. Caminho exclusivo para o PDF do cliente
                strCaminhoPDF = Environ("USERPROFILE") & "\Desktop\Fatura_" & ws.Cells(i, 1).Value & ".pdf"
    
                ' Gera o PDF
                ws.Range("A" & i & ":E" & i).ExportAsFixedFormat Type:=xlTypePDF, _
                                                                Filename:=strCaminhoPDF
    
                ' 2. Cria o item de e-mail
                Set objMail = objOutlook.CreateItem(0)
    
                With objMail
                    .To = ws.Cells(i, 3).Value
                    .Subject = "FastLog Faturamento - " & ws.Cells(i, 1).Value & " - " & ws.Cells(i, 2).Value
                    .HTMLBody = "<p style='font-family: Arial;'>Prezado(a) <b>" & ws.Cells(i, 2).Value & "</b>,</p>" & _
                                "<p>Segue anexa a fatura no valor de <b>" & FormatCurrency(ws.Cells(i, 4).Value) & "</b>.</p>" & _
                                "<p>Atenciosamente,<br/><b>FastLog S.A. Transportes</b></p>"
                    .Attachments.Add strCaminhoPDF
    
                    ' 3. DISPARO REAL EM SEGUNDO PLANO
                    .Send
                End With
    
                ' 4. Carimba o envio na planilha
                ws.Cells(i, 6).Value = "ENVIADO COM SUCESSO"
                ws.Cells(i, 6).Interior.Color = RGB(220, 255, 220)
                ws.Cells(i, 6).Font.Bold = True
    
                lngEnviados = lngEnviados + 1
                Set objMail = Nothing
            End If
        Next i
    
        Set objOutlook = Nothing
        Application.ScreenUpdating = True
        ws.Columns("A:F").AutoFit
    
        MsgBox "Disparo de faturas concluído!" & vbCrLf & _
               "Total de clientes notificados: " & lngEnviados, vbInformation, "Faturamento FastLog"
    End Sub
  2. Execute com F5:
    • O robô processa todos os clientes da base em frações de segundo.
    • A coluna F é carimbada com "ENVIADO COM SUCESSO" em verde para cada fatura expedida.

✅ Resultado Esperado (Prática 2):

Todos os e-mails são despachados silenciosamente pelo Outlook e a planilha registra a confirmação de cada transação.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_VBA_SeuNome_SeuSobrenome.xlsm.
  2. Acesse a plataforma Microsoft Teams.
  3. Abra a tarefa: “VBA - Cap 18: Automação com Microsoft Outlook”.
  4. Anexe sua pasta de trabalho e entregue.

💡 Checkpoint de Gestão & TI

A automação de cobranças e faturamento por e-mail é uma das aplicações mais demandadas em escritórios e centros de serviços compartilhados (CSC). Ao eliminar o envio manual, a empresa erradica o erro humano de anexar documentos trocados (uma infração gravíssima de privacidade) e reduz o ciclo médio de recebimento (DSO - Days Sales Outstanding), pois os clientes recebem seus boletos no instante exato do fechamento da viagem.


🔥 Desafio de Fixação: Cópia Oculta Corporativa e Exclusão do PDF Temporário

Aprimore o robô de envio:

  1. Adicione cópia oculta de auditoria para a controladoria da FastLog utilizando a propriedade .BCC:
    1
    
    .BCC = "auditoria.faturamento@fastlog.com.br"
  2. Após o disparo (.Send), apague o arquivo PDF temporário da Área de Trabalho com o comando nativo Kill strCaminhoPDF, mantendo o computador do setor limpo e sem acúmulo de arquivos residuais.

🔑 Revelar Gabarito Oficial de Laboratório (Clique para expandir)
💡 Incentivo Pedagógico: Tente resolver as práticas e o desafio de fixação por conta própria antes de abrir o gabarito. Seus erros e tentativas durante o laboratório são a chave para a consolidação real do aprendizado!

Código Consolidado (modAutomacaoOutlook):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Option Explicit

Sub ProcessarFaturamentoCompletoOutlook()
    Dim objOutlook As Object
    Dim objMail As Object
    Dim ws As Worksheet
    Dim lngFinal As Long
    Dim i As Long
    Dim strCaminhoPDF As String
    Dim lngContador As Long
    
    Set ws = ThisWorkbook.Worksheets(1)
    lngFinal = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    If lngFinal < 2 Then Exit Sub
    
    Application.ScreenUpdating = False
    Set objOutlook = CreateObject("Outlook.Application")
    lngContador = 0
    
    For i = 2 To lngFinal
        If ws.Cells(i, 6).Value <> "ENVIADO" Then
            strCaminhoPDF = Environ("USERPROFILE") & "\Desktop\Fatura_" & ws.Cells(i, 1).Value & ".pdf"
            
            ws.Range("A" & i & ":E" & i).ExportAsFixedFormat Type:=xlTypePDF, Filename:=strCaminhoPDF
            
            Set objMail = objOutlook.CreateItem(0)
            With objMail
                .To = ws.Cells(i, 3).Value
                .BCC = "auditoria.faturamento@fastlog.com.br"
                .Subject = "FastLog Faturamento - " & ws.Cells(i, 1).Value & " - " & ws.Cells(i, 2).Value
                .HTMLBody = "<div style='font-family: Arial;'>" & _
                            "<p>Prezado cliente <b>" & ws.Cells(i, 2).Value & "</b>,</p>" & _
                            "<p>Segue anexa a fatura no valor de <b>" & FormatCurrency(ws.Cells(i, 4).Value) & "</b>.</p>" & _
                            "<p>Atenciosamente,<br/><b>FastLog S.A. Transportes</b></p>" & _
                            "</div>"
                .Attachments.Add strCaminhoPDF
                .Send
            End With
            
            ' Exclui arquivo temporário (Desafio de Fixação)
            On Error Resume Next
            Kill strCaminhoPDF
            On Error GoTo 0
            
            ws.Cells(i, 6).Value = "ENVIADO"
            ws.Cells(i, 6).Interior.Color = RGB(220, 255, 220)
            lngContador = lngContador + 1
            Set objMail = Nothing
        End If
    Next i
    
    Set objOutlook = Nothing
    Application.ScreenUpdating = True
    
    MsgBox "Lote de " & lngContador & " e-mails processado com sucesso!", vbInformation, "Faturamento Concluído"
End Sub

📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que você estudou neste capítulo. Ao concluir, apresente o caderno ao professor para visto.

  1. O que significa o conceito de “Interoperabilidade entre Aplicativos” (Office Interop) no ecossistema Microsoft?
  2. Como instanciamos o Microsoft Outlook em segundo plano a partir do Excel utilizando o VBA?
  3. O que o número 0 representa na chamada objOutlook.CreateItem(0)?
  4. Qual é a vantagem de utilizar a propriedade .HTMLBody em vez da propriedade tradicional .Body?
  5. Como estilizamos títulos e cores corporativas dentro do corpo de um e-mail em HTML?
  6. Qual método do VBA é utilizado para anexar arquivos externos (como planilhas ou PDFs) à mensagem do Outlook?
  7. Qual é a diferença fundamental entre os métodos .Display e .Send do objeto MailItem?
  8. Como a instrução .ExportAsFixedFormat auxilia na emissão de documentos formais para clientes?
  9. Para que serve a propriedade .BCC e como ela contribui para a segurança da controladoria da empresa?
  10. Qual é a finalidade do comando nativo Kill no tratamento de arquivos PDF temporários criados em lote?