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:
- UnidadesManutencao — cadastro de torres, blocos, subsolos e áreas comuns. Colunas:
ID_Unidade,Nome,Tipo(Torres/Subsolo/AreaComum),Responsavel,EmailResponsavel,Observacoes. - ItensPlano — catálogo de ativos e tarefas. Colunas:
ID_Item,ID_Unidade(chave estrangeira),Equipamento,Tarefa,PeriodicidadeDias,DuracaoEstimadaMin,ChecklistTexto,Criticidade(Alta/Média/Baixa). - CalendarioExcecoes — feriados e recessos. Colunas:
Data,Descricao,Tipo(FeriadoMunicipal/FeriadoEstadual/RecessoCondominial). - Cronograma — gerada automaticamente, não edite manualmente. Colunas:
ID_Agendamento,ID_Item,DataPrevista,DataRealizada,Status(Pendente/EmAndamento/Concluido/Atrasado),ResponsavelExecucao,ObservacoesExecucao,AnexosPath. - 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. - 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
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.