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:
- Valida se todos os campos obrigatórios do
frmLaudoHidrojateamentoestão preenchidos - Abre o template mestre (
Template_Laudo_Hidrojateamento_Mestre.cdr) comoReadOnly - Duplica a página mestra para um novo documento temporário
- Para cada campo do formulário, localiza o shape correspondente no novo doc via
FindShape(nome)e atualiza.Text.Story.Text - Insere fotos nos placeholders
ph_Foto_1aph_Foto_6usandoImportExcomcdrCenterOffset - Gera número sequencial do laudo (formato
LHD-YYYYMMDD-###) salvo emConfig.inina pasta da macro - Exporta como PDF/A-1b (
PDFPreset = "PDF/A-1b") com metadados XMP preenchidos - Opcional: salva cópia
.cdrem pasta de rascunhos com nome do laudo - 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:
- No Gerenciador de Extensões (
Ferramentas > Extensões > Gerenciador), cliqueNovo>Pacote de Extensão - Nome:
Gerador Laudo Hidrojateamento, ID:com.bonus630.laudohidrojateamento, Versão:1.0.0 - Adicione o arquivo
.gms(módulos + formulários) e ícone.png48x48 - Em
Comandos, crie entrada:ID: cmdGerarLaudo,Legenda: "Gerar Laudo Hidrojateamento",Dica: "Abre formulário para novo laudo técnico",Atalho: Ctrl+Shift+H - Assine com certificado (opcional, mas recomendado para ambiente corporativo)
- Exporte
.ccxe 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 DocumentnoAuto_Opendo.gms, feche noAuto_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.txtcom 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 constanteVERSAO_TEMPLATEno código e no nome do arquivo.cdrmestre.
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
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.