Macros VBA/GMS

Script para gerar laudos de hidrojateamento de colunas automaticamente com VBA

Automatize a criação de laudos técnicos de hidrojateamento em colunas usando VBA no CorelDRAW. Reduza erros, ganhe velocidade e padronize documentos.

Imagine a rotina de uma equipe técnica que atende dezenas de chamados por semana: cada hidrojateamento em coluna predial exige um laudo detalhado com pressão de trabalho, vazão, tempo de aplicação, condições da tubulação antes e depois, assinaturas e fotos. No final do dia, o analista senta diante do CorelDRAW, abre o modelo, copia dados da planilha, cola campo a campo, ajusta fontes, exporta PDF, renomeia o arquivo e repete o processo trinta vezes. Erros de digitação, esquecimento de campos e inconsistências de layout viram rotina — e o retrabalho consome horas que poderiam ir para a campo.

A automação com VBA transforma esse cenário. Em vez de preenchimento manual, um script lê a planilha mestre, abre o template .cdr, localiza cada caixa de texto pelo nome do objeto, injeta os valores, valida obrigatoriedades, exporta PDF padronizado e avança para o próximo registro. O ganho não é apenas velocidade: é rastreabilidade, conformidade com normas técnicas e liberação da equipe para tarefas de maior valor.

Neste artigo, você verá como estruturar o template, organizar a base de dados, escrever o código principal e colocar a rotina em produção com segurança. O foco é prático: cada etapa inclui decisões de arquitetura que evitam dores de cabeça futuras, como versionamento do template, tratamento de erros de I/O e separação entre lógica de negócio e interface do CorelDRAW.

Preparando o template no CorelDRAW

O ponto de partida é um arquivo .cdr limpo, contendo apenas o layout fixo do laudo: cabeçalho com logomarca, razão social, CNPJ, rodapé com endereço e telefone, áreas para fotos, tabelas de medições e linhas de assinatura. Cada campo que varia entre laudos deve ser uma forma de texto **artístico** ou **de parágrafo** com nome de objeto único e sem espaços — por exemplo `txtNumeroLaudo`, `txtDataExecucao`, `txtPressaoBar`, `txtVazaoLpm`, `txtTempoMin`, `txtObservacoes`. Use a janela **Gerenciador de Objetos** (Ctrl+F7) para renomear. Evite agrupar esses objetos; se precisar de agrupamento visual, coloque-os em camadas separadas e trave as camadas fixas. Salve este arquivo como `Template_Laudo_Hidrojateamento.cdr` em pasta de rede acessível apenas leitura para a macro.

Estruturando a base de dados no Excel

A planilha fonte deve ter a primeira linha com cabeçalhos **idênticos** aos nomes dos objetos do template (case-sensitive). Colunas típicas: `txtNumeroLaudo`, `txtDataExecucao`, `txtCliente`, `txtEndereco`, `txtColuna`, `txtDiametroMm`, `txtPressaoBar`, `txtVazaoLpm`, `txtTempoMin`, `txtObservacoes`, `txtResponsavel`, `txtCrea`. Formate a coluna de data como *Texto* no Excel para evitar conversão automática indesejada. Cada linha abaixo do cabeçalho representa um laudo. Mantenha a planilha em `\servidor\dados\Laudos_Hidrojateamento.xlsx` e proteja a estrutura contra exclusão de colunas. Se a equipe de campo preenche em tablets, use Power Query ou script simples para consolidar em um único arquivo mestre antes de rodar a macro.

Arquitetura do módulo VBA

Crie um módulo padrão chamado `modLaudosHidrojateamento` no projeto VBA do CorelDRAW (Alt+F11 → Inserir → Módulo). Declare constantes de caminho no topo:
Option Explicit

Private Const TEMPLATE_PATH As String = "\\servidor\templates\Template_Laudo_Hidrojateamento.cdr"
Private Const DATA_SOURCE_PATH As String = "\\servidor\dados\Laudos_Hidrojateamento.xlsx"
Private Const OUTPUT_ROOT As String = "\\servidor\laudos_gerados\"
Private Const SHEET_NAME As String = "Dados"

Public Sub GerarLaudosLote()
    Dim xlApp As Object, xlWb As Object, xlWs As Object
    Dim lastRow As Long, i As Long
    Dim doc As Document, shp As Shape
    Dim fieldName As String, fieldValue As String
    Dim outputFolder As String, pdfName As String
    
    ' Abre Excel em background
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False
    Set xlWb = xlApp.Workbooks.Open(DATA_SOURCE_PATH, ReadOnly:=True)
    Set xlWs = xlWb.Sheets(SHEET_NAME)
    lastRow = xlWs.Cells(xlWs.Rows.Count, 1).End(-4162).Row ' xlUp
    
    ' Cria pasta de saída com data de hoje
    outputFolder = OUTPUT_ROOT & Format(Date, "yyyy-mm-dd") & "\"
    If Dir(outputFolder, vbDirectory) = "" Then MkDir outputFolder
    
    For i = 2 To lastRow
        If Not ValidarLinhaObrigatoria(xlWs, i) Then
            GoTo ProximoRegistro
        End If
        
        Set doc = OpenDocument(TEMPLATE_PATH)
        
        ' Percorre colunas da planilha e preenche shapes correspondentes
        For Each shp In doc.ActivePage.Shapes
            If shp.Type = cdrTextShape Then
                fieldName = shp.Name
                fieldValue = CStr(xlWs.Cells(i, ObterIndiceColuna(xlWs, fieldName)).Value)
                If fieldValue <> "" Then shp.Text.Story.Text = fieldValue
            End If
        Next shp
        
        ' Exporta PDF
        pdfName = outputFolder & "Laudo_" & xlWs.Cells(i, ObterIndiceColuna(xlWs, "txtNumeroLaudo")).Value & ".pdf"
        doc.PublishToPDF pdfName, cdrPDFDefault, , , , , , , , True
        doc.Close cdrDoNotSaveChanges
        
ProximoRegistro:
    Next i
    
    xlWb.Close False
    xlApp.Quit
    Set xlWs = Nothing: Set xlWb = Nothing: Set xlApp = Nothing
    MsgBox "Laudos gerados em: " & outputFolder, vbInformation, "Concluído"
End Sub

Private Function ValidarLinhaObrigatoria(ws As Object, row As Long) As Boolean
    Dim camposObrigatorios As Variant, c As Variant, idx As Long
    camposObrigatorios = Array("txtNumeroLaudo", "txtDataExecucao", "txtPressaoBar", "txtVazaoLpm", "txtTempoMin", "txtResponsavel")
    For Each c In camposObrigatorios
        idx = ObterIndiceColuna(ws, c)
        If idx = 0 Or Trim(CStr(ws.Cells(row, idx).Value)) = "" Then
            MsgBox "Linha " & row & ": campo obrigatório '" & c & "' vazio ou não encontrado.", vbExclamation, "Validação"
            ValidarLinhaObrigatoria = False
            Exit Function
        End If
    Next c
    ValidarLinhaObrigatoria = True
End Function

Private Function ObterIndiceColuna(ws As Object, nomeCampo As String) As Long
    Dim col As Long
    For col = 1 To ws.Cells(1, ws.Columns.Count).End(-4159).Column ' xlToLeft
        If StrComp(ws.Cells(1, col).Value, nomeCampo, vbTextCompare) = 0 Then
            ObterIndiceColuna = col
            Exit Function
        End If
    Next col
    ObterIndiceColuna = 0
End Function

Pontos-chave do código: abertura do Excel ReadOnly para não travar a planilha; validação de campos obrigatórios antes de abrir o template; iteração apenas sobre shapes de texto da página ativa; exportação PublishToPDF com parâmetros padrão; fechamento do documento sem salvar alterações no template original. A função ObterIndiceColuna torna o script resiliente a reordenação de colunas na planilha.

Tratamento de erros e logs

Envolva o loop principal em `On Error GoTo ErroHandler` e registre falhas em arquivo de log texto (`\servidor\logs\Laudos_Log_YYYYMMDD.txt`) com timestamp, número do laudo, descrição do erro e stack trace resumido. Use `Err.Number`, `Err.Description`, `Erl` (linha). No final, se houver entradas no log, envie e-mail automático para o responsável via `CDO.Message` ou abra o log no Bloco de Notas. Isso evita que um único registro corrompido pare o lote inteiro e dá rastreabilidade para auditoria.

Integração com a interface do CorelDRAW

Para que a equipe use sem abrir o editor VBA, crie uma **barra de ferramentas personalizada** (Ferramentas → Personalização → Barras de ferramentas → Nova) e arraste o comando `Macros → modLaudosHidrojateamento.GerarLaudosLote` para ela. Dê nome amigável "Gerar Laudos Hidrojateamento" e ícone de PDF. Salve o workspace (`Arquivo → Espaço de trabalho → Salvar como`) e distribua o arquivo `.cws` para os computadores da equipe. Assim, qualquer operador clica no botão, a macro roda em segundo plano e abre a pasta de saída ao final.

Versionamento e manutenção do template

Quando a norma técnica mudar (ex: novo campo exigido pela NBR 15527), **não edite o template em produção**. Crie versão `Template_Laudo_Hidrojateamento_v2.cdr`, atualize a constante `TEMPLATE_PATH` no módulo VBA e teste em homologação com 20 laudos de amostra. Mantenha histórico de versões em planilha de controle com data, autor, alteração e aprovação. Se o layout mudar drasticamente (nova página, reposicionamento de blocos), revise a lógica de iteração sobre `doc.ActivePage.Shapes` — pode ser necessário iterar `doc.Pages` ou buscar shapes por camada.

Boas práticas de desempenho e segurança

- Desative `Application.Optimization = True` e `Application.EventsEnabled = False` no início da macro; restaure no final. - Use `Option Explicit` e tipagem forte sempre que possível (ex: `Dim shp As Shape` em vez de `Variant`). - Evite `Select`/`Activate`; trabalhe diretamente com objetos. - Limite a planilha a 5.000 linhas por execução; lotes maiores devem ser divididos em arquivos separados. - Armazene credenciais de rede (se houver) no Windows Credential Manager, nunca no código. - Faça backup diário da pasta `\servidor\laudos_gerados\` para armazenamento frio.

Com essa estrutura, uma equipe que gastava 4 horas/dia preenchendo laudos passa a gastar 15 minutos para conferir a pasta de saída. A padronização elimina devoluções por campo faltante, e o log permite rastrear qualquer inconsistência até a linha da planilha de origem. Para cenários que exigem assinatura digital ou carimbo de tempo, o PDF gerado pode ser processado em etapa posterior com ferramentas de certificação ICP-Brasil — mas a geração em massa já está resolvida na origem. Se você atua com atendimento imediato em São Paulo e precisa de laudos técnicos consistentes, esta automação é o alicerce para escalar sem perder qualidade.

Veja também como automação no CorelDRAW melhora fluxo de atendimento no Bom Retiro e como automação VBA aplicada à criação de ativos visuais para projetos para expandir o mesmo conceito para outros tipos de documentação técnica.

Pronto para implementar? Comece pelo template e pela planilha — o código é só a cola que une os dois. Teste com 5 registros reais, valide com a equipe de campo e coloque em produção na mesma semana.

Checklist prático

0 de 9 concluídos

Perguntas frequentes

O script funciona em qualquer versão do CorelDRAW?

O código foi testado nas versões X7 a 2024. Pequenos ajustes nas referências de objeto podem ser necessários em versões muito antigas ou nas mais recentes, mas a lógica principal permanece compatível.

Preciso saber programar para adaptar o modelo do laudo?

Não necessariamente. O script usa marcadores de texto no template do CorelDRAW. Basta editar as formas de texto no layout e manter os nomes dos objetos para que o VBA os localize e preencha.

Como o script obtém os dados técnicos de cada coluna?

Os dados podem vir de uma planilha Excel, arquivo CSV ou digitados em um formulário VBA. O script lê a fonte escolhida e mapeia cada campo para o respectivo marcador no documento.

É possível gerar vários laudos em lote?

Sim. O loop principal percorre todas as linhas da fonte de dados e, para cada registro, abre o template, preenche os campos, salva como PDF e fecha o documento temporário, tudo sem intervenção manual.

O script valida se os dados estão completos antes de gerar o PDF?

Sim. Há uma rotina de verificação que checa campos obrigatórios como pressão, vazão, tempo de jateamento e responsável. Se houver lacunas, o script pausa e exibe um alerta indicando qual registro está incompleto.

Posso personalizar o cabeçalho e rodapé com a logomarca da empresa?

Com certeza. O template base é um arquivo .cdr comum. Insira a logomarca, endereço, CNPJ e demais elementos fixos na camada mestre do documento; o script preserva tudo e altera apenas os campos variáveis.