quarta-feira, 10 de setembro de 2025

📧💸 Automação em Python: Assistente Inteligente de E-mails de Cobrança 📧💸

Resumo rápido: um script em Python que lê uma planilha com clientes, gera faturas em PDF, envia e-mails personalizados via Outlook e registra tudo num log. Ideal para reduzir tempo com cobranças e manter histórico para auditoria.


Por que isso ajuda sua empresa? 🤔

  • Evita retrabalho manual (copiar/colar e-mails).

  • Mantém linguagem padronizada e profissional.

  • Gera prova de envio (PDF + log).

  • Ajuda a acelerar recebimentos e reduzir inadimplência.


O que você precisa ter antes de rodar 🛠️

  1. Windows com Microsoft Outlook instalado (automatização usa Outlook).

  2. Python 3.8+ instalado.

  3. Bibliotecas: pandas, openpyxl, pywin32, fpdf.
    Instale com:

    pip install pandas openpyxl pywin32 fpdf
  4. Uma planilha Excel (clientes.xlsx) com estas colunas (exatas):
    Cliente | Email | Valor | Vencimento | Pago
    Exemplo:

    ClienteEmailValorVencimentoPago
    Acme Ltdacliente@acme.com1500.02025-08-10Não
    Bento SAfinanceiro@bento.br320.52025-09-01Sim

Código completo (salve como assistente_cobranca.py) 💻

# assistente_cobranca.py import os # 1 import pandas as pd # 2 import win32com.client as win32 # 3 from datetime import datetime # 4 from fpdf import FPDF # 5 import unicodedata # 6 # Configurações EXCEL_INPUT = "clientes.xlsx" # 7 LOG_FILE = "log_cobrancas.xlsx" # 8 PASTA_FATURAS = "faturas" # 9 os.makedirs(PASTA_FATURAS, exist_ok=True) # 10 def nome_arquivo_seguro(texto): # 11 nf = unicodedata.normalize('NFKD', texto).encode('ASCII', 'ignore').decode() # 12 nf = "".join(c for c in nf if c.isalnum() or c in (' ', '-', '_')).strip() # 13 nf = nf.replace(" ", "_") # 14 return nf.lower() + ".pdf" # 15 def gerar_pdf(cliente, valor, vencimento, pasta=PASTA_FATURAS): # 16 nome = nome_arquivo_seguro(f"fatura_{cliente}") # 17 caminho = os.path.join(pasta, nome) # 18 pdf = FPDF() # 19 pdf.add_page() # 20 pdf.set_font("Arial", size=12) # 21 pdf.cell(0, 10, txt=f"Fatura - {cliente}", ln=1, align="C") # 22 pdf.ln(5) # 23 pdf.cell(0, 10, txt=f"Valor: R$ {valor:,.2f}", ln=1) # 24 pdf.cell(0, 10, txt=f"Vencimento: {vencimento.strftime('%d/%m/%Y')}", ln=1)# 25 pdf.output(caminho) # 26 return caminho # 27 def enviar_emails(): # 28 df = pd.read_excel(EXCEL_INPUT, engine="openpyxl") # 29 outlook = win32.Dispatch("Outlook.Application") # 30 enviados = [] # 31 for idx, row in df.iterrows(): # 32 cliente = str(row.get("Cliente", "")).strip() # 33 email = str(row.get("Email", "")).strip() # 34 valor = float(row.get("Valor", 0)) # 35 venc = pd.to_datetime(row.get("Vencimento")) # 36 pago = str(row.get("Pago", "")).strip().lower() # 37 dias_atraso = (datetime.now() - venc.to_pydatetime()).days # 38 if not email or pago in ("sim", "s", "yes", "true"): # 39 continue # 40 if dias_atraso <= 0: # 41 continue # 42 if dias_atraso < 10: # 43 mensagem = f"Olá {cliente},\n\nSua fatura venceu em {venc:%d/%m/%Y}. Pode regularizar, por favor?\n\nObrigado!" # 44 elif dias_atraso < 30: # 45 mensagem = f"Olá {cliente},\n\nSua fatura de R$ {valor:,.2f} está em aberto há {dias_atraso} dias. Precisamos regularizar.\n\nAtt." # 46 else: # 47 mensagem = f"Atenção {cliente},\n\nSua fatura está vencida há {dias_atraso} dias. Entre em contato para evitar medidas.\n\nAt.te." # 48 fatura = gerar_pdf(cliente, valor, venc) # 49 mail = outlook.CreateItem(0) # 50 mail.To = email # 51 mail.Subject = f"Cobrança - {cliente} - R$ {valor:,.2f}" # 52 mail.Body = mensagem # 53 mail.Attachments.Add(os.path.abspath(fatura)) # 54 try: mail.Send() # 55 enviados.append({"Cliente": cliente, "Email": email, "Valor": valor, "Vencimento": venc, "DiasAtraso": dias_atraso, "Fatura": fatura, "EnviadoEm": datetime.now()}) # 56 print(f"E-mail enviado para {cliente} -> {email}") # 57 except Exception as e: print(f"Falha ao enviar para {cliente}: {e}") # 58 if enviados: # 59 df_log = pd.DataFrame(enviados) # 60 if os.path.exists(LOG_FILE): # 61 df_antigo = pd.read_excel(LOG_FILE, engine="openpyxl") # 62 df_novo = pd.concat([df_antigo, df_log], ignore_index=True) # 63 df_novo.to_excel(LOG_FILE, index=False) # 64 else: df_log.to_excel(LOG_FILE, index=False) # 65 if __name__ == "__main__": # 66 enviar_emails() # 67

Explicação linha por linha (linguagem simples) 🧾🔍

Vou explicar cada linha numerada acima. Se preferir, copie o código e acompanhe.

1 import os

  • Importa o módulo que ajuda a trabalhar com pastas e arquivos (criar pasta, juntar caminhos).

2 import pandas as pd

  • Importa o pandas, usado para ler e escrever planilhas Excel e manipular tabelas de dados.

3 import win32com.client as win32

  • Importa a biblioteca que permite controlar o Outlook no Windows (enviar e-mails automaticamente).

4 from datetime import datetime

  • Traz a classe datetime para calcular datas e horas (ex.: quantos dias de atraso).

5 from fpdf import FPDF

  • Importa o gerador de PDF simples, usado para criar a fatura em PDF.

6 import unicodedata

  • Usado para “limpar” nomes (tirar acentos) e gerar nomes de arquivos seguros.

7 EXCEL_INPUT = "clientes.xlsx"

  • Nome do arquivo Excel que o script vai ler (coloque sua planilha com este nome ou altere aqui).

8 LOG_FILE = "log_cobrancas.xlsx"

  • Nome do arquivo onde vamos guardar o registro dos e-mails enviados.

9 PASTA_FATURAS = "faturas"

  • Pasta onde os PDFs das faturas serão salvos.

10 os.makedirs(PASTA_FATURAS, exist_ok=True)

  • Cria a pasta faturas se ela não existir (não dá erro se já existir).

11 def nome_arquivo_seguro(texto):

  • Início de uma função que transforma texto (nome do cliente) em nome de arquivo seguro.

12 nf = unicodedata.normalize('NFKD', texto).encode('ASCII', 'ignore').decode()

  • Remove acentos e caracteres especiais (transforma 'José' em 'Jose').

13 nf = "".join(c for c in nf if c.isalnum() or c in (' ', '-', '_')).strip()

  • Mantém só letras, números, espaços, traço e underline — elimina outros símbolos.

14 nf = nf.replace(" ", "_")

  • Substitui espaços por underscore para formar nomes de arquivo amigáveis.

15 return nf.lower() + ".pdf"

  • Retorna o nome final em minúsculas com extensão .pdf.

16 def gerar_pdf(cliente, valor, vencimento, pasta=PASTA_FATURAS):

  • Inicia a função que cria o PDF da fatura para um cliente.

17 nome = nome_arquivo_seguro(f"fatura_{cliente}")

  • Cria um nome seguro para o PDF, usando o nome do cliente.

18 caminho = os.path.join(pasta, nome)

  • Monta o caminho completo do arquivo (pasta + nome do arquivo).

19 pdf = FPDF()

  • Cria um objeto PDF vazio para começar a escrever.

20 pdf.add_page()

  • Adiciona a primeira página ao PDF.

21 pdf.set_font("Arial", size=12)

  • Define a fonte (tipo e tamanho) para escrever no PDF.

22 pdf.cell(0, 10, txt=f"Fatura - {cliente}", ln=1, align="C")

  • Escreve o título da fatura (centralizado).

23 pdf.ln(5)

  • Pula uma linha para dar espaço.

24 pdf.cell(0, 10, txt=f"Valor: R$ {valor:,.2f}", ln=1)

  • Escreve o valor formatado com duas casas decimais.

25 pdf.cell(0, 10, txt=f"Vencimento: {vencimento.strftime('%d/%m/%Y')}", ln=1)

  • Escreve a data de vencimento no formato dia/mês/ano.

26 pdf.output(caminho)

  • Salva o arquivo PDF no disco no caminho criado.

27 return caminho

  • Retorna o caminho do PDF gerado (para anexar no e-mail).

28 def enviar_emails():

  • Início da função principal que faz a leitura da planilha, gera PDFs e envia e-mails.

29 df = pd.read_excel(EXCEL_INPUT, engine="openpyxl")

  • Lê a planilha clientes.xlsx para uma tabela (df = data frame).

30 outlook = win32.Dispatch("Outlook.Application")

  • Conecta ao Outlook para poder criar e enviar e-mails.

31 enviados = []

  • Lista vazia para registrar (na memória) os envios bem sucedidos.

32 for idx, row in df.iterrows():

  • Começa a percorrer cada linha da planilha (cada cliente).

33 cliente = str(row.get("Cliente", "")).strip()

  • Pega o nome do cliente da linha; transforma em texto e limpa espaços extras.

34 email = str(row.get("Email", "")).strip()

  • Pega o e-mail do cliente.

35 valor = float(row.get("Valor", 0))

  • Lê o valor (número) da fatura; se não tiver, usa 0.

36 venc = pd.to_datetime(row.get("Vencimento"))

  • Converte a data de vencimento para um objeto de data do pandas.

37 pago = str(row.get("Pago", "")).strip().lower()

  • Verifica na coluna "Pago" se a fatura já foi quitada (texto em minúsculo).

38 dias_atraso = (datetime.now() - venc.to_pydatetime()).days

  • Calcula quantos dias se passaram desde o vencimento (dias de atraso).

39 if not email or pago in ("sim", "s", "yes", "true"):

  • Se não tiver e-mail ou se a fatura estiver marcada como paga, pula este cliente.

40 continue

  • Pula para o próximo cliente na planilha.

41 if dias_atraso <= 0:

  • Se não há atraso (vencimento futuro ou hoje), pula também.

42 continue

  • Pula para o próximo registro.

43 if dias_atraso < 10:

  • Se o atraso for menor que 10 dias — mensagem mais suave.

44 mensagem = f"... (texto educado) ..."

  • Define o texto do e-mail para esse caso (você verá no código real).

45 elif dias_atraso < 30:

  • Se atraso entre 10 e 29 dias — mensagem mais direta.

46 mensagem = f"... (texto intermediário) ..."

  • Texto correspondente ao caso.

47 else:

  • Se 30 dias ou mais — mensagem mais firme.

48 mensagem = f"... (texto firme) ..."

  • Texto final para atraso crítico.

49 fatura = gerar_pdf(cliente, valor, venc)

  • Chama a função para criar o PDF da fatura e guarda o caminho do arquivo.

50 mail = outlook.CreateItem(0)

  • Cria uma nova mensagem de e-mail no Outlook.

51 mail.To = email

  • Define o destinatário.

52 mail.Subject = f"Cobrança - {cliente} - R$ {valor:,.2f}"

  • Define o assunto do e-mail (útil para organização).

53 mail.Body = mensagem

  • Coloca o texto no corpo do e-mail.

54 mail.Attachments.Add(os.path.abspath(fatura))

  • Anexa o PDF que acabamos de gerar.

55 mail.Send()

  • Envia o e-mail (pode abrir aviso de segurança no Outlook em alguns PCs).

56 enviados.append({...})

  • Se deu certo, guardamos dados sobre esse envio (cliente, data, arquivo).

57 print(f"E-mail enviado para {cliente} -> {email}")

  • Imprime no terminal que o e-mail foi enviado (útil para acompanhar execução).

58 except Exception as e: / print(f"Falha...")

  • Se der erro no envio, registra na tela qual foi o problema (não para todo o script).

59 if enviados:

  • Depois de terminar a varredura, se houver envios bem sucedidos, vamos gravar no log.

60 df_log = pd.DataFrame(enviados)

  • Converte a lista de envios em uma tabela (para salvar no Excel).

61 if os.path.exists(LOG_FILE):

  • Se o arquivo de log já existe, vamos anexar ao que já tem.

62 df_antigo = pd.read_excel(LOG_FILE, engine="openpyxl")

  • Lê o log antigo.

63 df_novo = pd.concat([df_antigo, df_log], ignore_index=True)

  • Junta o antigo com os novos registros.

64 df_novo.to_excel(LOG_FILE, index=False)

  • Salva tudo de volta no arquivo de log (completo).

65 else: df_log.to_excel(LOG_FILE, index=False)

  • Se não havia log, cria um novo com os envios.

66 if __name__ == "__main__":

  • Padrão Python: se você rodar este arquivo diretamente, executa o que vem a seguir.

67 enviar_emails()

  • Chama a função principal para começar o processo.


Como usar — passo a passo simples ✅

  1. Coloque assistente_cobranca.py e clientes.xlsx na mesma pasta.

  2. Abra o terminal (Prompt) nessa pasta.

  3. Instale dependências: pip install pandas openpyxl pywin32 fpdf

  4. Rode: python assistente_cobranca.py

  5. Observe no terminal as mensagens de sucesso/erro. Verifique a pasta faturas/ e o arquivo log_cobrancas.xlsx.


Dicas importantes e boas práticas ⚠️

  • Teste primeiro com 1 ou 2 e-mails (coloque seu próprio e-mail) antes de rodar em toda base.

  • Outlook pode mostrar um alerta de segurança; algumas empresas bloqueiam automações — consulte o time de TI.

  • Não use para spam: envie apenas cobranças válidas e respeite regras de comunicação.

  • Mantenha backup da planilha original antes de rodar.


Variações e melhorias que você pode pedir depois 🔧

  • Enviar em lotes (por ex. 50 por vez).

  • Integração com SMTP (para quem não usa Outlook).

  • HTML no corpo do e-mail (assinatura com logo).

  • Interface simples em Tkinter para selecionar arquivo e rodar com 1 botão.

  • Agendamento diário (via Agendador de Tarefas do Windows).


Precisa de suporte contábil? 📞 

Sou contador e ajudo profissionais e empresas com:

  • Abertura e registro de empresas no Simples Nacional;

  • Acompanhamento mensal da contabilidade;

  • Tributação e planejamento tributário.

🔢 Post 2 – Sua primeira calculadora em Python! 🧮✨

 Você já aprendeu a mostrar mensagens na tela e até pedir o nome do usuário (Post 1). Agora vamos dar um passo a mais: criar uma calculadora simples que soma dois números.

Sim, já vamos para um projeto útil de verdade 😃.


🐣 Passo a passo do código

# Primeiro pedimos o primeiro número num1 = input("Digite o primeiro número: ") # input() mostra a pergunta e espera o usuário digitar algo no teclado. # O que for digitado será guardado dentro da variável num1. # Importante: por padrão, o input() sempre guarda como texto (string). # Depois pedimos o segundo número num2 = input("Digite o segundo número: ") # Aqui acontece a mesma coisa, o valor digitado vai para a variável num2. # Precisamos converter os valores para números inteiros num1 = int(num1) # int() transforma o valor que estava em formato de texto para número inteiro. num2 = int(num2) # Agora fazemos a soma resultado = num1 + num2 # O símbolo + faz a operação de adição entre os dois números. # Por fim mostramos o resultado na tela print("A soma é:", resultado) # print() exibe a frase "A soma é:" seguida do valor guardado na variável resultado.

💻 Exemplo de saída

Digite o primeiro número: 5 Digite o segundo número: 7 A soma é: 12

📌 O que você aprendeu hoje?

  • input() sempre guarda valores como texto (string).

  • Usamos int() para transformar texto em número inteiro.

  • Guardamos valores em variáveis (num1, num2, resultado).

  • Fizemos uma operação matemática real com Python! 🎉


🎯 Desafio extra

Tente modificar o código para fazer subtração (-), multiplicação (*) e divisão (/).
👉 Dica: basta trocar o sinal + pelo operador desejado.


⏭️ O que vem por aí?

No próximo post, vamos transformar essa calculadora em algo ainda mais poderoso: uma Calculadora de Quatro Operações, onde o usuário escolhe se quer somar, subtrair, multiplicar ou dividir! 🔥


💬 E aí, conseguiu somar seus primeiros números em Python?

🛰️ Automação em VBA: Scanner de Disponibilidade de Arquivos em Rede

 🧐 O Problema

Em ambientes empresariais:

  • Existem planilhas críticas salvas em pastas de rede.

  • Muitas vezes alguém tenta abrir e… ❌ “Arquivo não encontrado” ou “Rede indisponível”.

  • Não existe uma forma rápida de o próprio Excel testar se os arquivos estão acessíveis antes de usá-los em macros ou relatórios.


💡 A Solução

Criar uma automação em VBA que funciona como um scanner de arquivos de rede:

  • Lê uma lista de caminhos de arquivos (armazenada em uma aba chamada "MapeamentoRede").

  • Testa se cada arquivo realmente existe na rede.

  • Retorna em uma aba "StatusRede" com:

    • 📂 Caminho do arquivo

    • ✅ Disponível ou ❌ Não encontrado

    • ⏱️ Data/hora do último teste

Isso transforma o Excel em um validador de links de rede corporativa.


🚀 Como Funciona

  1. Na aba "MapeamentoRede", o usuário lista os arquivos da rede que deseja monitorar.
    Exemplo:

    Caminho do Arquivo
    \Servidor01\Financeiro\Vendas.xlsx
    \Servidor02\RH\Folha.xlsx
    \Servidor03\TI\Inventário.xlsx
  2. Executa a macro.

  3. Na aba "StatusRede", o VBA preenche automaticamente o resultado da checagem.


🧑‍💻 Código VBA

Sub ScannerArquivosRede() Dim wsMap As Worksheet, wsStatus As Worksheet Dim ultimaLinha As Long, i As Long Dim caminho As String, existe As Boolean ' Define as planilhas Set wsMap = ThisWorkbook.Sheets("MapeamentoRede") ' Cria/limpa a aba de status On Error Resume Next Set wsStatus = ThisWorkbook.Sheets("StatusRede") If wsStatus Is Nothing Then Set wsStatus = Sheets.Add wsStatus.Name = "StatusRede" End If wsStatus.Cells.Clear On Error GoTo 0 ' Cabeçalho wsStatus.Range("A1:C1").Value = Array("Caminho do Arquivo", "Status", "Última Verificação") ' Última linha na aba de mapeamento ultimaLinha = wsMap.Cells(wsMap.Rows.Count, 1).End(xlUp).Row ' Varre cada caminho listado For i = 2 To ultimaLinha caminho = wsMap.Cells(i, 1).Value If Dir(caminho) <> "" Then wsStatus.Cells(i, 1).Value = caminho wsStatus.Cells(i, 2).Value = "✅ Disponível" Else wsStatus.Cells(i, 1).Value = caminho wsStatus.Cells(i, 2).Value = "❌ Não encontrado" End If wsStatus.Cells(i, 3).Value = Now Next i MsgBox "🔎 Verificação concluída! Veja a aba 'StatusRede'.", vbInformation End Sub

📊 Exemplo de saída (StatusRede)

Caminho do ArquivoStatusÚltima Verificação
\Servidor01\Financeiro\Vendas.xlsx✅ Disponível06/09/2025 10:30:15
\Servidor02\RH\Folha.xlsx❌ Não encontrado06/09/2025 10:30:15
\Servidor03\TI\Inventário.xlsx✅ Disponível06/09/2025 10:30:15

🎯 Onde é útil?

✅ Controle de links críticos de relatórios.
✅ Auditoria de acessibilidade em pasta de rede compartilhada.
✅ Evitar erros em macros que dependem de arquivos externos.
✅ Monitoramento de servidores corporativos.


🔥 Por que é útil ?

Pouca gente pensa em usar Excel VBA como um monitor de acessibilidade de arquivos em rede.
Normalmente isso é feito com scripts de TI (PowerShell, Python).
Aqui, qualquer usuário corporativo pode rodar direto do Excel.

📘✨ Excel VBA na Prática: Usando o Método Areas do Objeto Range

Quando trabalhamos no Excel, muitas vezes precisamos lidar com intervalos múltiplos (não contíguos), como quando selecionamos várias células separadas segurando a tecla CTRL.

No VBA, o objeto Range possui o método Areas, que facilita a manipulação desses conjuntos de intervalos. 🚀


🔎 Definição

  • Range.Areas → Retorna uma coleção de áreas (subintervalos) dentro de um intervalo múltiplo.

  • Cada área pode ser acessada individualmente como um objeto Range.


🧑‍💻 Exemplos práticos

1️⃣ Descobrir quantas áreas existem em uma seleção

Sub ContarAreas() Dim TotalAreas As Long TotalAreas = Selection.Areas.Count MsgBox "A seleção possui " & TotalAreas & " áreas diferentes." End Sub

👉 Se você selecionar, por exemplo, A1:A5 e C1:C5, o resultado será 2 áreas.


2️⃣ Trabalhar com cada área separadamente

Sub DestacarAreas() Dim i As Long For i = 1 To Selection.Areas.Count Selection.Areas(i).Interior.Color = vbYellow Next i End Sub

👉 Cada área da seleção será destacada em amarelo.


3️⃣ Usar cada área em cálculos

Sub SomarAreas() Dim i As Long, Soma As Double For i = 1 To Selection.Areas.Count Soma = Soma + WorksheetFunction.Sum(Selection.Areas(i)) Next i MsgBox "A soma total das áreas selecionadas é: " & Soma End Sub

👉 O VBA percorre cada área e calcula o total, somando tudo em uma única saída.


💡 Dica útil na automação:
O método Areas é ideal quando o usuário faz seleções personalizadas no Excel e você precisa percorrer cada conjunto de células para formatar, validar ou calcular valores de forma independente.


🟢📢 Consultoria Contábil Inteligente
💼 Abertura e registro de empresas no Simples Nacional
📊 Acompanhamento contábil e fiscal mensal
⚖️ Planejamento tributário estratégico para pagar só o justo

👉 Entre em contato e mantenha sua empresa organizada com segurança!

terça-feira, 9 de setembro de 2025

🐍 Post 1 – Olá Mundo em Python: a primeira linha do seu futuro! 🚀

Bem-vindo(a) à Série de 100 Projetos em Python para Iniciantes! 🎉

Se você sempre quis aprender programação, mas achava que era coisa de gente com cara de gênio 🤓, respira fundo: você está no lugar certo!

Aqui, cada post será um mini-projeto prático, divertido e direto ao ponto. Ou seja: nada de ficar só na teoria chata 📚. Você vai aprender Python construindo coisas de verdade — desde scripts simples até sistemas completos com banco de dados, automação e até inteligência artificial.

👉 Spoiler: no post 100 você vai ter feito um sistema profissional com interface, relatórios em Excel e PDF, automação de navegador e muito mais.


🐣 O primeiro passo: Olá, Mundo! 🌍

Se você nunca programou, relaxa: todo programador começou do zero, escrevendo a famosa frase mágica “Olá, Mundo!”.

É um ritual de passagem. É como acender a chama olímpica da sua carreira na programação 🔥.

Aqui vai seu primeiro código em Python:

print("Olá, Mundo!") # O comando print() serve para mostrar algo na tela. # O texto entre aspas ("Olá, Mundo!") é o que será exibido.

Saída no console:

Olá, Mundo!

🎯 O que acontece aqui?

  • print() → função que exibe algo na tela.

  • "Olá, Mundo!" → texto (também chamado de string) que você mandou o Python mostrar.


🛠️ Projeto do dia: sua primeira mensagem personalizada

Agora vamos deixar esse programa um pouquinho mais divertido: em vez de mostrar só “Olá, Mundo!”, ele vai perguntar seu nome e dar boas-vindas.

nome = input("Qual é o seu nome? ") # input() pede que o usuário digite alguma coisa. # O texto dentro de aspas ("Qual é o seu nome? ") # é a pergunta que aparece na tela. # O que você digitar será guardado na variável "nome". print("Olá,", nome, "! Bem-vindo(a) ao Python 🚀") # O print() aqui mostra o texto "Olá," seguido do valor que está dentro da variável nome. # Depois junta com a frase final "Bem-vindo(a) ao Python 🚀".

Exemplo de saída:

Qual é o seu nome? José Olá, José ! Bem-vindo(a) ao Python 🚀

✨ Missão cumprida!

Parabéns 🎉, você escreveu seu primeiro programa em Python.

📌 O que você aprendeu hoje:

  • Usar print() para mostrar informações.

  • Usar input() para perguntar algo ao usuário.

  • Guardar o que o usuário digitou dentro de uma variável (nome).


⏭️ O que vem por aí?

No próximo post vamos criar uma calculadora simples 🔢, que vai somar dois números informados por você.


👉 Não esquece de acompanhar a série “100 Projetos em Python” aqui no blog!
Se você seguir passo a passo, vai sair de iniciante absoluto até criar sistemas profissionais.


💬 Me conta nos comentários: conseguiu rodar seu primeiro código?

🧠 Automação em VBA: Detector Automático de Colunas com Unidade de Medida

 🧐 O Problema

Planilhas empresariais muitas vezes misturam valores e unidades de medida:

  • 📦 “100 kg” em vez de só 100.

  • 💰 “R$ 250,00” dentro da célula como texto.

  • ⛽ “35 litros” misturado com o número.

Isso atrapalha somas, filtros e cálculos — porque o Excel não entende que é número + unidade.
Normalmente alguém precisa limpar manualmente antes de usar os dados.


💡 A Solução

Um detector automático de unidades de medida com VBA:

  • Varre todas as células numéricas/textuais.

  • Identifica se há números misturados com texto (ex.: “kg”, “R$”, “L”, “unid”).

  • Separa automaticamente em duas colunas:

    • 🔢 Valor numérico.

    • 🏷️ Unidade de medida.

  • Gera um relatório indicando quais colunas continham misturas.

É como dar ao Excel uma inteligência para higienizar dados sujos de forma automática. 🧼


🚀 Como Funciona

  1. Usuário executa a macro "SepararUnidades".

  2. O VBA percorre cada aba, célula por célula.

  3. Se detectar texto com número + letras, quebra em 2 partes.

  4. Cria novas colunas: Valor e Unidade.


🧑‍💻 Código VBA (conceito simplificado)

Sub SepararUnidades() Dim ws As Worksheet Dim ultimaCol As Long, ultimaLin As Long Dim i As Long, j As Long Dim valor As String, num As String, unidade As String Dim regex As Object, matches As Object Set regex = CreateObject("VBScript.RegExp") regex.Pattern = "([0-9,.]+)\s*([A-Za-z%$]+)" regex.IgnoreCase = True For Each ws In ThisWorkbook.Sheets 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 For i = 2 To ultimaLin valor = Trim(ws.Cells(i, j).Value) If regex.Test(valor) Then Set matches = regex.Execute(valor) If matches.Count > 0 Then num = matches(0).SubMatches(0) unidade = matches(0).SubMatches(1) ws.Cells(i, j).Offset(0, 1).Value = num ws.Cells(i, j).Offset(0, 2).Value = unidade End If End If Next i Next j Next ws MsgBox "✅ Separação concluída! Veja colunas ao lado dos dados originais.", vbInformation End Sub

📊 Exemplo prático

OriginalValorUnidade
100 kg100kg
R$250,00250,00R$
35 litros35litros

🎯 Onde é útil?

✅ Estoques (quantidade + unidade: “100 caixas”).
✅ Financeiro (valores com “R$” dentro da célula).
✅ Produção industrial (medidas: “50m”, “120cm”).
✅ Relatórios de consumo (“20L”, “15Kg”).


🔥 Por que é útil ?

Pouca gente imagina criar no Excel um sistema automático para separar unidades de medida.
Esse tipo de tratamento geralmente é feito em softwares de ETL ou bancos de dados — aqui você tem isso direto no Excel com VBA.

🔔 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.