Crie modelos de sinalização de segurança para desentupimento em Pirituba via VBA

Aprenda a automatizar placas de segurança NR-10 e NR-12 no CorelDRAW com VBA para serviços de desentupimento em Pirituba. Modelo pronto e código explicado.

Imagine a seguinte situação: uma equipe de desentupimento chega a um condomínio na região de Pirituba às 7h da manhã. O síndico exige que toda a área de intervenção — poços de visita, ralos de jardim, caixa de gordura — esteja sinalizada conforme NR-10 e NR-33 antes de qualquer equipamento ser ligado. O técnico responsável abre o CorelDRAW, procura o modelo antigo, percebe que o endereço está desatualizado, o pictograma de “espaço confinado” está errado e a cor amarela de atenção virou um tom pastel na última impressão. Enquanto ele corrige à mão, a equipe fica parada, o cliente reclama e a margem do serviço evapora.

Esse cenário se repete diariamente em empresas que ainda tratam sinalização de segurança como arte final manual. A automação via VBA no CorelDRAW transforma esse gargalo em um processo padronizado, rastreável e à prova de erro humano. Neste tutorial, você vai construir do zero um gerador de placas de segurança para desentupimento em Pirituba, com dados variáveis, cores normatizadas e exportação pronta para gráfica rápida.

Antes de mergulhar no código, vale revisar a base: se você nunca escreveu uma macro para CorelDRAW, comece pelo guia introdutório para entender o objeto Application, ActiveDocument e a estrutura de eventos. Para quem já tem macros em produção, o artigo sobre boas práticas de desempenho evita armadilhas de lentidão em lotes grandes.

Estrutura do template mestre no CorelDRAW

Crie um novo documento (A4, 300 dpi, CMYK FOGRA39). Organize as camadas na seguinte ordem, travando as que não devem ser alteradas pelo código:

  1. Camada “FUNDO_CORES” (travada): retângulos de sangria (3 mm) preenchidos com spot colors RAL 3020 (vermelho proibição), RAL 1003 (amarelo atenção), RAL 5015 (azul obrigação). Nomeie cada forma: fundo_vermelho, fundo_amarelo, fundo_azul.
  2. Camada “PICTOGRAMAS” (travada): importe SVGs oficiais da ABNT NBR 13434. Converta para curvas, agrupe por categoria e nomeie: pic_risco_eletrico, pic_espaco_confinado, pic_epi_obrigatorio, pic_proibido_fumar.
  3. Camada “TEXTOS_DINAMICOS” (desbloqueada): caixas de texto parágrafo com nomes exatos: txt_endereco, txt_tipo_servico, txt_responsavel, txt_data, txt_os_numero, txt_nivel_risco. Fonte: Arial Bold, 14 pt, kerning óptico.
  4. Camada “RASTREABILIDADE” (desbloqueada): texto pequeno no rodapé txt_codigo_rastreio (formato SIG-PIR-YYYYMMDD-SEQ-REV).

Salve como template_sinalizacao_desentupimento.cdr na pasta \Templates\Seguranca\ do servidor da empresa. Esse arquivo nunca deve ser editado manualmente — apenas a macro o abre, clona e preenche.

Fonte de dados: padronizando a entrada

A macro espera um CSV com codificação UTF-8 e colunas na ordem exata:

os_numero,endereco,tipo_servico,nivel_risco,responsavel_tecnico,data_execucao
OS-2024-00123,"Rua Padre Chico, 450 - Pirituba","Hidrojateamento rede pluvial","ALTO","Eng. João Silva","2024-01-15"
OS-2024-00124,"Av. Mutinga, 1200 - Pirituba","Desobstrução caixa de gordura","MEDIO","Téc. Maria Santos","2024-01-15"

Validações obrigatórias antes do loop:

  • nivel_risco ∈ {BAIXO, MEDIO, ALTO, CRITICO} (define qual fundo de cor será exibido).
  • tipo_servico mapeia para pictograma: “Hidrojateamento” → pic_risco_eletrico + pic_epi_obrigatorio; “Caixa de gordura” → pic_espaco_confinado + pic_proibido_fumar.
  • data_execucao no formato ISO (YYYY-MM-DD) para evitar ambiguidades regionais.

Se sua desentupidora usa ERP, exporte o relatório diário direto para esse CSV. Caso contrário, uma planilha compartilhada no OneDrive/Google Sheets com macro de exportação resolve. O artigo sobre automatização de identidade visual mostra padrão semelhante de leitura de planilha externa.

Código VBA: loop de geração e exportação

Abaixo, o coração da macro. Comentários explicam cada bloco; copie para um módulo novo no editor VBA do CorelDRAW (Alt+F11 → Inserir → Módulo).

Option Explicit

Public Sub GerarSinalizacaoPirituba()
    Dim docTemplate As Document
    Dim docNovo As Document
    Dim csvPath As String
    Dim fso As Object, ts As Object
    Dim linha As String
    Dim campos() As String
    Dim i As Long, seq As Long
    Dim codigoRastreio As String
    Dim shp As Shape
    Dim layerTextos As Layer, layerRastro As Layer
    Dim exportPath As String
    
    '--- Configurações ---
    csvPath = "\\SERVIDOR\Dados\OS_Pirituba_Hoje.csv"
    exportPath = "\\SERVIDOR\Saida\Sinalizacao_Pirituba_" & Format(Date, "YYYYMMDD") & "\"
    
    '--- Cria pasta de saída se não existir ---
    If Dir(exportPath, vbDirectory) = "" Then MkDir exportPath
    
    '--- Abre template (somente leitura) ---
    Set docTemplate = OpenDocument("\\SERVIDOR\Templates\Seguranca\template_sinalizacao_desentupimento.cdr", cdrOpenReadOnly)
    
    '--- Lê CSV ---
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.OpenTextFile(csvPath, 1, False, -2) ' -2 = UTF-8
    
    ' Pula cabeçalho
    If Not ts.AtEndOfStream Then ts.SkipLine
    
    seq = 0
    Do While Not ts.AtEndOfStream
        linha = ts.ReadLine
        If Trim(linha) <> "" Then
            campos = SplitCSVLinha(linha) ' Função auxiliar abaixo
            
            ' Validação mínima
            If UBound(campos) = 5 Then
                seq = seq + 1
                
                ' Clona template
                Set docNovo = docTemplate.Clone
                docNovo.Activate
                
                ' Referencia camadas
                Set layerTextos = docNovo.Layers("TEXTOS_DINAMICOS")
                Set layerRastro = docNovo.Layers("RASTREABILIDADE")
                layerTextos.Activate
                
                '--- Preenche textos ---
                Call SetTextByName(docNovo, "txt_os_numero", campos(0))
                Call SetTextByName(docNovo, "txt_endereco", campos(1))
                Call SetTextByName(docNovo, "txt_tipo_servico", campos(2))
                Call SetTextByName(docNovo, "txt_nivel_risco", "RISCO: " & campos(3))
                Call SetTextByName(docNovo, "txt_responsavel", "Resp. Técnico: " & campos(4))
                Call SetTextByName(docNovo, "txt_data", "Data: " & Format(CDate(campos(5)), "DD/MM/YYYY"))
                
                '--- Controla visibilidade de fundos e pictogramas por nível de risco ---
                Call AjustaVisibilidadeRisco(docNovo, campos(3), campos(2))
                
                '--- Código de rastreabilidade ---
                codigoRastreio = "SIG-PIR-" & Format(Date, "YYYYMMDD") & "-" & Format(seq, "000") & "-00"
                Call SetTextByName(docNovo, "txt_codigo_rastreio", codigoRastreio)
                
                '--- Exporta PDF/X-1a ---
                Dim pdfSettings As StructPdfSettings
                pdfSettings.Author = "Bonus630 Automação"
                pdfSettings.Title = "Sinalização Segurança - " & campos(0)
                pdfSettings.Subject = "NR-10/NR-12/NR-33"
                pdfSettings.Keywords = "desentupimento, Pirituba, segurança do trabalho"
                pdfSettings.UseColorProfile = True
                pdfSettings.ColorProfile = "FOGRA39"
                pdfSettings.Bleed = 3 ' mm
                pdfSettings.CropMarks = True
                
                docNovo.PublishToPDF exportPath & "SINAL_" & campos(0) & "_" & codigoRastreio & ".pdf", pdfSettings
                
                '--- Log em SQLite (simplificado: grava em TXT; implemente SQLite real em produção) ---
                Call GravaLog(exportPath & "_log_geracao.txt", codigoRastreio & vbTab & campos(0) & vbTab & campos(1) & vbTab & Now)
                
                docNovo.Close cdrDoNotSaveChanges
            End If
        End If
    Loop
    
    ts.Close
    docTemplate.Close cdrDoNotSaveChanges
    MsgBox "Geradas " & seq & " sinalizações em " & exportPath, vbInformation, "Concluído"
End Sub

'--- Auxiliares ---
Private Function SplitCSVLinha(ByVal linha As String) As String()
    ' Split respeitando aspas duplas e vírgulas internas
    Dim resultado() As String
    Dim dentroAspas As Boolean
    Dim atual As String
    Dim i As Long, count As Long
    ReDim resultado(0 To 5)
    count = 0
    atual = ""
    dentroAspas = False
    
    For i = 1 To Len(linha)
        Dim ch As String
        ch = Mid(linha, i, 1)
        If ch = """" Then
            dentroAspas = Not dentroAspas
        ElseIf ch = "," And Not dentroAspas Then
            resultado(count) = atual
            count = count + 1
            atual = ""
        Else
            atual = atual & ch
        End If
    Next i
    resultado(count) = atual
    SplitCSVLinha = resultado
End Function

Private Sub SetTextByName(ByVal doc As Document, ByVal nomeShape As String, ByVal texto As String)
    Dim shp As Shape
    On Error Resume Next
    Set shp = doc.FindShape(nomeShape)
    On Error GoTo 0
    If Not shp Is Nothing Then
        If shp.Type = cdrTextShape Then shp.Text.Story.Text = texto
    End If
End Sub

Private Sub AjustaVisibilidadeRisco(ByVal doc As Document, ByVal nivel As String, ByVal tipoServico As String)
    Dim shp As Shape
    ' Esconde todos os fundos primeiro
    For Each shp In doc.Layers("FUNDO_CORES").Shapes
        shp.Visible = False
    Next shp
    
    ' Mostra fundo conforme nível
    Select Case UCase(nivel)
        Case "ALTO", "CRITICO"
            Set shp = doc.FindShape("fundo_vermelho"): If Not shp Is Nothing Then shp.Visible = True
        Case "MEDIO"
            Set shp = doc.FindShape("fundo_amarelo"): If Not shp Is Nothing Then shp.Visible = True
        Case "BAIXO"
            Set shp = doc.FindShape("fundo_azul"): If Not shp Is Nothing Then shp.Visible = True
    End Select
    
    ' Esconde todos pictogramas
    For Each shp In doc.Layers("PICTOGRAMAS").Shapes
        shp.Visible = False
    Next shp
    
    ' Mostra pictogramas conforme tipo de serviço (exemplo simplificado)
    If InStr(1, UCase(tipoServico), "HIDROJATEAMENTO") > 0 Then
        doc.FindShape("pic_risco_eletrico").Visible = True
        doc.FindShape("pic_epi_obrigatorio").Visible = True
    ElseIf InStr(1, UCase(tipoServico), "CAIXA DE GORDURA") > 0 Then
        doc.FindShape("pic_espaco_confinado").Visible = True
        doc.FindShape("pic_proibido_fumar").Visible = True
    End If
End Sub

Private Sub GravaLog(ByVal caminhoLog As String, ByVal linha As String)
    Dim fNum As Long
    fNum = FreeFile
    Open caminhoLog For Append As #fNum
    Print #fNum, linha
    Close #fNum
End Sub

Ajuste de cores spot e perfil de impressão

O código acima assume que as formas fundo_vermelho, fundo_amarelo e fundo_azul já possuem preenchimento Uniform Fill do tipo Spot Color com nomes exatos “RAL 3020”, “RAL 1003” e “RAL 5015”. Para conferir: selecione a forma → docker Object Properties (Alt+Enter) → Fill → Uniform Fill → Palettes → Spot → digite o nome RAL. Se a paleta RAL não estiver instalada, importe o arquivo .cpl oficial (disponível no site da RAL) via Tools → Color Management → Palettes → Import.

Na exportação PublishToPDF, o parâmetro ColorProfile = "FOGRA39" força a conversão CMYK correta para impressão offset/grande formato. Se a sua gráfica rápida usa perfil ISO Coated v2 300% (ECI), altere para esse nome. Teste sempre com uma prova de cor física antes de liberar lote grande.

Rastreabilidade e auditoria: além do PDF

O código grava um log simples em texto. Em produção, substitua GravaLog por escrita em SQLite (referência System.Data.SQLite via COM ou use ADO com provider Microsoft.ACE.OLEDB.12.0 acessando um .accdb). Tabela sugerida:

Campo Tipo Descrição
codigo_rastreio TEXT PK SIG-PIR-YYYYMMDD-SEQ-REV
os_numero TEXT Número da ordem de serviço
endereco TEXT Endereço completo
hash_sha256 TEXT Hash do PDF gerado
usuario TEXT Login Windows do operador
timestamp_geracao DATETIME Data/hora exata
versao_template TEXT Ex.: v2.1-2024-01

O hash SHA-256 do PDF garante integridade: qualquer alteração posterior no arquivo impresso (rasura, sobreposição de adesivo) será detectada na conferência. Para gerar o hash no VBA, use a biblioteca CAPICOM (nativa no Windows) ou chame certutil -hashfile via Shell e capture a saída.

Integração com o fluxo da equipe de campo

  1. Manhã (6h30): Gestor exporta OSs do dia do ERP → CSV na pasta compartilhada.
  2. Técnico de segurança (6h45): Abre o CorelDRAW, carrega a macro (botão na barra de ferramentas personalizada) e executa GerarSinalizacaoPirituba.
  3. Impressão (7h00): Arquivos PDF saem na plotter de vinil refletivo (3M Diamond Grade) ou em papel couché 170g para laminação posterior.
  4. Corte e embalagem (7h15): Operador de acabamento confere código de rastreio na borda de cada placa, separa por endereço e entrega ao motorista.
  5. Campo (7h30): Equipe instala sinalização, fotografa com celular (app da empresa lê QR code opcional no rodapé) e envia para validação do responsável técnico.

Esse fluxo elimina a “arte final de última hora” e cria evidência documental para fiscalização do MTE, Cetesb ou auditoria do cliente corporativo. O artigo sobre cabeamento estruturado no escritório de design aborda infraestrutura de rede para que a pasta compartilhada e o servidor de templates não virem gargalo de latência.

Expansão: QR Code dinâmico e checklist móvel

Para ir além, adicione na camada RASTREABILIDADE um shape nomeado qr_code_placeholder. No loop VBA, gere a imagem do QR Code (use a DLL QRCoder via COM ou chame API gratuita https://api.qrserver.com/v1/create-qr-code/?data=...&size=200x200 via MSXML2.XMLHTTP), salve como PNG temporário, importe no CorelDRAW (docNovo.ImportEx) e substitua o placeholder. O payload do QR pode ser:

https://suaempresa.com.br/validar?codigo=SIG-PIR-20240115-001-00&os=OS-2024-00123

O app móvel da equipe lê o QR, abre checklist digital (“EPI conferido?”, “Sinalização fixada a 1,5m do risco?”, “Foto anexada?”) e grava geolocalização + timestamp. Isso fecha o ciclo: geração → instalação → evidência → relatório final automatizado.

Para publicar essa macro como extensão instalável no Gerenciador de Extensões do CorelDRAW, siga o passo a passo em como publicar suas macros.


Automatizar a sinalização de segurança para desentupimento em Pirituba não é apenas ganho de velocidade — é conformidade legal, rastreabilidade técnica e proteção da equipe. O template mestre, o CSV padronizado e o loop VBA formam um tripé que escala: hoje 10 placas, amanhã 200, sem contratar diagramador extra. Implemente o código, valide as cores com a gráfica e coloque o botão na barra de ferramentas do técnico de segurança ainda esta semana. Para serviços de campo na região, consulte desentupimento de esgoto em Pirituba e integre os dados reais ao seu fluxo de automação.

Checklist prático

0 de 9 concluídos

Perguntas frequentes

Quais normas regulamentadoras se aplicam à sinalização de segurança em serviços de desentupimento?

As principais normas são a NR-10 (segurança em instalações elétricas) e NR-12 (segurança no trabalho em máquinas e equipamentos), além da NR-33 para espaços confinados quando houver acesso a redes de esgoto profundas. A sinalização deve conter pictogramas padronizados, cores de segurança (vermelho para proibição, amarelo para atenção, azul para obrigação) e textos em português legíveis à distância.

Como o VBA no CorelDRAW agiliza a criação de múltiplas placas com dados variáveis?

O VBA permite criar um template mestre com camadas nomeadas e placeholders para textos dinâmicos (endereço, tipo de risco, responsável técnico, data). Um loop percorre uma planilha ou array com os dados de cada serviço em Pirituba, preenche os placeholders, aplica formatação condicional conforme o nível de risco e exporta cada placa em PDF/X-1a ou CDR pronto para impressão.

É possível integrar a macro com dados vindos de ordens de serviço externas?

Sim. A macro pode ler arquivos CSV, Excel ou até consumir uma API REST se o sistema de OS expuser endpoints. No contexto de Pirituba, costuma-se exportar a lista de atendimentos do dia do ERP da desentupidora para CSV e a macro importa, valida campos obrigatórios e gera o lote de sinalizações em segundos, eliminando digitação manual e erros de digitação.

Como garantir que as cores de impressão correspondam às normas de segurança (vermelho RAL 3020, amarelo RAL 1003)?

Defina as cores no CorelDRAW como tons de registro (spot colors) com nomes exatos (ex.: "RAL 3020", "RAL 1003") e configure o perfil de saída CMYK FOGRA39. A macro trava essas cores nos objetos de fundo e pictogramas, impedindo conversão acidental para RGB. Na exportação, force a separação de cores para que a gráfica receba as chapas corretas.

Qual a melhor forma de versionar e auditar os modelos de sinalização gerados?

Inclua no rodapé de cada placa um código de rastreabilidade: "SIG-PIR-YYYYMMDD-SEQ-REV". A macro grava log em SQLite local com hash SHA-256 do arquivo gerado, dados da OS, usuário e timestamp. Assim, qualquer fiscalização ou auditoria interna consegue confirmar a autenticidade e a versão exata da sinalização instalada no local.