Capita a tutte le PMI italiane prima o poi: arriva un nuovo CRM, un nuovo gestionale, una migrazione fra sistemi, e il primo passaggio è esportare l’anagrafica clienti su Excel. Il file iniziale è sempre sporco: nomi e cognomi nella stessa cella, mille modi di scrivere “Mecanica Bresciana s.r.l.”, righe duplicate camuffate da spazi diversi, città scritte come MILANO / Milano / milano (MI) / Milano - Italia, partita IVA con o senza prefisso IT.
Senza una pulizia preliminare, il nuovo CRM eredita lo sporco e duplicalo di sistema in sistema. Vediamo come ripulire un’anagrafica Excel di 500-5000 righe in mezz’ora-un’ora usando solo strumenti nativi Excel (niente VBA, niente add-in), con un approccio strutturato che funziona davvero in PMI.
Il workflow in 6 step
L’ordine conta. Saltare uno step costringe a tornare indietro e rifare il lavoro:
- Backup del file originale (sempre).
- Trim degli spazi invisibili (cause #1 di “duplicati nascosti”).
- Normalizzazione case (UPPER/lower/Proper).
- Separazione colonne fuse (nome/cognome, indirizzo).
- Normalizzazione campi categoriali (città, settore, partita IVA).
- Rimozione duplicati (esatti + fuzzy).
Step 1 — Backup
Banale ma essenziale: prima di toccare il file, fai Ctrl+S e poi File → Salva con nome → cognomi-clienti-originale-2026-05-27.xlsx. La pulizia anagrafica è un’operazione distruttiva: una volta che hai cancellato 200 righe duplicate, non hai un modo banale per recuperarle se ti accorgi che 30 erano in realtà clienti diversi.
Step 2 — Trim degli spazi
Il problema invisibile #1: gli spazi Rossi & Figli SRL con spazi a inizio/fine/in mezzo. Excel li tratta come stringhe diverse da Rossi & Figli SRL. Risultato: 4 record “duplicati” che non vengono identificati come tali.
Funzione ANNULLA.SPAZI (in inglese TRIM):
=ANNULLA.SPAZI(A2)
Rimuove gli spazi iniziali, finali, e collassa gli spazi interni multipli a uno singolo. Applica a tutta la colonna, poi:
- Seleziona la colonna con i risultati ANNULLA.SPAZI.
Ctrl+Cper copiare.- Sulla colonna originale → tasto destro → Incolla speciale → Solo valori.
- Cancella la colonna helper.
Ripeti per ogni colonna testuale (ragione sociale, indirizzo, città, note).
Step 3 — Normalizzazione case
Le città MILANO / Milano / milano sono semanticamente uguali, ma Excel le confronta come distinte. Tre funzioni native:
| Funzione | Effetto | Quando usarla |
|---|---|---|
=MAIUSC(A2) | TUTTO MAIUSCOLO | Codici, P.IVA, codici fiscali |
=MINUSC(A2) | tutto minuscolo | |
=MAIUSC.INIZ(A2) | Iniziali Maiuscole | Nomi, cognomi, città |
Esempio:
- Email →
=MINUSC(A2)→mario.rossi@cliente.it - Città →
=MAIUSC.INIZ(A2)→Milano - Codice fiscale →
=MAIUSC(A2)→RSSMRA85A01H501Z
Stesso pattern del trim: applica formula, copia, incolla speciale → solo valori, cancella helper.
Attenzione su MAIUSC.INIZ: dà problemi su preposizioni e nomi composti italiani: Di Bonaventura diventa Di Bonaventura ✓, ma D'Alessio diventa D'Alessio (corretto), degli Esposti diventa Degli Esposti (semanticamente discutibile ma OK). Per nomi propri italiani il risultato è quasi sempre accettabile.
Step 4 — Separare colonne fuse
Caso classico: una colonna Nome e cognome con Mario Rossi, Lucia Bianchi, Maria Antonietta Conti. Va separata in due colonne Nome e Cognome.
Metodo 1 — Testo in colonne (delimitato)
Funziona se nomi sono separati da un singolo spazio:
- Seleziona la colonna
Nome e cognome. - Menu Dati → Testo in colonne.
- Wizard: Delimitato → Avanti.
- Spunta Spazio → Avanti.
- Fine.
Excel splitta in colonne. Limite: cognomi composti tipo de Marco o Della Valle finiscono frammentati su 3+ colonne. Funziona bene per il 70-80% dei nomi italiani, ma servono interventi manuali sul resto.
Metodo 2 — Funzioni SINISTRA + DESTRA + TROVA
Approccio più robusto quando i nomi sono lunghi:
=SINISTRA(A2,TROVA(" ",A2)-1) (estrae il NOME)
=STRINGA.ESTRAI(A2,TROVA(" ",A2)+1,255) (estrae il COGNOME)
Per nomi multi-parola tipo Maria Antonietta: questo metodo prende solo Maria come nome. Va combinato con una regola: se il nome estratto è in una lista di “nomi multipli noti” (Maria, Anna, Giuseppe, ecc.), allora estendi al successivo spazio. In pratica: per anagrafiche piccole si fa a mano, per anagrafiche grandi si usa Python in Excel (vedi sotto).
Metodo 3 — Power Query (consigliato per >500 righe)
Più robusto e ripetibile. Da Excel:
- Seleziona la colonna.
- Dati → Da tabella/intervallo → conferma.
- Power Query si apre. Sulla colonna → tasto destro → Dividi colonna → Per delimitatore → Spazio → Avanzato: dividere in 2 colonne, dalla prima occorrenza del delimitatore.
- Home → Chiudi e carica in… → tabella esistente.
Vantaggio: il workflow rimane registrato. La prossima esportazione anagrafica passa per la stessa pulizia automaticamente. Per le PMI che fanno export ricorrenti vale l’investimento di 30 minuti di apprendimento.
Metodo 4 — Python in Excel (anagrafiche complesse)
Per nomi italiani lunghi con preposizioni e cognomi composti, Python è il metodo più robusto:
import pandas as pd
df = xl("A2:A1000", headers=False)
nomi_completi = df.iloc[:, 0].astype(str)
# Lista "primi nomi noti" per supportare nomi doppi
primi_nomi_doppi = ['Maria', 'Anna', 'Maria Pia', 'Giovanni', 'Pier', 'Pietro']
def split_nome(nome_completo):
parts = nome_completo.strip().split()
if len(parts) >= 2 and parts[0] in primi_nomi_doppi:
nome = ' '.join(parts[:2])
cognome = ' '.join(parts[2:])
else:
nome = parts[0]
cognome = ' '.join(parts[1:])
return pd.Series([nome, cognome])
risultato = nomi_completi.apply(split_nome)
risultato.columns = ['nome', 'cognome']
risultato
Vedi Excel + Python è GA: 5 use case per PMI per la procedura completa di abilitazione Python in Excel.
Step 5 — Normalizzazione campi categoriali
Città e province
Il caso italiano è gestibile con una tabella di mapping in un foglio separato. Crea il foglio mapping_citta con colonne:
| Originale | Normalizzato |
|---|---|
| MILANO | Milano |
| milano (MI) | Milano |
| Milano - Italia | Milano |
| Roma RM | Roma |
| ROMA (Italia) | Roma |
Poi nel foglio principale usa CERCA.VERT:
=CERCA.VERT(B2,mapping_citta!A:B,2,FALSO)
Per le città non in mapping, ritorna #N/D — quelle vanno aggiunte manualmente al mapping. La tabella mapping cresce con il tempo e diventa un asset riutilizzabile per le future esportazioni.
Partite IVA
In Italia la P.IVA ha 11 cifre. Le anagrafiche storiche possono averla in formati incompatibili:
IT123456789011234567890112345678901 - Italia12345.6789.01(con punti decorativi)
Normalizza con:
=PULISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(B2,"IT",""),".",""),"-",""))
PULISCI rimuove caratteri non stampabili, SOSTITUISCI annidate rimuovono IT, ., -. Risultato: solo le 11 cifre numeriche.
Codice fiscale
16 caratteri alfanumerici per persona fisica, 11 cifre per persona giuridica. Verifica integrità lunghezza:
=SE(O(LUNGHEZZA(B2)=16,LUNGHEZZA(B2)=11),"OK","ERRORE")
Step 6 — Rimuovere duplicati
Duplicati esatti
Dopo gli step 1-5 i duplicati che prima erano “nascosti” diventano evidenti.
- Seleziona l’intero dataset (Ctrl+A).
- Dati → Rimuovi duplicati.
- Spunta le colonne da considerare per il match. Per anagrafica clienti tipicamente: P.IVA + Email principale.
- Conferma → Excel rimuove le righe duplicate (mantenendo la prima occorrenza).
Duplicati “fuzzy” (con piccole differenze)
Caso classico: Rossi & Figli SRL vs Rossi e Figli S.r.l. — semanticamente uguali, ma stringhe diverse. Excel base non li trova.
Tre approcci:
A — Ordinamento + ispezione manuale (anagrafiche <500 righe). Ordina per ragione sociale. I duplicati fuzzy finiscono vicini → ispezione visiva veloce.
B — Funzione CONFRONTA.STRINGHE (Excel 2024+): restituisce un punteggio di similarità 0-1. Per identificare i sospetti:
=CONFRONTA.STRINGHE(B2,B3) > 0.85
Restituisce VERO se la riga 2 e 3 sono simili al 85%+.
C — Python con rapidfuzz (anagrafiche >500 righe):
import pandas as pd
from rapidfuzz import fuzz, process
df = xl("B2:B1000", headers=False)
nomi = df.iloc[:, 0].dropna().str.upper().tolist()
duplicati = []
for i, nome in enumerate(nomi):
matches = process.extract(nome, nomi[i+1:], scorer=fuzz.token_sort_ratio, score_cutoff=85)
for match, score, _ in matches:
duplicati.append({'nome_a': nome, 'nome_b': match, 'similarita': score})
pd.DataFrame(duplicati).sort_values('similarita', ascending=False)
Vedi il tutorial Python in Excel completo per il use case “trovare duplicati fuzzy” approfondito.
Validazione finale
Prima di importare nel CRM nuovo, alcuni check essenziali:
- Conteggio righe: di partenza vs finale (es. 2.347 → 2.180 = 167 duplicati rimossi).
- Campi mai vuoti per riga: Ragione sociale, P.IVA / Codice fiscale, Email principale (almeno uno fra telefono e email).
- Validità email con regex semplice in
Convalida dati:=NON(VAL.ERRORE(TROVA("@",B2))) - P.IVA univoche con
CONTA.SE:=SE(CONTA.SE($C$2:$C$3000,C2)>1,"DUPLICATA","OK")
Quando aprire un progetto strutturato
Sotto i 500 record l’approccio Excel manuale funziona. Sopra i 2.000 record con storico fatturato pluriennale e gerarchie clienti (gruppi, filiali), conviene investire in un progetto di data quality strutturato prima della migrazione CRM:
- Dynamics 365 Sales import wizard ha funzioni di deduplication e matching avanzato, configurabili per le regole specifiche dell’azienda.
- Microsoft Dataverse + Power Query permette di mantenere il workflow di pulizia ripetibile fra import successivi.
- Master Data Management (per PMI con multi-source dati: ERP + CRM + e-commerce) — passaggio successivo, tipicamente con SQL Server + integration runtime.
Per una pulizia anagrafica strutturata pre-go-live CRM, parla con un nostro consulente: è uno scenario tipico nei nostri progetti Dynamics 365 Business Central e Dynamics 365 Sales.