Macros VBA/GMS

Alerta automático para escalonamento de equipes 24 horas na Grande São Paulo com VBA

Automatize alertas de escalonamento para equipes 24h na Grande SP usando VBA no CorelDRAW. Reduza tempo de resposta e evite falhas na comunicação.

São 3h da madrugada em Osasco. O arquivo de produção de uma grande gráfica da Grande São Paulo travou numa etapa de imposição e ninguém foi avisado. O operador de plantão só descobriu às 6h, quando a fila de impressão já estava comprometida e o prazo do cliente, perdido. Cenários como esse se repetem em bureaus, agências e departamentos de arte que rodam 24 horas: a automação no CorelDRAW processa o trabalho, mas a comunicação de falha continua manual, frágil e dependente de alguém olhar a tela.

A solução não está em comprar novo software de monitoramento, mas em estender a macro VBA que já roda na máquina para falar com o mundo externo. Um alerta automático bem desenhado transforma um silêncio perigoso em uma notificação no WhatsApp do líder de turno, no canal do Teams da produção ou no e-mail do gestor — com dados contextuais: nome do arquivo, etapa travada, hora do erro e link direto para o log. O resultado é tempo de resposta medido em minutos, não em turnos.

Este artigo mostra como estruturar esse escalonamento usando apenas recursos nativos do VBA (WinHttpRequest, CDO, Shell) e boas práticas de engenharia: idempotência, retentativa exponencial, configuração externa e auditoria. Você verá o fluxo completo, do gatilho no documento até a entrega na mão de quem resolve, com código pronto para adaptar.

O gatilho certo: o que vigiar no fluxo de produção

Nem todo erro merece acordar a equipe. O primeiro passo é classificar eventos em três níveis: informativo (log local), atenção (e-mail diurno) e crítico (escalação imediata). No CorelDRAW, os pontos de observação mais confiáveis são:

  • Evento DocumentAfterSave travado por mais de 15 minutos (indica loop ou deadlock).
  • Macro de imposição/nesting que não dispara OnFinish no tempo esperado.
  • Arquivo com status “Em produção” aberto há mais de 2 horas sem alteração de páginas.
  • Falha de conexão com servidor de ativos (PDFs base, perfis ICC, bibliotecas de símbolos).

Cada condição vira uma função booleana DeveEscalar() que retorna True apenas quando todas as validações passam: horário de plantão ativo, arquivo não está em manutenção programada, último alerta enviado há mais de 30 minutos. Essa guarda evita tempestade de notificações quando o servidor cai e todos os arquivos travam juntos.

Arquitetura da notificação: canais, payload e idempotência

O coração do alerta é um JSON padronizado que qualquer consumidor entende. Exemplo mínimo:

{
  "evento": "ESCALACAO_CRITICA",
  "timestamp": "2024-03-15T03:12:03-03:00",
  "origem": {
    "maquina": "WS-GRAFICA-07",
    "usuario": "producao_noturno",
    "coreldraw_version": "24.0.0.301"
  },
  "contexto": {
    "arquivo": "\\SRV-ARQUIVOS\\PRODUCAO\\CLIENTE_X\\JOB_20240315_001.cdr",
    "etapa": "IMPOSICAO_32PAG",
    "tempo_parado_seg": 1420,
    "ultimo_log": "Erro 52: Nome ou número de arquivo inválido ao exportar PDF"
  },
  "escalation": {
    "nivel": 1,
    "contatos": ["+5511999998888", "lider.turno@empresa.com"],
    "canais": ["WHATSAPP", "EMAIL"]
  },
  "idempotency_key": "WS-GRAFICA-07_JOB_20240315_001_IMPOSICAO_32PAG_20240315T03"
}

A idempotency_key garante que reenvios (retentativa de rede, duplo clique no botão de teste) não gerem alertas duplicados. O receptor (webhook, função Azure, script no n8n) deve armazenar as chaves processadas nas últimas 24h e ignorar repetidas.

Envio via WhatsApp (webhook) com retentativa exponencial

O bloco abaixo é o motor de envio. Copie para um módulo modAlertaWhatsApp e chame EnviarAlertaWhatsApp(payloadJson, webhookUrl).

Option Explicit

Private Const MAX_TENTATIVAS As Long = 3
Private Const TEMPO_BASE_SEG As Long = 5 ' 5s, 10s, 20s

Public Function EnviarAlertaWhatsApp(ByVal jsonPayload As String, ByVal webhookUrl As String) As Boolean
    Dim http As Object
    Dim tentativa As Long
    Dim waitSeg As Long
    Dim resposta As String
    
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
    http.SetTimeouts 5000, 10000, 15000, 15000
    
    For tentativa = 1 To MAX_TENTATIVAS
        On Error Resume Next
        http.Open "POST", webhookUrl, False
        http.SetRequestHeader "Content-Type", "application/json"
        http.Send jsonPayload
        
        If Err.Number = 0 Then
            If http.Status = 200 Then
                EnviarAlertaWhatsApp = True
                LogLocal "ALERTA_OK", webhookUrl, jsonPayload
                Exit Function
            Else
                LogLocal "ALERTA_HTTP_" & http.Status, webhookUrl, http.ResponseText
            End If
        Else
            LogLocal "ALERTA_ERR_" & Err.Number, webhookUrl, Err.Description
        End If
        On Error GoTo 0
        
        waitSeg = TEMPO_BASE_SEG * (2 ^ (tentativa - 1))
        Sleep waitSeg * 1000 ' precisa de Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Next tentativa
    
    EnviarAlertaWhatsApp = False
    LogLocal "ALERTA_FALHA_FINAL", webhookUrl, jsonPayload
End Function

Private Sub LogLocal(tipo As String, url As String, payload As String)
    Dim fNum As Long, logPath As String
    logPath = Environ$("TEMP") & "\CorelDRAW_Alertas.log"
    fNum = FreeFile
    Open logPath For Append As #fNum
    Print #fNum, Format$(Now, "yyyy-mm-dd hh:nn:ss") & " | " & tipo & " | " & url & " | " & Left$(payload, 200)
    Close #fNum
End Sub

Pontos críticos do código:

  1. SetTimeouts evita travamento infinito se o webhook não responder.
  2. Sleep (API Windows) libera a CPU durante a espera; sem ele, o CorelDRAW congela.
  3. LogLocal grava em arquivo texto no %TEMP% — sobrevive a reinício da macro e não precisa de banco.
  4. A função retorna Boolean; o chamador decide se tenta e-mail como fallback.

Fallback para e-mail (CDO) quando webhook falha

Se o WhatsApp não entregar, o mesmo payload segue por e-mail corporativo usando CDO (funciona em qualquer Windows com Outlook ou servidor SMTP configurado).

Public Function EnviarAlertaEmail(ByVal jsonPayload As String, ByVal assunto As String, ByVal destinatarios As String) As Boolean
    Dim msg As Object, cfg As Object
    Set msg = CreateObject("CDO.Message")
    Set cfg = CreateObject("CDO.Configuration")
    
    With cfg.Fields
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 ' SMTP
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.empresa.com.br"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "alertas@empresa.com.br"
        .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "senha_do_app"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
        .Update
    End With
    
    Set msg.Configuration = cfg
    msg.From = "alertas@empresa.com.br"
    msg.To = destinatarios
    msg.Subject = assunto
    msg.TextBody = "Alerta automático CorelDRAW\n\n" & jsonPayload
    
    On Error Resume Next
    msg.Send
    EnviarAlertaEmail = (Err.Number = 0)
    On Error GoTo 0
    
    If Not EnviarAlertaEmail Then LogLocal "EMAIL_FALHA", destinatarios, Err.Description
End Function

Configuração externa: planilha de parâmetros versionada

Hardcodear horários, telefones e URLs no código é receita para falha na primeira mudança de turno. Crie ConfigEscalacao.xlsx no SharePoint/OneDrive com abas:

Aba Colunas chave
Turnos Inicio, Fim, Lider, Telefone, Email
Canais Nome, Tipo (WHATSAPP/EMAIL/TEAMS), Endpoint, Ativo
Regras Evento, ThresholdSeg, NivelEscala, CooldownMin
Feriados Data, Descricao

A macro lê o arquivo na inicialização com ADODB (provider Microsoft.ACE.OLEDB.12.0) e carrega em Collection/Dictionary. Alterações na planilha entram em vigor na próxima execução — sem recompilar o .gms.

Auditoria e painel de controle simples

Cada envio (sucesso ou falha) gera linha no log local. Para visibilidade gerencial, agende um Power Automate / Power Query que leia todos os CorelDRAW_Alertas.log das estações, consolide em uma lista SharePoint e alimente um dashboard no Power BI: volume por turno, taxa de falha por canal, tempo médio até primeiro ACK da equipe. Isso transforma o alerta em métrica de SLA interno.

Testes realistas: simulação de fim de semana

Antes de ir para produção, execute o roteiro:

  1. Sexta 18h: ative modo “simulação” (flag na planilha que redireciona webhooks para canal de teste no Teams).
  2. Dispare gatilhos artificiais: trave imposição, simule rede caída, force erro de exportação.
  3. Meça: tempo até mensagem no celular do líder, clareza do payload, ação tomada.
  4. Ajuste ThresholdSeg e CooldownMin com base nos falsos positivos observados.
  5. Documente lições no README do repositório da macro.

Integração com o ecossistema de produção gráfica

O alerta não vive isolado. Ele complementa automações que já existem no seu parque: a geração de ativos visuais em escala, a preparação de artes para campanhas pagas e a otimização de landing pages para ranqueamento. Veja como outros times usam VBA no CorelDRAW para eliminar gargalos semelhantes: Automação VBA aplicada à criação de ativos visuais para projetos, Automação prepara artes para campanhas pagas em Goiânia e Automação acelera landing pages para ranquear em São Bernardo.

Quando o ralo lento para escoar na Grande São Paulo vira metáfora para o fluxo de arquivos travado, a automação de alerta é o hidrojateamento que resolve antes da inundação. ralo lento para escoar na Grande São Paulo

Implemente o escalonamento em camadas: log local → webhook com retentativa → e-mail fallback → painel de auditoria. Teste no modo simulação por duas semanas. Quando a primeira madrugada real chegar e o celular do líder vibrar com o JSON certo, você saberá que o plantão 24 horas finalmente tem olhos no código, não só na tela.

Checklist prático

0 de 9 concluídos

Perguntas frequentes

Como o VBA no CorelDRAW pode disparar alertas para equipes externas?

O VBA pode acionar APIs REST, enviar e-mails via Outlook ou gravar em bancos de dados compartilhados que sistemas de monitoramento leem. A macro atua como gatilho: ao detectar condição crítica no arquivo ou fluxo, executa a rotina de notificação sem intervenção manual.

É possível integrar o alerta com WhatsApp ou Telegram da equipe de plantão?

Sim. A macro VBA chama uma URL de webhook (ex.: Twilio, Z-API, Bot do Telegram) via WinHttpRequest. O payload JSON contém dados da ocorrência e o destinatário recebe a mensagem em segundos, sem depender de e-mail corporativo.

Como evitar falsos positivos que acordam a equipe à toa?

Implemente regras de validação: confirme se o arquivo está aberto no setor correto, se há dados novos nas últimas horas e se o status não foi resolvido. Use logs locais e contadores de retentativa antes de escalar para o canal de urgência.

O escalonamento funciona se o CorelDRAW estiver fechado?

Não. O VBA roda dentro da instância do CorelDRAW. Para cobertura 24h real, agende a macro via Task Scheduler abrindo o CorelDRAW em modo silencioso (/automation) ou migre a lógica crítica para um serviço Windows (ex.: Python/Node) que consulte a mesma fonte de dados.

Quais permissões de rede e antivírus costumam bloquear o envio do alerta?

Firewall corporativo pode bloquear portas 443/80 para IPs desconhecidos; antivírus pode barrar scripts que disparam HTTP. Libere o executável do CorelDRAW e o domínio do webhook na política de exceções; teste com curl/PowerShell antes de culpar o código.

Como versionar e auditar as regras de escalonamento sem bagunçar o código?

Armazene parâmetros (horários, contatos, thresholds) em planilha Excel ou JSON versionado no SharePoint/Git. A macro lê o arquivo externo na inicialização. Alterações de regra não exigem recompilação do GMS e ficam rastreáveis no histórico do repositório.