terça-feira, 9 de setembro de 2025

🔔 Automação em Excel VBA: Detector Automático de Silos de Informação

 🧐 O Problema

Nas empresas, acontece muito isso:

  • Várias áreas mantêm planilhas próprias (Financeiro, Compras, RH).

  • Cada uma tem colunas com informações parecidas (ex.: “CPF”, “CNPJ”, “Código do Cliente”).

  • Mas ninguém sabe que dados iguais estão duplicados em planilhas diferentes.

Resultado:

  • ❌ Duplicidade de registros.

  • ❌ Informações desencontradas.

  • ❌ Retrabalho e inconsistência nos relatórios.


💡 A Solução

Um Detector Automático de Silos em VBA:

  • Varre todas as planilhas do arquivo.

  • Procura colunas com cabeçalhos iguais ou semelhantes (ex.: “CNPJ” e “CNPJ Cliente”).

  • Compara os valores e identifica dados duplicados em diferentes abas.

  • Gera um relatório consolidado mostrando onde estão os mesmos clientes/fornecedores espalhados.

É como dar ao Excel uma visão global dos cadastros escondidos. 🔍


🚀 Como Funciona

  1. O usuário executa a macro "DetectarSilos".

  2. O VBA percorre todas as planilhas e monta um índice de campos-chave (ex.: CPF, CNPJ, Código, Email).

  3. Compara os dados entre as planilhas.

  4. Gera uma aba chamada "RelatorioSilos" listando:

    • Nome da planilha.

    • Coluna encontrada.

    • Valor repetido.

    • Onde mais ele aparece.


🧑‍💻 Código VBA (conceito simplificado)

Sub DetectarSilos() Dim ws As Worksheet, wsRel As Worksheet Dim ultimaCol As Long, ultimaLin As Long Dim dict As Object, chave As String Dim i As Long, j As Long, linhaRel As Long Set dict = CreateObject("Scripting.Dictionary") ' Criar/limpar relatório On Error Resume Next Set wsRel = ThisWorkbook.Sheets("RelatorioSilos") If wsRel Is Nothing Then Set wsRel = ThisWorkbook.Sheets.Add wsRel.Name = "RelatorioSilos" End If On Error GoTo 0 wsRel.Cells.Clear wsRel.Range("A1:D1").Value = Array("Planilha", "Coluna", "Valor", "Localização") linhaRel = 2 ' Varre todas as planilhas For Each ws In ThisWorkbook.Sheets If ws.Name <> wsRel.Name Then ultimaCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ultimaLin = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row For j = 1 To ultimaCol chave = UCase(Trim(ws.Cells(1, j).Value)) ' Só considera cabeçalhos relevantes If chave Like "*CPF*" Or chave Like "*CNPJ*" Or chave Like "*EMAIL*" Or chave Like "*COD*" Then For i = 2 To ultimaLin If ws.Cells(i, j).Value <> "" Then If dict.exists(ws.Cells(i, j).Value) Then wsRel.Cells(linhaRel, 1).Value = ws.Name wsRel.Cells(linhaRel, 2).Value = chave wsRel.Cells(linhaRel, 3).Value = ws.Cells(i, j).Value wsRel.Cells(linhaRel, 4).Value = dict(ws.Cells(i, j).Value) linhaRel = linhaRel + 1 Else dict(ws.Cells(i, j).Value) = ws.Name & "!" & ws.Cells(1, j).Address End If End If Next i End If Next j End If Next ws MsgBox "Relatório de silos gerado com sucesso!", vbInformation End Sub

📊 Onde é útil no dia a dia?

✅ Descobrir clientes duplicados cadastrados em várias planilhas.
✅ Detectar fornecedores repetidos em compras e financeiro.
✅ Identificar funcionários cadastrados em RH e benefícios.
✅ Evitar retrabalho e inconsistências em relatórios.


🎯 Por que é útil ?

Quase ninguém pensa em usar o Excel para mapear informações duplicadas entre abas diferentes.
Essa automação cria uma visão que geralmente só bancos de dados avançados conseguem — mas aqui, direto no Excel, com VBA.

😅 Um homem prevenido vale por dois (literalmente!) 😅

 Você já deve ter ouvido aquele ditado famoso: “Um homem prevenido vale por dois”.

Pois bem, a charada de hoje leva esse ditado ao pé da letra…

👉 Havia uma placa em uma ponte que dizia:
"Esta ponte só aguenta um homem por vez."

Um homem chegou, leu a placa e atravessou.
Mas… adivinha? A ponte caiu!

Por quê?
Porque ele era um homem prevenido!
E como o ditado diz, um homem prevenido vale por dois.
Ou seja… a ponte achou que eram dois homens passando ao mesmo tempo. 😂


Moral da história:

Às vezes, levar os ditados ao pé da letra pode ser desastroso… ou no mínimo, bem engraçado!

🔑 Mas fica a lição: estar prevenido é sempre bom, seja na vida pessoal, nos negócios, nas finanças ou até mesmo quando você atravessa uma ponte suspeita.


👉 E você? Já levou algum ditado ao pé da letra e acabou em uma situação engraçada? Conta aí nos comentários!

📘✨ Excel VBA na Prática: Usando as Propriedades Row e Rows do Objeto Range

 Quando trabalhamos com automação no Excel, muitas vezes precisamos manipular linhas específicas de uma planilha. Para isso, o objeto Range nos oferece as propriedades Row e Rows que tornam esse processo muito mais simples e poderoso. 🚀


🔎 Definição

  • Range.Row → Retorna o número da primeira linha do intervalo.

  • Range.Rows → Retorna uma coleção de linhas dentro do intervalo, permitindo manipular várias linhas ao mesmo tempo.


🧑‍💻 Exemplos práticos

1️⃣ Descobrir em qual linha está uma célula

Sub ExemploRow() Dim Linha As Long Linha = Range("C8").Row MsgBox "A célula C8 está na linha: " & Linha End Sub

👉 Resultado: Mostra 8, pois a célula está na linha 8.


2️⃣ Contar quantas linhas tem um intervalo

Sub ExemploRows() Dim TotalLinhas As Long TotalLinhas = Range("B2:B20").Rows.Count MsgBox "O intervalo possui " & TotalLinhas & " linhas." End Sub

👉 Resultado: Exibe 19, pois de B2 até B20 existem 19 linhas.


3️⃣ Destacar todas as linhas de um intervalo

Sub PintarLinhas() Range("B2:D6").Rows.Interior.Color = vbGreen End Sub

👉 Resultado: As linhas 2 até 6 ficam destacadas em verde.


💡 Dica útil na automação:
Você pode usar Row e Rows para percorrer dinamicamente linhas em relatórios, processar grandes volumes de dados (ex.: validações linha a linha) ou até criar rotinas de limpeza de dados automáticas.


🟣📢 Sua Contabilidade Descomplicada
🏢 Abertura de empresas no Simples Nacional
🔎 Controle tributário mensal
💡 Planejamento tributário estratégico

👉 Deixe a burocracia comigo e cuide do que realmente importa: o seu negócio!

segunda-feira, 8 de setembro de 2025

🛰️ Automação em VBA: Mapa Inteligente de Dependências com Caminho Completo

🧐 O Problema

Quem nunca passou por isso?
Você tem várias planilhas interligadas na empresa:

  • 📂 Relatório de Vendas depende do arquivo de Estoque.

  • 📂 Planilha de Custos puxa dados do Financeiro na rede.

  • 📂 Dashboards consomem múltiplos arquivos espalhados em pastas.

E o pior: ninguém sabe exatamente de onde vêm os dados.
➡️ Um arquivo movido ou renomeado pode quebrar tudo sem aviso. 😬


💡 A Solução

Com VBA, criamos um Mapa Inteligente de Dependências, que:

✅ Percorre todas as planilhas e fórmulas.
✅ Detecta referências internas (dentro do próprio arquivo).
✅ Detecta referências externas (outros arquivos da rede).
✅ Identifica o caminho completo do arquivo externo mesmo que esteja na rede.
✅ Gera uma aba automática chamada "MapaDependencias" com todas as informações organizadas.

É como ter um raio-X das conexões do Excel 🛰️


🧑‍💻 O Código VBA

Sub MapearDependencias() Dim ws As Worksheet, cel As Range Dim wsMapa As Worksheet, linha As Long Dim formulaTxt As String, origem As String Dim links As Variant, i As Long ' Criar/limpar aba de dependências On Error Resume Next Set wsMapa = ThisWorkbook.Sheets("MapaDependencias") If wsMapa Is Nothing Then Set wsMapa = ThisWorkbook.Sheets.Add wsMapa.Name = "MapaDependencias" End If On Error GoTo 0 wsMapa.Cells.Clear wsMapa.Range("A1:E1").Value = Array("Planilha", "Célula", "Fórmula", "Tipo", "Origem Detalhada") linha = 2 ' Obter lista de vínculos externos On Error Resume Next links = ThisWorkbook.LinkSources(xlExcelLinks) On Error GoTo 0 ' Percorrer todas as planilhas For Each ws In ThisWorkbook.Sheets If ws.Name <> wsMapa.Name Then For Each cel In ws.UsedRange If cel.HasFormula Then formulaTxt = cel.Formula wsMapa.Cells(linha, 1).Value = ws.Name wsMapa.Cells(linha, 2).Value = cel.Address wsMapa.Cells(linha, 3).Value = formulaTxt ' Dependência externa ou interna If InStr(formulaTxt, "[") > 0 Then wsMapa.Cells(linha, 4).Value = "Arquivo Externo" ' Caso 1: já tem caminho completo If InStr(formulaTxt, "\\") > 0 Or InStr(formulaTxt, ":") > 0 Then origem = Mid(formulaTxt, InStr(formulaTxt, "'")) ' Caso 2: só nome do arquivo (arquivo aberto) Else origem = Mid(formulaTxt, InStr(formulaTxt, "[")) ' tentar localizar no LinkSources If Not IsEmpty(links) Then For i = LBound(links) To UBound(links) If InStr(links(i), Replace(Split(origem, "]")(0), "[", "")) > 0 Then origem = links(i) & "\" & origem Exit For End If Next i End If End If wsMapa.Cells(linha, 5).Value = origem Else wsMapa.Cells(linha, 4).Value = "Interno" If InStr(formulaTxt, "!") > 0 Then origem = Split(formulaTxt, "!")(0) wsMapa.Cells(linha, 5).Value = origem Else wsMapa.Cells(linha, 5).Value = "(Sem referência externa ou interna clara)" End If End If linha = linha + 1 End If Next cel End If Next ws MsgBox "Mapeamento concluído! Verifique a aba 'MapaDependencias'.", vbInformation End Sub

📊 Resultado

A aba "MapaDependencias" mostra:

  1. Planilha → onde está a fórmula.

  2. Célula → localização exata.

  3. Fórmula → conteúdo.

  4. Tipo → Interno ou Arquivo Externo.

  5. Origem Detalhada → caminho completo da rede (quando externo) ou aba de origem (quando interno).

Exemplo de saída:

PlanilhaCélulaFórmulaTipoOrigem Detalhada
RelatórioB2='\Servidor\Financeiro[Custos.xlsx]Plan1'!C5Arquivo Externo\Servidor\Financeiro[Custos.xlsx]Plan1'!C5
EstoqueD10=Vendas!B10InternoVendas

🚀 Onde isso é útil no dia a dia?

  • 🔍 Auditoria de planilhas complexas

  • 🛠️ Manutenção de dashboards corporativos

  • 🧾 Controle de arquivos na rede

  • ⚠️ Identificação de riscos ocultos (links quebrados)


🎯 Por que é útil ?

A maioria dos usuários não tem a menor noção de onde os dados estão vindo.
Esse código transforma o Excel em um detector automático de vínculos ocultos, mostrando caminhos completos de rede e evitando dores de cabeça.

🔮 Automação em VBA: Radar de Dados Suspeitos em Planilhas Empresariais

 🧐 O Problema

No dia a dia, planilhas empresariais recebem dados de várias fontes:

  • Funcionários digitando manualmente 🖊️

  • Importações de sistemas externos 🔄

  • Colagens de relatórios 📥

Isso abre brechas para erros ou fraudes, como:

  • Valores absurdamente altos ou baixos (ex.: um produto de R$ 10 lançado por R$ 10.000).

  • CNPJs/CPFs inválidos.

  • Datas inconsistentes (ex.: vencimento anterior à emissão).

  • Textos duplicados que não deveriam existir.

Muitas vezes só se percebe o problema depois do estrago. 😬


💡 A Solução Inovadora

Um radar inteligente de dados suspeitos, rodando em VBA:

  • Analisa os valores digitados em tempo real.

  • Aplica regras automáticas de detecção (intervalos válidos, formatos corretos, duplicidades, lógica de datas).

  • Destaca imediatamente a célula problemática.

  • Gera um relatório de inconsistências em aba separada para auditoria.


🚀 Funcionamento

  1. O usuário digita ou importa dados na planilha.

  2. O VBA verifica instantaneamente:

    • Se o valor está dentro do esperado.

    • Se não há duplicidade crítica.

    • Se o formato está correto.

  3. Caso encontre algo suspeito:

    • Destaca a célula em vermelho.

    • Registra no log de inconsistências.

    • (Opcional) envia alerta ao responsável.


🧑‍💻 Código VBA (exemplo simplificado)

Private Sub Worksheet_Change(ByVal Target As Range) Dim cel As Range, wsLog As Worksheet Set wsLog = ThisWorkbook.Sheets("LOG_ERROS") Application.EnableEvents = False For Each cel In Target If IsNumeric(cel.Value) Then ' Exemplo: valores entre 1 e 1000 são válidos If cel.Value < 1 Or cel.Value > 1000 Then cel.Interior.Color = vbRed wsLog.Cells(wsLog.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = _ "Valor suspeito em " & cel.Address & ": " & cel.Value & " - " & Now End If ElseIf IsDate(cel.Value) Then ' Exemplo: data de vencimento não pode ser menor que emissão (coluna B vs C) If cel.Column = 3 Then If cel.Value < Cells(cel.Row, 2).Value Then cel.Interior.Color = vbYellow wsLog.Cells(wsLog.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = _ "Data inconsistente em " & cel.Address & ": " & cel.Value & " - " & Now End If End If End If Next cel Application.EnableEvents = True End Sub

📊 Onde usar no dia a dia empresarial?

✅ Controle de lançamentos financeiros (evita erros em valores)
✅ Conferência de notas fiscais (datas e CNPJs válidos)
✅ Monitoramento de pedidos de compra (quantidades suspeitas)
✅ Auditoria de dados de cadastro (duplicidades e formatos inválidos)


🔍 Por que é útil?

Muita gente usa validação simples do Excel, mas esse “radar” é ativo e inteligente:

  • Não só bloqueia, mas investiga.

  • Cria um log de inconsistências para análise posterior.

  • Funciona como um sistema antifraude e anti-erros direto no Excel.

É como colocar um fiscal automático dentro da sua planilha. 🕵️‍♂️

⚡ Automação em VBA: Previsor Automático de Atrasos em Tarefas e Pagamentos

🧐 O Problema

Empresas usam planilhas para:

  • controlar prazos de tarefas 🗂️

  • acompanhar datas de pagamentos 💰

  • monitorar entregas de fornecedores 📦

O problema é que muitas vezes os prazos estouram sem que ninguém perceba.
Resultado: multas, juros, perda de credibilidade. 😬


💡 A Solução Inovadora

Um robô previsor de atrasos dentro do Excel com VBA:

  • Analisa automaticamente as datas de vencimento.

  • Considera dias úteis (ignorando sábados/domingos/feriados).

  • Classifica as pendências em verde (no prazo), amarelo (prazo próximo), vermelho (atrasado).

  • Se detectar risco de atraso → dispara alerta automático no Outlook.

  • Pode até gerar uma agenda semanal em PDF com os prazos críticos.


🚀 Funcionamento

  1. Você tem uma planilha com colunas:

    • Tarefa/Fornecedor

    • Data de Vencimento

    • Status

  2. O VBA roda ao abrir a planilha (ou em tempo real).

  3. Ele compara a data atual vs. data de vencimento.

  4. Atualiza automaticamente:

    • 🔵 Prazo longo (> 7 dias)

    • 🟡 Prazo curto (≤ 7 dias)

    • 🔴 Vencido (já passou)

  5. Registra tudo em um dashboard de acompanhamento.


🧑‍💻 Código VBA (versão simplificada)

Private Sub Workbook_Open() Dim ws As Worksheet Dim ultimaLinha As Long, i As Long Dim dataVenc As Date Set ws = ThisWorkbook.Sheets("Controle") ultimaLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For i = 2 To ultimaLinha dataVenc = ws.Cells(i, 2).Value If dataVenc < Date Then ws.Cells(i, 3).Value = "🔴 Atrasado" ws.Cells(i, 2).Interior.Color = vbRed ElseIf dataVenc - Date <= 7 Then ws.Cells(i, 3).Value = "🟡 Prazo próximo" ws.Cells(i, 2).Interior.Color = vbYellow Else ws.Cells(i, 3).Value = "🟢 No prazo" ws.Cells(i, 2).Interior.Color = vbGreen End If Next i End Sub

📊 Onde usar no dia a dia empresarial?

✅ Controle de contas a pagar/receber
✅ Gestão de tarefas de projetos
✅ Acompanhamento de contratos e renovações
✅ Monitoramento de fornecedores com SLA


🔍 Por que é útil ?

Muita gente usa formatação condicional manual no Excel.
Mas aqui, o VBA cria um sistema vivo que não só colore células, mas também:

  • Atualiza status automaticamente

  • Gera alertas preventivos

  • Integra com Outlook e PDF

É transformar o Excel em um gestor proativo de prazos — algo que vai além do simples “calendário”.


🔥 Automação em VBA: Detector de Alterações Críticas em Planilhas com Alerta Instantâneo

 🧐 O Problema

No ambiente empresarial, várias pessoas podem mexer numa planilha (mesmo em rede interna ou compartilhada).
Às vezes, alguém:

  • apaga fórmulas sem querer ❌

  • altera valores importantes sem registrar 🔍

  • muda um parâmetro crítico sem avisar ⚠️

Resultado: relatórios errados, decisões comprometidas e horas de retrabalho.


💡 A Solução Inovadora

Um detector automático de alterações críticas:

  • O VBA monitora áreas sensíveis da planilha (como colunas de preços, impostos, fórmulas financeiras).

  • Quando alguém muda algo:

    • o sistema grava o antes e depois da célula, com data/hora e usuário do Windows;

    • dispara um alerta instantâneo por e-mail no Outlook (ou até mensagem popup no Excel).


🚀 Funcionamento

  1. O usuário altera um valor em área crítica (ex.: preço unitário).

  2. O VBA intercepta a alteração.

  3. Automaticamente registra:

    • Célula alterada

    • Valor antigo

    • Novo valor

    • Data e hora

    • Usuário do Windows

  4. Envia alerta para o responsável (ex.: gerente ou dono da planilha).


🧑‍💻 Código VBA (exemplo simplificado)

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim cel As Range Dim usuario As String Dim mensagem As String usuario = Environ("Username") ' Definir área crítica (exemplo: coluna C em "Vendas") If Sh.Name = "Vendas" Then If Not Intersect(Target, Sh.Range("C:C")) Is Nothing Then For Each cel In Target mensagem = "🚨 Alteração Detectada!" & vbCrLf & _ "Usuário: " & usuario & vbCrLf & _ "Planilha: " & Sh.Name & vbCrLf & _ "Célula: " & cel.Address & vbCrLf & _ "Novo valor: " & cel.Value & vbCrLf & _ "Data/Hora: " & Now ' Registrar em aba de log With ThisWorkbook.Sheets("LOG") .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = mensagem End With ' (Opcional) disparar alerta por e-mail no Outlook 'Call EnviarEmail(mensagem) MsgBox mensagem, vbCritical, "Alerta de Alteração" Next cel End If End If End Sub

📊 Onde usar no dia a dia empresarial?

✅ Controle de planilhas financeiras (cálculos de impostos, margem de lucro)
✅ Monitoramento de parâmetros de contratos
✅ Auditoria de estoque e preços
✅ Registro automático de quem alterou dados sensíveis


🔍 Por que é útil ?

Normalmente as pessoas usam proteção de planilha (que é limitada).
Aqui, estamos criando uma auditoria automática com log e alerta instantâneo — algo que deixa o Excel muito mais seguro e profissional, quase como um sistema corporativo.