Macros VBA/GMS

Macro para agendar manutenção hidráulica preventiva em planilhas de prédios com VBA

Automatize o agendamento de manutenções hidráulicas preventivas em planilhas de condomínios usando macros VBA. Reduza falhas e ganhe controle total.

O zelador do Residencial Parque das Árvores, na zona sul de São Paulo, recebeu um chamado de vazamento no hall social às 6h de um domingo. A causa: a válvula de retenção da bomba de recalque não era inspecionada há 14 meses. O condomínio tinha planilha, tinha cronograma, mas não tinha quem garantisse que a tarefa fosse executada no prazo. Esse cenário se repete em dezenas de edifícios onde a gestão preventiva depende de memória, anotações em caderno ou planilhas estáticas que ninguém atualiza.

A automação via VBA resolve essa lacuna transformando a planilha em um sistema ativo: ela calcula datas, envia alertas, cobra conclusão e gera evidências. Diferente de softwares de facilities caros e complexos, a macro roda no Excel que a equipe já conhece, sem mensalidade, sem instalação de servidor e com curva de aprendizado de minutos. O resultado é um cronograma vivo, auditável e à prova de esquecimento.

Neste artigo você vai ver como estruturar a planilha-mestra, quais rotinas VBA implementar para agendamento recorrente com exceções de feriados, como disparar notificações automáticas e como fechar o ciclo com relatórios de conformidade para prestação de contas em assembleia.

Estrutura da planilha-mestra: abas, tabelas e nomenclatura

A base de tudo é uma arquitetura de abas bem definida, cada uma com propósito único e nomes padronizados — isso evita que o código quebre quando alguém insere coluna ou renomeia planilha. Crie as seguintes abas exatamente com esses nomes:

  1. UnidadesManutencao — cadastro de torres, blocos, subsolos e áreas comuns. Colunas: ID_Unidade, Nome, Tipo (Torres/Subsolo/AreaComum), Responsavel, EmailResponsavel, Observacoes.
  2. ItensPlano — catálogo de ativos e tarefas. Colunas: ID_Item, ID_Unidade (chave estrangeira), Equipamento, Tarefa, PeriodicidadeDias, DuracaoEstimadaMin, ChecklistTexto, Criticidade (Alta/Média/Baixa).
  3. CalendarioExcecoes — feriados e recessos. Colunas: Data, Descricao, Tipo (FeriadoMunicipal/FeriadoEstadual/RecessoCondominial).
  4. Cronograma — gerada automaticamente, não edite manualmente. Colunas: ID_Agendamento, ID_Item, DataPrevista, DataRealizada, Status (Pendente/EmAndamento/Concluido/Atrasado), ResponsavelExecucao, ObservacoesExecucao, AnexosPath.
  5. ConfigAlertas — parâmetros de notificação. Linhas-chave: DiasAntecedenciaAlerta (padrão 3), DiasToleranciaAtraso (padrão 2), EmailsGestores (separados por ponto e vírgula), AssuntoPadrao, CorpoEmailTemplate.
  6. HistoricoConformidade — log imutável de execuções para auditoria. Preenchida apenas pela macro ao concluir tarefa.

Essa separação garante que o VBA encontre os dados pelo nome da aba (ThisWorkbook.Sheets("ItensPlano")) e não por índice, tornando a solução robusta contra reordenação de planilhas.

Rotina principal: geração do cronograma anual com exclusão de feriados

O coração da automação é a sub-rotina GerarCronogramaAnual. Ela percorre cada linha de ItensPlano, calcula todas as ocorrências entre DataInicial (hoje) e DataFinal (hoje + 365 dias) respeitando a PeriodicidadeDias, e para cada data candidata verifica se cai em fim de semana ou em data listada em CalendarioExcecoes. Se cair, avança para o próximo dia útil. O pseudocódigo simplificado:

Sub GerarCronogramaAnual()
    Dim wsItens As Worksheet, wsCal As Worksheet, wsCron As Worksheet
    Dim dicExcecoes As Object, r As Long, dataBase As Date, dataFim As Date
    Set wsItens = Sheets("ItensPlano"): Set wsCal = Sheets("CalendarioExcecoes")
    Set wsCron = Sheets("Cronograma"): Set dicExcecoes = CreateObject("Scripting.Dictionary")
    
    ' Carrega exceções em dicionário para busca O(1)
    For r = 2 To wsCal.Cells(wsCal.Rows.Count, 1).End(xlUp).Row
        dicExcecoes(wsCal.Cells(r, 1).Value) = 1
    Next r
    
    dataBase = Date: dataFim = DateAdd("yyyy", 1, Date)
    wsCron.Range("A2:I" & wsCron.Rows.Count).ClearContents
    
    For r = 2 To wsItens.Cells(wsItens.Rows.Count, 1).End(xlUp).Row
        Dim periodicidade As Long: periodicidade = wsItens.Cells(r, 5).Value ' coluna E
        Dim dataAtual As Date: dataAtual = wsItens.Cells(r, 6).Value ' DataInicial opcional
        If dataAtual < dataBase Then dataAtual = dataBase
        
        Do While dataAtual <= dataFim
            ' Pula fim de semana
            If Weekday(dataAtual, vbMonday) <= 5 Then
                ' Pula exceções
                If Not dicExcecoes.Exists(dataAtual) Then
                    Call InserirLinhaCronograma(wsCron, r, dataAtual)
                End If
            End If
            dataAtual = DateAdd("d", periodicidade, dataAtual)
        Loop
    Next r
    
    Call OrdenarCronogramaPorData
    MsgBox "Cronograma gerado com " & wsCron.Cells(wsCron.Rows.Count, 1).End(xlUp).Row - 1 & " agendamentos.", vbInformation
End Sub

A função auxiliar InserirLinhaCronograma grava o ID_Item, a DataPrevista calculada, Status = "Pendente" e preenche ResponsavelExecucao puxando da aba UnidadesManutencao via VLOOKUP interno no VBA. Ao final, OrdenarCronogramaPorData aplica Sort na coluna DataPrevista para que o gestor veja a semana em ordem cronológica.

Alertas automáticos: e-mail via Outlook e formatação condicional visual

Dois canais de aviso trabalham em conjunto. O primeiro é visual: na aba Cronograma, aplique formatação condicional na coluna DataPrevista com três regras — Vermelho se DataPrevista < Hoje() E Status <> "Concluido" (atrasado), Amarelo se DataPrevista <= Hoje() + DiasAntecedenciaAlerta E Status = "Pendente" (próximo), Verde se Status = "Concluido". Isso permite que qualquer um abra a planilha e entenda a situação em segundos.

O segundo canal é proativo: a rotina VerificarEnviarAlertas, disparada pelo evento Workbook_Open e também agendável via Application.OnTime para rodar todo dia às 7h. Ela varre o cronograma, agrupa pendências por responsável e dispara um e-mail consolidado via CreateObject("Outlook.Application"). O template em ConfigAlertas usa marcadores {{NomeResponsavel}}, {{QuantidadePendentes}}, {{TabelaHTML}} que a macro substitui. Exemplo de chamada:

Sub EnviarAlertaResponsavel(emailDestino As String, nomeResp As String, htmlTabela As String)
    Dim olApp As Object, olMail As Object
    Set olApp = CreateObject("Outlook.Application")
    Set olMail = olApp.CreateItem(0)
    With olMail
        .To = emailDestino
        .CC = Sheets("ConfigAlertas").Range("EmailsGestores").Value
        .Subject = Replace(Sheets("ConfigAlertas").Range("AssuntoPadrao").Value, "{{Data}}", Format(Date, "dd/mm/yyyy"))
        .HTMLBody = Replace(Sheets("ConfigAlertas").Range("CorpoEmailTemplate").Value, _
            "{{NomeResponsavel}}", nomeResp)
        .HTMLBody = Replace(.HTMLBody, "{{QuantidadePendentes}}", UBound(Split(htmlTabela, "<tr>")) - 1)
        .HTMLBody = Replace(.HTMLBody, "{{TabelaHTML}}", htmlTabela)
        .Send
    End With
End Sub

Essa abordagem evita spam: o zelador recebe um e-mail por dia com todas as tarefas dele, não um e-mail por tarefa. O síndico e a administradora entram em cópia para visibilidade gerencial.

Fechamento do ciclo: registro de execução, evidências e relatório de conformidade

A macro não serve só para avisar — ela precisa capturar a prova de que o serviço aconteceu. Crie um formulário VBA simples (UserFormExecucao) chamado pelo duplo-clique na linha do Cronograma (evento Sheet_BeforeDoubleClick). O formulário mostra: Equipamento, Tarefa, DataPrevista, campos DataRealizada (default hoje), Status (combobox Concluído/Parcial/Reagendar), Observacoes, botão Anexar Fotos (abre FileDialog e copia arquivos para pasta \Servidor\Evidencias\{ID_Agendamento}\), e botão Confirmar.

Ao confirmar, a macro: (1) atualiza a linha no Cronograma com DataRealizada, Status, ObservacoesExecucao, AnexosPath; (2) grava linha idêntica no HistoricoConformidade com TimestampGravacao = Now(); (3) se Status = "Reagendar", abre InputBox para nova data e cria novo agendamento preservando o original como “Reagendado”.

Para assembleia, a rotina GerarRelatorioConformidade(mesReferencia As Date) monta um relatório PDF com: resumo executivo (% planejado vs. executado, % no prazo, % atrasado), gráfico de Pareto dos itens mais atrasados, lista de não conformidades com fotos anexadas (via hiperlink no PDF) e assinatura digital do responsável técnico. Use ExportAsFixedFormat xlTypePDF. Já mostramos como automação VBA cria páginas otimizadas em escala para o Google e o mesmo princípio de exportação padronizada se aplica aqui.

Integração com a rotina de emergência: quando o preventivo falha

Mesmo com o melhor cronograma, emergências acontecem. A planilha prevê um botão “Registrar Emergência” que abre formulário simplificado: Local, TipoEmergencia (Vazamento/Entupimento/FaltaAgua/Outro), Severidade, AcionadoEm, EquipeAcionada. Ao salvar, a macro verifica se existe agendamento preventivo pendente para aquele equipamento nos últimos 90 dias — se não houver, sinaliza falha de planejamento no dashboard. Esse dado alimenta a análise de causa raiz e justifica investimento em manutenção preditiva.

Nesses momentos, ter um atendimento de emergência na Grande São Paulo com tempo de resposta curto faz a diferença entre um incidente contido e um prejuízo estrutural. A planilha registra o chamado, o tempo de resposta do fornecedor e o custo, criando histórico para renegociação de contratos.

Boas práticas de governança: versão, backup e controle de acesso

Trate o arquivo .xlsm como ativo de TI crítico. Adote: (1) Versionamento semanal — macro SalvarVersao copia o arquivo para \Backup\ManutencaoHidraulica\v{YYYYMMDD}.xlsm mantendo últimas 12 versões; (2) Proteção de estrutura — ThisWorkbook.Protect Structure:=True, Password:=senhaGestao impede exclusão/renomeação de abas; (3) Controle de edição — apenas abas CalendarioExcecoes, ConfigAlertas e Cronograma (via formulário) ficam desbloqueadas; ItensPlano e UnidadesManutencao exigem senha de administrador; (4) Log de alterações sensíveis — evento Sheet_Change em abas protegidas grava Quem, Quando, OQue, ValorAntigo, ValorNovo em aba oculta LogAuditoria.

Essa governança atende a requisitos de ISO 55000 (gestão de ativos) e facilita auditorias de seguradoras e órgãos fiscalizadores. Para times que também atuam em produção gráfica, vale conferir como automação no CorelDRAW melhora fluxo de atendimento no Bom Retiro — a lógica de rastreabilidade e padronização é a mesma.

Conclusão prática

Uma macro bem desenhada transforma a planilha de manutenção hidráulica de um arquivo passivo em um sistema de gestão ativo, auditável e à prova de esquecimento. O investimento é tempo de configuração única; o retorno é conformidade contínua, redução de emergências e evidências prontas para qualquer assembleia ou auditoria. Comece pela estrutura de abas, teste o gerador de cronograma com dados reais de um bloco piloto e evolua para o condomínio completo em sprints de duas semanas.

Checklist prático

0 de 9 concluídos

Perguntas frequentes

Preciso de conhecimentos avançados em programação para usar essa macro?

Não. A macro foi desenhada para ser instalada e configurada por gestores de facilities ou síndicos com conhecimentos básicos de Excel. O código inclui comentários explicativos e um painel de configuração visual que dispensa edição direta do VBA.

A planilha funciona offline ou precisa de conexão com a nuvem?

Funciona 100% offline. Todos os agendamentos, histórico e alertas ficam armazenados no próprio arquivo .xlsm. Não há dependência de internet, servidores externos ou licenças de software adicionais além do Microsoft Excel para Windows.

Como a macro lida com feriados municipais e recessos de fim de ano?

Há uma aba dedicada "Calendário de Exceções" onde você cadastra feriados municipais, estaduais e recessos condominiais. O agendador pula automaticamente essas datas e reprograma a tarefa para o próximo dia útil disponível, mantendo a periodicidade original.

Posso integrar essa planilha com o sistema de chamados da administradora?

Sim. A macro exporta relatórios em CSV e PDF padronizados, compatíveis com a maioria dos ERPs de gestão condominial. Também é possível disparar e-mails automáticos via Outlook com o cronograma da semana para a equipe de manutenção e síndico.

E se o prédio tiver múltiplas torres ou blocos com redes hidráulicas independentes?

A estrutura suporta cadastro ilimitado de "Unidades de Manutenção" (blocos, torres, subsolos). Cada unidade possui seu próprio cronograma, checklists e responsáveis, mas o painel principal consolida a visão geral do condomínio em um único dashboard.

A macro avisa quando uma manutenção está atrasada ou não foi confirmada?

Sim. Há um sistema de alertas visuais (formatação condicional vermelha/amarela) e notificações por e-mail configuráveis. Se a tarefa não for marcada como "Concluída" até 48h após a data prevista, o responsável e o gestor recebem aviso automático de pendência.