Como Gerar um Relatório em Word a Partir do Excel com VBA

Para gerar um relatório no Word a partir de dados do Excel via VBA, use CreateObject(“Word.Application”) para abrir o Word por trás do código, crie um novo documento, e escreva os dados da planilha nele usando os objetos Selection ou Range do próprio Word, controlados de dentro do VBA do Excel.

Você já precisou transformar os números de uma planilha num relatório formatado, com título, texto explicativo e uma tabela de dados, para enviar a um cliente ou a um superior, em vez de mandar o arquivo Excel bruto?

Sem automatizar essa etapa, montar o relatório em Word vira um processo manual repetido todo mês ou toda semana — copiar valores, ajustar formatação, redigitar o texto padrão — um trabalho previsível que consome tempo e está sujeito a erro de copiar e colar.

Neste artigo iremos mostrar como abrir o Word a partir do VBA do Excel, escrever texto formatado e uma tabela de dados dentro do documento, e salvar o relatório automaticamente.

DOMINE EXCEL COMIGO

QUERO APRENDER EXCEL

Referenciando o Word a partir do VBA do Excel

Existem duas formas de controlar o Word pelo VBA do Excel. A primeira, chamada early binding, exige adicionar uma referência em Ferramentas > Referências > Microsoft Word xx.0 Object Library, e dá acesso a autocompletar durante a digitação. A segunda, chamada late binding, dispensa qualquer referência e usa CreateObject(“Word.Application”), funcionando em qualquer versão do Word instalada na máquina sem risco de incompatibilidade de biblioteca — por isso é a forma recomendada quando o código vai rodar em computadores diferentes.

Abrindo o Word e criando um novo documento

Sub CriarRelatorioWord()
    Dim wordApp As Object
    Dim wordDoc As Object
    Set wordApp = CreateObject(“Word.Application”)
    wordApp.Visible = True
    Set wordDoc = wordApp.Documents.Add
End Sub

Definir wordApp.Visible = True deixa a janela do Word visível durante a execução, útil para acompanhar o processo enquanto testa o código — em produção, é comum deixar como False para o relatório ser gerado em segundo plano, sem interromper o que o usuário está fazendo na tela.

Escrevendo texto formatado no documento

Com o documento criado, use o objeto Selection do Word para digitar texto e aplicar formatação, como negrito e tamanho de fonte:

With wordApp.Selection
    .Font.Size = 16
    .Font.Bold = True
    .TypeText “Relatório de Vendas”
    .TypeParagraph
    .Font.Size = 11
    .Font.Bold = False
    .TypeText “Gerado em ” & Format(Date, “dd/mm/yyyy”)
    .TypeParagraph
End With

Inserindo uma tabela com dados do Excel

Para transformar um intervalo de células numa tabela dentro do Word, use o método Tables.Add do Word, informando o número de linhas e colunas, e depois preencha célula por célula lendo os valores do Excel:

A B
1 Produto Vendas
2 Notebook 12
3 Mouse 34

Dim tabelaWord As Object
Set tabelaWord = wordDoc.Tables.Add(wordApp.Selection.Range, 3, 2)

Dim linha As Integer, coluna As Integer
For linha = 1 To 3
    For coluna = 1 To 2
        tabelaWord.Cell(linha, coluna).Range.Text = ThisWorkbook.Sheets(1).Cells(linha, coluna).Value
    Next coluna
Next linha

O resultado é uma tabela no Word com duas colunas e três linhas, preenchida exatamente com os valores da planilha Excel, sem precisar copiar e colar manualmente.

Salvando o documento gerado

Depois de montar o conteúdo, salve o arquivo com SaveAs2, informando o caminho completo e, se desejar, o formato:

wordDoc.SaveAs2 “C:\Relatorios\RelatorioVendas.docx”

Fechando o Word ao final

Se a intenção é gerar o relatório totalmente em segundo plano, feche o documento e encerre o aplicativo ao final da macro: wordDoc.Close seguido de wordApp.Quit. Esse passo é importante mesmo quando Visible está como False — sem ele, o processo do Word continua rodando escondido na memória do computador, consumindo recursos sem necessidade.

Usando um modelo (template) do Word como base

Em vez de montar o relatório do zero a cada execução, também é possível abrir um arquivo de modelo já formatado (com logotipo, cabeçalho e estilos prontos) e só preencher os trechos variáveis. Para isso, salve um .docx com marcadores de posição usando indicadores de texto (Bookmarks) do Word — em Inserir > Indicador, dê nomes como NomeCliente ou DataRelatorio nos pontos onde o valor deve entrar. Depois, abra esse modelo pelo VBA com wordApp.Documents.Open em vez de Documents.Add, e substitua cada indicador pelo valor vindo do Excel:

Set wordDoc = wordApp.Documents.Open(“C:\Modelos\ModeloRelatorio.docx”)
wordDoc.Bookmarks(“NomeCliente”).Range.Text = Range(“B1”).Value
wordDoc.Bookmarks(“DataRelatorio”).Range.Text = Format(Date, “dd/mm/yyyy”)

Essa abordagem separa o design do relatório (cuidado por quem monta o modelo no próprio Word, sem precisar mexer em código) da lógica de preenchimento (cuidada pelo VBA), o que facilita ajustar a aparência do relatório sem tocar na macro.

Tratando erros para não deixar o Word aberto escondido

Se a macro falhar no meio da execução — por exemplo, por um caminho de arquivo errado ou uma referência inválida — o processo do Word pode continuar aberto em segundo plano, invisível, consumindo memória até o computador ser reiniciado. Para evitar isso, envolva o código num tratamento de erro que garanta o encerramento do aplicativo mesmo se algo der errado no meio do caminho:

Sub CriarRelatorioComSeguranca()
    On Error GoTo TratarErro
    Dim wordApp As Object
    Set wordApp = CreateObject(“Word.Application”)
    ‘ … resto do código que monta o relatório …
    wordApp.Quit
    Exit Sub
TratarErro:
    MsgBox “Erro ao gerar o relatório: ” & Err.Description
    If Not wordApp Is Nothing Then wordApp.Quit
End Sub

Com o On Error GoTo apontando para um rótulo que também chama wordApp.Quit, o Word é fechado corretamente mesmo quando a macro é interrompida por um erro inesperado, evitando o acúmulo silencioso de processos abertos ao longo do tempo.

Erros comuns

O erro mais frequente é justamente esquecer de fechar o Word ao final da macro, deixando processos acumulados em segundo plano a cada execução. Outro problema comum, ao usar early binding, é a referência à biblioteca do Word ficar presa a uma versão específica do Office, quebrando se o arquivo for aberto num computador com uma versão diferente instalada — por isso o late binding com CreateObject costuma ser mais seguro para arquivos que circulam entre máquinas diferentes.

Disponibilidade

Essa automação depende do Word estar instalado na mesma máquina e funciona apenas no Excel para Windows desktop, já que se baseia em automação COM. Não funciona no Excel para Mac, no Excel Online nem no Google Sheets, que não têm suporte a esse tipo de automação entre aplicativos.

Perguntas frequentes

Preciso ter o Word instalado para essa automação funcionar?

Sim, a automação COM usada neste artigo depende do Microsoft Word estar instalado na mesma máquina onde a macro do Excel é executada.

Isso funciona no Excel para Mac ou no Excel Online?

Não. A automação de outro aplicativo do Office via CreateObject(“Word.Application”) é um recurso exclusivo do Windows desktop, não disponível no Excel para Mac nem no Excel Online.

Dá para deixar o Word rodando em segundo plano, sem aparecer na tela?

Sim, defina wordApp.Visible = False logo depois de criar o objeto. Nesse caso, é ainda mais importante lembrar de fechar o documento e encerrar o aplicativo (wordDoc.Close e wordApp.Quit) ao final da macro, já que o processo não aparece visualmente para lembrar você de fechá-lo.

Compartilhe ou Comente

Se você curtiu esse artigo aonde mostramos como gerar um relatório no Word a partir de dados do Excel usando VBA, incluindo texto formatado e uma tabela preenchida automaticamente com valores da planilha, compartilhe com as suas redes sociais e não se esqueça de deixar um comentário aqui embaixo caso você tenha ficado com alguma dúvida.

Sua empresa ainda monta relatórios no Word copiando e colando dados do Excel manualmente? Esse tipo de automação economizaria tempo no seu dia a dia? Conta para nós nos comentários!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *