Crie modelos de laudo técnico para hidrojateamento usando automação VBA

Aprenda a automatizar laudos técnicos de hidrojateamento no CorelDRAW com VBA. Padronize relatórios, reduza erros e ganhe agilidade na documentação de campo.

Imagine a seguinte situação: a equipe de hidrojateamento finalizou um serviço de desobstrução em uma indústria alimentícia às 22h de sexta-feira. O cliente exige o laudo técnico assinado até as 8h de segunda para auditoria da ANVISA. O técnico, cansado após 12h de plantão, abre o CorelDRAW, copia o arquivo do último serviço, apaga dados antigos, digita os novos, ajusta fontes, insere fotos manualmente, exporta PDF, envia por e-mail. No meio do processo, percebe que esqueceu de atualizar a pressão de trabalho de 350 para 420 bar no rodapé — dado crítico para rastreabilidade. O arquivo já foi enviado.

Esse cenário é mais comum do que parece. Laudos de hidrojateamento exigem precisão normativa (ABNT NBR 13694, NR-10, NR-33), rastreabilidade de parâmetros críticos (pressão, vazão, tempo, bico utilizado) e evidências fotográficas georreferenciadas. A edição manual em CorelDRAW, embora flexível, introduz riscos de erro humano, inconsistência visual entre equipes e retrabalho em prazos apertados. A automação via VBA transforma esse fluxo: o técnico preenche um formulário validado, clica em “Gerar Laudo” e recebe um PDF/A padronizado, numerado e pronto para assinatura digital em segundos.

Neste tutorial, vamos construir do zero um sistema completo de geração de laudos técnicos para hidrojateamento. Cobriremos a estrutura do template mestre, o UserForm com validações, a lógica de preenchimento por nome de objetos, exportação em lote e publicação como extensão instalável. O código será modular, comentado e pronto para adaptação a outras normas ou tipos de relatório técnico.

Estrutura do template mestre no CorelDRAW

A base de toda automação confiável é um template bem organizado. Crie um novo documento (Arquivo > Novo) com tamanho A4, margens de 15 mm e orientação retrato. A regra de ouro: cada informação variável deve ser um objeto nomeado, nunca dependa de posição relativa ou ordem de camadas.

Organize em layers travadas e destravadas:

Layer Status Conteúdo Exemplos de nomes de objetos
Header_Fixo Travada Logo, razão social, CNPJ, endereço, telefone shp_Logo, txt_RazaoSocial, txt_CNPJ
Cabecalho_Norma Travada Título “LAUDO TÉCNICO DE HIDROJATEAMENTO”, referência ABNT NBR 13694 txt_TituloLaudo, txt_NormaReferencia
Dados_Cliente Destrava Nome cliente, CNPJ/CPF, endereço obra, responsável técnico txt_NomeCliente, txt_CNPJCliente, txt_EnderecoObra, txt_RespTecnico
Dados_Servico Destrava Data/hora início/fim, tipo serviço, equipamento, bico, pressão, vazão txt_DataInicio, txt_HoraInicio, txt_TipoServico, txt_Equipamento, txt_Bico, txt_PressaoBar, txt_VazaoLmin
Observacoes Destrava Campo livre para anomalias, recomendações, não conformidades txt_Observacoes
Fotos_Evidencias Destrava Placeholders nomeados ph_Foto_1 a ph_Foto_6 (retângulos 80x60mm, sem preenchimento, contorno tracejado) ph_Foto_1 … ph_Foto_6
Assinaturas Destrava Linhas para assinatura técnico, cliente, ART/CREA txt_AssinaturaTecnico, txt_CREATecnico, txt_AssinaturaCliente
Rodape_Fixo Travada Numeração automática, QR code placeholder, aviso confidencialidade txt_NumeroLaudo, ph_QRCode, txt_AvisoConfidencial

Para nomear objetos: selecione o objeto > painel Propriedades do Objeto (Alt+Enter) > aba Nome > digite o nome exato da tabela. Dica: use prefixo txt_ para textos, shp_ para formas, ph_ para placeholders. Isso facilita a busca no VBA via ActivePage.FindShape("nome").

Salve como Template_Laudo_Hidrojateamento_Mestre.cdr em pasta de rede acessível apenas leitura para operadores. Essa será a fonte imutável — a macro sempre fará Duplicate dessa página para um novo documento.

UserForm com validação de máscara e regras de negócio

Abra o editor VBA (Alt+F11), insira UserForm chamado frmLaudoHidrojateamento. Configure propriedades: Caption = "Gerador de Laudo - Hidrojateamento", StartUpPosition = 2 - CenterScreen, ShowModal = True. Adicione os controles conforme a tabela:

' Estrutura do UserForm (criar via IDE ou importar .frm)
' Labels (lbl_) + TextBoxes (txt_) + ComboBoxes (cbo_) + Buttons (btn_)
' 
' lbl_Titulo (Topo, fonte 14 bold): "PREENCHIMENTO DO LAUDO TÉCNICO"
' 
' Frame fra_Cliente: "Dados do Cliente"
'   lbl_NomeCliente + txt_NomeCliente (MaxLength=100)
'   lbl_CNPJCliente + txt_CNPJCliente (máscara ##.###.###/####-## via KeyPress)
'   lbl_EnderecoObra + txt_EnderecoObra (MaxLength=150)
'   lbl_RespTecnico + txt_RespTecnico (MaxLength=80)
' 
' Frame fra_Servico: "Parâmetros do Serviço"
'   lbl_DataInicio + txt_DataInicio (máscara ##/##/#### + validação DateValue)
'   lbl_HoraInicio + txt_HoraInicio (máscara ##:##)
'   lbl_DataFim + txt_DataFim
'   lbl_HoraFim + txt_HoraFim
'   lbl_TipoServico + cbo_TipoServico (Itens: "Desobstrução", "Limpeza Industrial", "Preparação Superfície", "Corte a Frio")
'   lbl_Equipamento + txt_Equipamento (ex: "Jato 3500 bar - Modelo X")
'   lbl_Bico + txt_Bico (ex: "Rotativo 15° - 0.5mm")
'   lbl_Pressao + txt_PressaoBar (numérico, 50-3000, validação IsNumeric)
'   lbl_Vazao + txt_VazaoLmin (numérico, 1-500)
' 
' Frame fra_Obs: "Observações e Não Conformidades"
'   txt_Observacoes (MultiLine=True, EnterKeyBehavior=True, MaxLength=2000)
' 
' Frame fra_Fotos: "Evidências Fotográficas (máx. 6)"
'   btn_AddFoto_1 ... btn_AddFoto_6 (Caption="+", Tag="1" a "6")
'   lbl_FotoPath_1 ... lbl_FotoPath_6 (Caption="Nenhuma foto", foreColor=vbGrayText)
'   btn_LimparFotos (Caption="Limpar todas")
' 
' Botões inferiores:
'   btn_GerarLaudo (Caption="Gerar Laudo PDF", Default=True, BackColor=&H008000&, ForeColor=vbWhite)
'   btn_SalvarRascunho (Caption="Salvar Rascunho .cdr")
'   btn_Cancelar (Caption="Cancelar", Cancel=True)

A validação de máscara no KeyPress do CNPJ:

Private Sub txt_CNPJCliente_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Dim s As String: s = txt_CNPJCliente.Text
    If KeyAscii = 8 Then Exit Sub ' Backspace
    If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0: Exit Sub ' Só números
    Select Case Len(s)
        Case 2, 6: txt_CNPJCliente.Text = s & ".": KeyAscii = 0
        Case 10: txt_CNPJCliente.Text = s & "/": KeyAscii = 0
        Case 15: txt_CNPJCliente.Text = s & "-": KeyAscii = 0
        Case 18: KeyAscii = 0 ' Limite
    End Select
End Sub

Private Sub txt_PressaoBar_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Not IsNumeric(txt_PressaoBar.Text) Then
        MsgBox "Pressão deve ser numérica (bar).", vbExclamation
        Cancel = True: txt_PressaoBar.SetFocus
    ElseIf Val(txt_PressaoBar.Text) < 50 Or Val(txt_PressaoBar.Text) > 3000 Then
        MsgBox "Pressão fora da faixa operacional (50-3000 bar).", vbExclamation
        Cancel = True: txt_PressaoBar.SetFocus
    End If
End Sub

O botão de adicionar foto usa Application.FileDialog(msoFileDialogFilePicker) com filtro Images (*.jpg;*.jpeg;*.png;*.bmp),*.jpg;*.jpeg;*.png;*.bmp. Ao selecionar, armazena o caminho na Tag do label correspondente e atualiza Caption com nome do arquivo. O btn_LimparFotos zera todas as Tag e Caption.

Lógica de preenchimento: FindShape, duplicação e exportação PDF/A

O coração da automação está no módulo modGerarLaudo. A rotina principal GerarLaudoCompleto() segue este fluxo:

  1. Valida se todos os campos obrigatórios do frmLaudoHidrojateamento estão preenchidos
  2. Abre o template mestre (Template_Laudo_Hidrojateamento_Mestre.cdr) como ReadOnly
  3. Duplica a página mestra para um novo documento temporário
  4. Para cada campo do formulário, localiza o shape correspondente no novo doc via FindShape(nome) e atualiza .Text.Story.Text
  5. Insere fotos nos placeholders ph_Foto_1 a ph_Foto_6 usando ImportEx com cdrCenterOffset
  6. Gera número sequencial do laudo (formato LHD-YYYYMMDD-###) salvo em Config.ini na pasta da macro
  7. Exporta como PDF/A-1b (PDFPreset = "PDF/A-1b") com metadados XMP preenchidos
  8. Opcional: salva cópia .cdr em pasta de rascunhos com nome do laudo
  9. Abre pasta de saída no Explorer para anexo rápido ao e-mail

Trecho crítico — preenchimento de campos texto:

Sub PreencherCampoTexto(doc As Document, nomeShape As String, novoTexto As String)
    On Error GoTo Erro
    Dim shp As Shape
    Set shp = doc.ActivePage.FindShape(nomeShape)
    If shp Is Nothing Then
        Debug.Print "AVISO: Shape não encontrado: " & nomeShape
        Exit Sub
    End If
    If shp.Type = cdrTextShape Then
        shp.Text.Story.Text = novoTexto
        ' Mantém formatação original (fonte, tamanho, cor) do template
    Else
        Debug.Print "AVISO: Shape " & nomeShape & " não é texto."
    End If
    Exit Sub
Erro:
    Debug.Print "ERRO PreencherCampoTexto(" & nomeShape & "): " & Err.Description
End Sub

' Uso no GerarLaudoCompleto():
PreencherCampoTexto docNovo, "txt_NomeCliente", frmLaudoHidrojateamento.txt_NomeCliente.Text
PreencherCampoTexto docNovo, "txt_CNPJCliente", frmLaudoHidrojateamento.txt_CNPJCliente.Text
' ... repetir para todos os 20+ campos

Inserção de fotos com redimensionamento proporcional:

Sub InserirFotoNoPlaceholder(doc As Document, idx As Integer, caminhoArquivo As String)
    On Error GoTo Erro
    Dim ph As Shape, img As Shape, ratio As Double
    Set ph = doc.ActivePage.FindShape("ph_Foto_" & idx)
    If ph Is Nothing Then Exit Sub
    
    Set img = doc.ActiveLayer.ImportEx(caminhoArquivo, cdrCenterOffset, 0, 0)
    ' Centraliza no placeholder
    img.Move ph.LeftX + ph.Width / 2 - img.Width / 2, ph.BottomY - ph.Height / 2 + img.Height / 2
    
    ' Redimensiona para caber no placeholder mantendo proporção
    If img.Width > ph.Width Or img.Height > ph.Height Then
        ratio = Application.Min(ph.Width / img.Width, ph.Height / img.Height)
        img.Stretch ratio, ratio
    End If
    
    img.Name = "img_Foto_" & idx & "_" & Format(Now, "YYYYMMDDHHMMSS")
    ph.Delete ' Remove placeholder após inserir
    Exit Sub
Erro:
    MsgBox "Falha ao inserir foto " & idx & ": " & Err.Description, vbExclamation
End Sub

A exportação PDF/A garante arquivamento de longo prazo e conformidade com exigências de órgãos fiscalizadores. Configure o preset uma vez no CorelDRAW (Ferramentas > Predefinições de exportação > PDF > PDF/A-1b) e referencie pelo nome no VBA: docNovo.Export pdfPath, cdrPDF, , "PDF/A-1b".

Publicação como extensão instalável e atalhos

Para distribuir a solução para a equipe sem que precisem abrir o editor VBA, publique como extensão .ccx:

  1. No Gerenciador de Extensões (Ferramentas > Extensões > Gerenciador), clique Novo > Pacote de Extensão
  2. Nome: Gerador Laudo Hidrojateamento, ID: com.bonus630.laudohidrojateamento, Versão: 1.0.0
  3. Adicione o arquivo .gms (módulos + formulários) e ícone .png 48x48
  4. Em Comandos, crie entrada: ID: cmdGerarLaudo, Legenda: "Gerar Laudo Hidrojateamento", Dica: "Abre formulário para novo laudo técnico", Atalho: Ctrl+Shift+H
  5. Assine com certificado (opcional, mas recomendado para ambiente corporativo)
  6. Exporte .ccx e distribua via pasta de rede ou intranet

A instalação pelo usuário final: duplo clique no .ccx > Instalar > reiniciar CorelDRAW. O botão aparece na barra de ferramentas Extensões e no menu Ferramentas > Extensões > Gerador Laudo Hidrojateamento.

Para ambientes com múltiplas versões do CorelDRAW, mantenha branches separados do .gms (ex: v2021, v2023, v2024) pois a object model muda levemente. Use #If VBA7 Then / #Else para compatibilidade de ponteiros LongPtr em APIs Windows (ex: SHBrowseForFolder para selecionar pasta de saída).

Boas práticas de desempenho e manutenção

Laudos de hidrojateamento podem gerar centenas de PDFs por mês. Aplique estas práticas para evitar lentidão:

  • Cache do template: carregue o template mestre uma vez em variável global Public g_TemplateMestre As Document no Auto_Open do .gms, feche no Auto_Close. Evita abrir/fechar arquivo a cada laudo.
  • Desative eventos e renderização durante preenchimento em lote:
Application.EventsEnabled = False
Application.Optimization = True
Application.ScreenUpdating = False
' ... loop de geração ...
Application.ScreenUpdating = True
Application.Optimization = False
Application.EventsEnabled = True
  • Log estruturado: grave Log_Laudos_YYYYMM.txt com timestamp, número laudo, operador (Environ("USERNAME")), duração geração, status (sucesso/erro). Facilita auditoria e debug.
  • Teste de regressão mensal: rode suite com 5 cenários (cliente novo, cliente recorrente, com/sem fotos, pressão limite, observação longa) e compare PDFs gerados com “golden masters” aprovados.
  • Versionamento semântico: MAJOR.MAJOR.PATCH (ex: 2.1.3). MAJOR = quebra compatibilidade template; MINOR = novos campos/funcionalidades; PATCH = correções. Atualize constante VERSAO_TEMPLATE no código e no nome do arquivo .cdr mestre.

Para aprofundar em otimização de macros para produção em escala, recomendo a leitura de Boas práticas de desempenho em macros para produção. Se a equipe trabalha em MacBook com Parallels, veja Automação VBA no CorelDRAW em MacBook corporativo via Parallels para ajustes de performance. E para quem está começando do zero, o guia Como criar macros VBA para CorelDRAW do zero cobre o ambiente de desenvolvimento passo a passo.

A padronização de laudos técnicos via VBA no CorelDRAW não é apenas ganho de velocidade — é gestão de risco. Elimina retrabalho por erro de digitação, garante conformidade normativa em ogni documento e libera a equipe técnica para focar na execução do serviço, não na formatação do relatório. Comece pelo template mestre bem nomeado, valide cada campo no formulário e publique como extensão. Em uma semana, o investimento se paga na primeira auditoria sem não conformidades de documentação. Para suporte especializado em campo, a DezJato 24h atende emergências de hidrojateamento com laudos técnicos já padronizados.

Implemente hoje o primeiro laudo automatizado. Meça o tempo gasto antes e depois. Compartilhe o .gms com a equipe, colete feedback e itere. A automação bem-sucedida é a que evolui junto com a operação.

Checklist prático

0 de 9 concluídos

Perguntas frequentes

É necessário conhecimento avançado de programação para criar essas macros?

Não. O VBA do CorelDRAW possui uma curva de aprendizado acessível e a gravação de macros nativa ajuda a entender a estrutura do código. Com lógica básica e exemplos práticos, qualquer técnico consegue evoluir para automações completas.

Como garantir que o laudo atenda às normas técnicas exigidas pelos clientes?

Inclua campos obrigatórios baseados na ABNT NBR 13694 e normas de segurança do trabalho (NR-10, NR-33). Use validação de dados no VBA para impedir envio de formulários incompletos e trave layouts para evitar alterações acidentais em cabeçalhos normativos.

Posso integrar fotos do serviço diretamente no laudo via macro?

Sim. O VBA permite inserir imagens via `ActiveLayer.ImportEx` posicionando-as em layers específicos. Crie um botão no formulário que abre diálogo de arquivo, redimensiona a foto para o padrão do relatório e renomeia o objeto para rastreabilidade.

Qual a melhor forma de versionar os modelos de laudo ao longo do tempo?

Mantenha um arquivo `.gms` centralizado em pasta de rede com controle de versão no nome (ex: `Laudo_Hidrojateamento_v2.1.gms`). No código, adicione constante `VERSAO_TEMPLATE` e rotina de verificação na inicialização para alertar se houver versão mais nova disponível.

Como evitar que operadores alterem acidentalmente o layout do modelo?

Trave as camadas de cabeçalho, rodapé e campos fixos usando `Layer.Locked = True`. Crie layers editáveis apenas para dados variáveis (pressão, vazão, observações) e proteja o documento com senha via `Document.Protect` para impedir exclusão de objetos essenciais.

A automação funciona em versões antigas do CorelDRAW (X7, X8)?

Funciona, mas recomendo CorelDRAW 2021 ou superior para melhor suporte a objetos `ShapeRange` e eventos de documento. Em versões legadas, evite recursos como `Document.AfterPrint` e use `Application.EventEnabled` com cautela para não travar a interface.