Interface para controlar chamados de ralos entupidos em tempo real com VBA
Crie painel em tempo real no CorelDRAW para gerenciar chamados de ralos entupidos. Automação VBA com formulários, filas e alertas visuais para equipes.
Mais de 60% das equipes de campo ainda usam planilhas estáticas ou grupos de WhatsApp para despachar chamados de emergência, o que gera atrasos médios de 22 minutos entre a abertura e o efetivo atendimento. Um painel vivo, embutido no ambiente que a equipe já opera — o CorelDRAW —, elimina a troca de contexto e transforma a gestão de filas em processo visual e rastreável.
A automação VBA no CorelDRAW vai além de criar artes: com UserForms, APIs do Windows e conexão a dados externos, é viável construir uma central de despacho que atualiza status, prioriza por SLA e alerta a equipe sem sair da janela de produção gráfica. O segredo está em separar a camada de dados da camada de apresentação, usando Recordsets desconectados e timers assíncronos.
Arquitetura de dados para fila em tempo real
A base do sistema é uma tabela única com colunas padronizadas: ChamadoID (chave primária), Status (Aberto, Em Atendimento, Aguardando Material, Concluído, Cancelado), Prioridade (Crítica, Alta, Normal, Baixa), EnderecoCompleto, ContatoCliente, Telefone, DataHoraAbertura, DataHoraAtendimento, TecnicoResponsavel, Observacoes. Se a origem for Excel em rede, salve como .xlsx na pasta compartilhada com permissão de leitura/escrita para o grupo Desentupimento. Para Access ou SQL Server, crie índice composto em Status + Prioridade + DataHoraAbertura — isso acelera a query SELECT * FROM Chamados WHERE Status <> 'Concluído' ORDER BY Prioridade DESC, DataHoraAbertura.
No VBA, declare um ADODB.Connection global no módulo modConexao e uma função GetRecordsetDesconectado() que abre Recordset com CursorLocation = adUseClient, CursorType = adOpenStatic, LockType = adLockBatchOptimistic, executa a query e depois define Set rs.ActiveConnection = Nothing. Assim, o formulário manipula dados em memória e só reconecta ao gravar (UpdateBatch), reduzindo travas no arquivo de rede.
UserForm: controles, layout e binding
Crie um UserForm chamado frmPainelChamados com largura 980 e altura 620. Adicione um ListView (lvwChamados) ocupando 80% da altura, configurado em View = lvwReport, FullRowSelect = True, Gridlines = True, MultiSelect = False. Popule colunas via código no UserForm_Initialize:
With lvwChamados.ColumnHeaders
.Add , "ID", "ID", 50
.Add , "Status", "Status", 110
.Add , "Prioridade", "Pri", 45
.Add , "Endereço", "Endereço", 280
.Add , "Contato", "Contato", 140
.Add , "Abertura", "Abertura", 130
.Add , "Técnico", "Técnico", 120
End With
lvwChamados.SortKey = 3 ' Prioridade
lvwChamados.SortOrder = lvwDescending
Associe um ImageList (imgStatus) com quatro ícones 16x16 (vermelho, laranja, amarelo, verde) e defina lvwChamados.SmallIcons = imgStatus. No evento lvwChamados_ItemClick, preencha controles de detalhe (TextBoxes txtEndereco, txtContato, txtObs) e habilite botões btnAtender, btnConcluir, btnReagendar. Use Tag do ListItem para guardar o ChamadoID original.
Timer assíncrono sem travar o CorelDRAW
O Application.OnTime do VBA do Excel não existe no CorelDRAW. Use a API SetTimer/KillTimer do user32.dll. No topo de um módulo padrão (modTimer):
#If VBA7 Then
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long) As Long
#Else
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If
Private lngTimerID As Long
Private frmRef As frmPainelChamados
Public Sub IniciarTimer(form As frmPainelChamados, Optional intervaloMs As Long = 20000)
Set frmRef = form
lngTimerID = SetTimer(0&, 0&, intervaloMs, AddressOf TimerCallback)
End Sub
Public Sub PararTimer()
If lngTimerID <> 0 Then KillTimer 0&, lngTimerID: lngTimerID = 0
End Sub
Private Sub TimerCallback(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
On Error Resume Next
If Not frmRef Is Nothing Then frmRef.AtualizarGrade
End Sub
No UserForm_Initialize, chame modTimer.IniciarTimer Me, 20000 (20 segundos). No UserForm_QueryClose, chame modTimer.PararTimer. O método AtualizarGrade deve preservar a seleção atual (guardar ChamadoID do lvwChamados.SelectedItem.Tag), recarregar o Recordset desconectado, repopular o ListView e restaurar a seleção.
Ações de despacho e concorrência
Cada botão de ação executa uma transação otimista:
btnAtender_Click: abreRecordsetconectado (adLockOptimistic), filtraChamadoID, alteraStatus = "Em Atendimento",TecnicoResponsavel = Environ("USERNAME"),DataHoraAtendimento = Now,Update, fecha.btnConcluir_Click: mesma lógica,Status = "Concluído".btnReagendar_Click: abre formulário modalfrmReagendarcomDateTimePickereComboBoxde técnico, grava novaDataHoraPrevisaoeStatus = "Aguardando Material".
Trate erro 3260 (conflito de atualização) exibindo MsgBox "Outro atendente alterou este chamado. Atualize a grade e tente novamente.", vbExclamation e force AtualizarGrade. Para evitar edição simultânea, adicione coluna LockBy e LockTime na tabela; ao clicar em Atender, preencha com usuário e hora atuais; o timer ignora linhas onde LockBy <> "" And LockBy <> Environ("USERNAME") And LockTime > DateAdd("n", -5, Now).
Alertas visuais e sonoros para SLA
Defina SLA por prioridade: Crítica = 30 min, Alta = 60 min, Normal = 4 h, Baixa = 8 h. No AtualizarGrade, percorra os itens do ListView e calcule DateDiff("n", CDate(item.SubItems(5)), Now). Se MinutosEspera > SLA e Status <> "Concluído", altere item.SmallIcon = 1 (vermelho piscando) e, se for a primeira detecção nessa sessão (item.Tag não tem flag Alertado), toque Beep e chame FlashWindowEx no handle do CorelDRAW (Application.hwnd). Armazene a flag no Tag concatenando "|ALERTADO".
Para notificação via WhatsApp, adicione botão btnNotificar que monta ShellExecute 0, "open", "whatsapp://send?phone=5511999999999&text=Chamado%20" & ChamadoID & "%20atribu%C3%ADdo%20a%20voc%C3%AA.", "", "", 1. Requer WhatsApp Desktop instalado. Para e-mail, use CDO.Message com servidor SMTP da empresa.
Integração com fluxo de produção gráfica
O painel vive no CorelDRAW porque a equipe de arte finaliza layouts de ordens de serviço, etiquetas de equipamento e relatórios fotográficos no mesmo ambiente. Adicione botão btnGerarOS que cria novo documento a partir de template .cdrt (página A4 com campos mesclados), preenche ActiveDocument.Variables com dados do chamado e executa ActiveDocument.PrintOut para impressora térmica de etiquetas. Veja como automação no CorelDRAW melhora fluxo de atendimento no Bom Retiro e automação VBA aplicada à criação de ativos visuais para projetos.
Para equipes que também gerenciam landing pages de captação de chamados, a mesma base de dados alimenta formulários web. Consulte automação acelera landing pages para ranquear em São Bernardo e artes para landing pages em São Bernardo do Campo geradas por VBA.
Distribuição, instalação e manutenção
Empacote o .gms (GlobalMacroStorage) junto com os .ocx necessários (MSCOMCTL.OCX, MSWINSCK.OCX se usar Winsock) em script Inno Setup (setup.iss). O instalador deve:
- Verificar CorelDRAW instalado (registro
HKLM\SOFTWARE\Corel\CorelDRAW\<versão>\InstallPath). - Copiar
PainelChamados.gmspara\GMS\da versão detectada. - Registrar OCXs com
regsvr32 /s(exige execução como administrador). - Criar atalho na barra de ferramentas do CorelDRAW via
Customization.Commands.AddMacro. - Gravar caminho da base de dados (UNC
\\Servidor\Compartilhado\Chamados.accdb) emHKCU\Software\Bonus630\PainelChamados\DataSource.
Atualizações futuras: incremente versão no ThisMacroStorage.Version e adicione rotina VerificarAtualizacao no UserForm_Initialize que lê versão do servidor (arquivo version.txt no compartilhamento) e alerta se defasada.
Com essa estrutura, a central de despacho deixa de ser planilha passiva e vira painel operacional vivo, reduzindo o tempo de reação da equipe em até 40% e garantindo rastreabilidade total de cada chamado de desentupimento de ralos SP. A automação VBA no CorelDRAW prova que a ferramenta de design gráfico também é plataforma de gestão de campo quando bem programada.
Checklist prático
Perguntas frequentes
Como o VBA no CorelDRAW consegue exibir dados em tempo real?
O VBA utiliza timers via API do Windows (SetTimer/KillTimer) para consultar periodicamente a fonte de dados — planilha, banco Access/SQL ou API REST — e atualizar controles de formulário (ListView, MSFlexGrid) sem travar a interface do CorelDRAW.
Qual a melhor forma de estruturar a fila de chamados no formulário?
Use uma Collection ou Dictionary indexada por ID do chamado, com objetos personalizados contendo status, prioridade, endereço e timestamp. Ordene a exibição por prioridade (crítico > alto > normal) e tempo de espera, atualizando a ListView a cada ciclo do timer.
É possível integrar com WhatsApp ou e-mail para notificar a equipe?
Sim. O VBA pode chamar ShellExecute para abrir URLs `whatsapp://send?text=...` ou `mailto:...` com parâmetros pré-preenchidos. Para automação silenciosa, use WinHTTP para POST em APIs de gateway (Twilio, Zenvia) ou SMTP via CDO.Message, exigindo referência à biblioteca Microsoft CDO.
Como evitar conflitos quando múltiplos atendentes abrem o painel?
Centralize a fonte de dados em banco Access/SQL com trava de registro (pessimistic lock) ou use arquivo Excel em rede com modo `xlExclusive`. O formulário deve ler `Recordset` desconectado (adUseClient) e sincronizar alterações via `UpdateBatch`, tratando erros de concorrência no evento `WillChangeRecord`.
Quais controles ActiveX são recomendados para o painel?
ListView (MSCOMCTL.OCX) para grade com colunas redimensionáveis, ImageList para ícones de status (vermelho/amarelo/verde), TreeView se houver hierarquia (região > equipe > chamado), e DateTimePicker para filtros de data. Registre os OCXs no Windows do usuário via script de instalação.
Como distribuir essa macro para a equipe sem instalar o CorelDRAW em cada máquina?
A macro roda dentro do CorelDRAW, então cada atendente precisa da aplicação. Alternativa: compile a lógica em DLL ActiveX (VB6/Visual Studio) e chame via `CreateObject` de um executável standalone (AutoIt, PowerShell, Electron) que apenas exibe o painel e consulta o banco, sem depender do CorelDRAW.