Macros VBA/GMS

Relatório dinâmico de atendimentos residenciais e comerciais em São Paulo com VBA

Aprenda a criar relatórios dinâmicos no CorelDRAW com VBA para automatizar atendimentos residenciais e comerciais em São Paulo.

Como transformar uma planilha caótica de chamados em um relatório visual, padronizado e pronto para impressão — sem abrir o CorelDRAW uma única vez?

Equipes de manutenção e desentupimento na capital paulista lidam diariamente com dezenas de atendimentos entre residências, condomínios e estabelecimentos comerciais. O volume de dados — endereços, tipos de ocorrência, status, responsáveis — costuma viver em planilhas compartilhadas, grupos de mensagem ou cadastros dispersos. Na hora de prestar contas ao gestor ou ao cliente final, o gargalo aparece: alguém precisa montar o documento no CorelDRAW, copiar célula por célula, ajustar fontes, alinhar caixas de texto e exportar PDF. O processo é lento, propenso a erros e consome horas que poderiam ir para a operação.

A automação com VBA resolve esse ciclo fechando a ponte entre a origem dos dados e o layout gráfico. O código lê a fonte estruturada, instancia o modelo no CorelDRAW, preenche cada campo nas formas nomeadas, aplica regras visuais conforme o tipo de atendimento e gera o PDF final. O analista só valida o resultado. Abaixo, detalho cada etapa para implementar isso em produção.

Estrutura da fonte de dados

Antes de escrever uma linha de código, a planilha ou banco precisa seguir contrato rígido. Colunas obrigatórias: ID_Chamado, DataHora, Cliente, EnderecoCompleto, Bairro, Cidade, TipoAtendimento (valores: “Residencial” ou “Comercial”), Status (“Aberto”, “Em Andamento”, “Concluído”, “Cancelado”), TecnicoResponsavel, Observacoes. Use validação de dados no Excel para restringir TipoAtendimento e Status a listas suspensas — isso evita “Residencial” vs “residencial” quebrando o filtro no VBA.

Mantenha a fonte em caminho de rede acessível (ex: \\servidor\dados\chamados.xlsx) ou em banco Access/SQL com DSN configurado. Se usar Excel, feche o arquivo antes de rodar a macro; o VBA abre via ADO (Provider=Microsoft.ACE.OLEDB.12.0) sem travar o arquivo para outros usuários. Inclua coluna RegiaoSP (“Centro”, “Zona Norte”, “Zona Sul”, “Zona Leste”, “Zona Oeste”, “Grande SP”) para permitir agrupamentos geográficos no relatório.

Modelo no CorelDRAW: nomes, não índices

Crie um arquivo .cdr mestre (Modelo_Relatorio_Atendimentos.cdr) com uma página por atendimento. Insira formas de texto artístico ou parágrafo para cada campo e renomeie cada objeto no painel “Gerenciador de Objetos” (F12): txtID, txtDataHora, txtCliente, txtEndereco, txtBairro, txtCidade, txtTipo, txtStatus, txtTecnico, txtObs. Crie também um retângulo de fundo chamado bgTipo — ele mudará de cor conforme o tipo (verde claro para Residencial, azul claro para Comercial). Agrupe elementos de cabeçalho/logotipo em camada travada Camada_Fixa para não serem alterados.

Salve o modelo em pasta somente leitura para o usuário comum, mas com permissão de escrita para a conta que roda a automação. O VBA fará OpenDocument desse modelo, clonará a página-mestre para cada registro e preencherá pelo nome da forma: ActivePage.Shapes("txtCliente").Text.Story.Text = rs.Fields("Cliente").Value. Isso torna o código imune a reordenação de camadas ou adição de objetos decorativos.

Rotina principal de geração

Sub GerarRelatorioAtendimentos()
    Dim cdrApp As Application
    Dim docModelo As Document, docRel As Document
    Dim pgMestre As Page, pgNova As Page
    Dim conn As Object, rs As Object
    Dim sql As String, caminhoModelo As String, caminhoSaida As String
    Dim contador As Long
    
    Set cdrApp = CreateObject("CorelDRAW.Application")
    cdrApp.Visible = False
    
    caminhoModelo = "\\servidor\modelos\Modelo_Relatorio_Atendimentos.cdr"
    Set docModelo = cdrApp.OpenDocument(caminhoModelo)
    Set pgMestre = docModelo.Pages(1)
    
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\servidor\dados\chamados.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES;'"
    sql = "SELECT * FROM [Chamados$] WHERE Status <> 'Cancelado' ORDER BY RegiaoSP, TipoAtendimento, DataHora"
    Set rs = conn.Execute(sql)
    
    Set docRel = cdrApp.CreateDocument
    docRel.Unit = cdrMillimeter
    contador = 0
    
    Do While Not rs.EOF
        Set pgNova = docRel.Pages.Add
        pgMestre.Copy pgNova
        
        With pgNova
            .Shapes("txtID").Text.Story.Text = rs.Fields("ID_Chamado").Value
            .Shapes("txtDataHora").Text.Story.Text = Format(rs.Fields("DataHora").Value, "dd/mm/yyyy hh:nn")
            .Shapes("txtCliente").Text.Story.Text = rs.Fields("Cliente").Value
            .Shapes("txtEndereco").Text.Story.Text = rs.Fields("EnderecoCompleto").Value
            .Shapes("txtBairro").Text.Story.Text = rs.Fields("Bairro").Value
            .Shapes("txtCidade").Text.Story.Text = rs.Fields("Cidade").Value
            .Shapes("txtTipo").Text.Story.Text = rs.Fields("TipoAtendimento").Value
            .Shapes("txtStatus").Text.Story.Text = rs.Fields("Status").Value
            .Shapes("txtTecnico").Text.Story.Text = rs.Fields("TecnicoResponsavel").Value
            .Shapes("txtObs").Text.Story.Text = Nz(rs.Fields("Observacoes").Value, "")
            
            If rs.Fields("TipoAtendimento").Value = "Residencial" Then
                .Shapes("bgTipo").Fill.UniformColor.RGBAssign 200, 255, 200
            Else
                .Shapes("bgTipo").Fill.UniformColor.RGBAssign 200, 220, 255
            End If
        End With
        
        contador = contador + 1
        rs.MoveNext
    Loop
    
    rs.Close: conn.Close
    docModelo.Close False
    
    caminhoSaida = "\\servidor\relatorios\REL_Atendimentos_" & Format(Date, "yyyymmdd") & ".pdf"
    docRel.PublishToPDF caminhoSaida, cdrPDFRangeAllPages, False, False, False, False, False, False, False, False, False
    docRel.Close False
    cdrApp.Quit
    
    MsgBox "Relatório gerado: " & contador & " atendimentos → " & caminhoSaida, vbInformation
End Sub

Filtros, ordenação e seções automáticas

O ORDER BY RegiaoSP, TipoAtendimento, DataHora no SQL já agrupa os registros. Para inserir páginas de separação (capa por região ou sumário), adicione lógica que detecta mudança de RegiaoSP no laço: quando rs.Fields("RegiaoSP").Value <> regiaoAnterior, insira página extra baseada em outro modelo (Modelo_Capa_Regiao.cdr) e preencha apenas o nome da região. O mesmo vale para transição Residencial → Comercial dentro da mesma região.

Se o volume ultrapassar 200 atendimentos por execução, divida em múltiplos PDFs por região para não estourar memória do CorelDRAW. Use docRel.SaveAs intermediário a cada 100 páginas e depois consolide com ferramenta de linha de comando (ex: pdftk) ou gere ZIP com todos os PDFs regionais.

Exportação, nomenclatura e entrega

O PublishToPDF aceita parâmetros de qualidade, fontes embutidas, compressão de imagens e metadados. Defina cdrPDFRangeAllPages e desmarque opções de marca de corte/registro para PDF limpo. Nomeie o arquivo com padrão REL_Atendimentos_YYYYMMDD_HHNNSS_TipoRegiao.pdf — isso evita sobrescrita e facilita busca no servidor. Após gerar, a rotina pode copiar para pasta de compartilhamento do gestor, enviar por e-mail via CDO/Outlook ou disparar webhook para sistema de gestão.

Registre log em arquivo texto (\\servidor\logs\relatorio_atendimentos_YYYYMMDD.log) com timestamp, quantidade de registros, caminho do PDF, duração em segundos e eventuais erros (ex: forma não encontrada, campo nulo). Use On Error Resume Next pontual nas atribuições de texto e valide If .Shapes("txtCliente") Is Nothing Then LogErro "Forma txtCliente ausente na página " & pgNova.Index.

Agendamento e execução desatendida

Empacote a macro em um complemento .gms (Arquivo → Complementos → Empacotar) ou salve em .cdr separado (Gerador_Relatorios.cdr) e chame via VBScript agendado:

Set app = CreateObject("CorelDRAW.Application")
app.Visible = False
app.Documents.Open "\\servidor\macros\Gerador_Relatorios.cdr"
app.GMSManager.RunMacro "Gerador_Relatorios.cdr", "Module1.GerarRelatorioAtendimentos"
app.Quit

No Agendador de Tarefas, crie tarefa diária às 06h30 com conta de serviço que tenha licença CorelDRAW válida e acesso às pastas de rede. Marque “Executar mesmo se o usuário não estiver logado” e “Executar com privilégios mais altos”. Teste antes em horário comercial monitorando o log.

Integração com rotinas de campo

Equipes que atendem emergências de esgoto e hidrojateamento muitas vezes precisam consultar o relatório impresso no veículo. O PDF gerado pode incluir QR code com link para o chamado no sistema — gere o código no VBA via biblioteca ZXing ou API gratuita e insira como imagem (ActivePage.ImportEx). Isso conecta o papel ao digital sem digitação.

Para situações de gordura acumulada no cano em São Paulo e região, o relatório dinâmico permite filtrar apenas ocorrências de “Caixa de Gordura” e gerar relatório específico para a equipe de hidrojateamento, com campos extras: DiametroTubulacao, MetrosLineares, EquipamentoNecessario. A mesma estrutura de código atende — só adiciona colunas na origem e formas no modelo.

Monitoramento e evolução

Inclua versão no rodapé do relatório (v1.3 - 2024-11-15) gravada pelo VBA a partir de constante no código. Quando o layout mudar, incremente a versão e atualize o modelo — o código continua funcionando se os nomes das formas forem mantidos. Colete feedback dos gestores mensalmente: campos faltando, ordem de prioridade, necessidade de gráficos (barras por região, pizza por status). O CorelDRAW VBA suporta criação de gráficos via Shapes.AddChart alimentado por array montado no laço.

Com essa base, o relatório deixa de ser tarefa manual de fim de dia e vira ativo confiável, auditável e escalável. A automação paga o investimento na primeira semana de uso.

Pronto para implementar? Comece pelo modelo no CorelDRAW e pela planilha padronizada — o código é consequência natural. Mantenha os nomes das formas como contrato vivo entre design e automação.

Checklist prático

0 de 9 concluídos

Perguntas frequentes

Como o VBA no CorelDRAW pode gerar relatórios dinâmicos de atendimentos?

O VBA acessa objetos do CorelDRAW como páginas, camadas e formas para preencher modelos com dados de planilhas ou bancos de dados. Cada atendimento vira uma página formatada automaticamente, com endereço, tipo de serviço e status. Isso elimina cópia e colagem manual e garante padronização visual.

Quais fontes de dados funcionam melhor para alimentar o relatório?

Planilhas Excel (via ADO ou objeto Excel), arquivos CSV e bancos Access/SQL Server são ideais. O VBA lê linhas, filtra por data ou região e escreve nos placeholders do layout no CorelDRAW. Evite digitação direta no documento; use origem estruturada.

É possível separar atendimentos residenciais e comerciais no mesmo relatório?

Sim. Use campos de categoria na origem de dados e, no laço VBA, aplique estilos, cores ou páginas distintas conforme o tipo. Também pode gerar arquivos separados ou seções com sumário automático. A lógica condicional no código controla tudo.

Como evitar erros quando o layout do CorelDRAW muda?

Nomeie formas e camadas (ex: "lblEndereco", "grpComercial") e referencie pelo nome, não por índice. Valide existência dos objetos antes de escrever. Se o designer alterar o arquivo, só atualize os nomes — o código continua estável.

O relatório pode ser exportado em PDF automaticamente?

Sim. Após preencher o documento, use `ActiveDocument.PublishToPDF` com caminho e opções definidas no código. Pode gerar um PDF único consolidado ou um por atendimento. Inclua numeração de páginas e metadados no nome do arquivo.

Como agendar a geração do relatório sem intervenção manual?

Compile a macro em um complemento (.gms) ou use o Agendador de Tarefas do Windows chamando um script VBS/PS que abre o CorelDRAW, roda a macro e fecha. Garanta que a licença permite execução desatendida e trate erros com log.