Vai al contenuto

Calcolo codice fiscale Excel

Microsoft_Excel_Calcolo_Codice_Fiscale
Microsoft_Excel_Calcolo_Codice_Fiscale_600px

Come effettuare il calcolo del codice fiscale? Questo procedimento può essere complesso viste le 16 cifre che lo compongono e come viene generato, ma leggendo questo articolo sarai in grado di crearlo da zero su Excel.

Puoi già calcolare il codice fiscale utilizzando il file interattivo, ti basterà inserire le informazioni richieste e potrai subito calcolarlo (attenzione ad inserire prima il giorno e poi il mese).


Cliccando il pulsante, potrai invece scaricare un file dedicato per utilizzarlo quando preferisci.

Solo un appunto prima di cominciare. In rari casi può succede che persone diverse abbiano lo stesso codice fiscale, in gergo viene chiamato omocodia ma è parte di questo articolo poichè rappresenta un caso molto particolare. Non ci sarà neanche il caso di cittadini stranieri, dato che in quel caso si inseriscono dei parametri differenziati per stato per il calcolo del codice fiscale.

Per ricavare informazioni da un codice fiscale, puoi cliccare il seguente link per accedere all'articolo relativo al calcolo del codice fiscale inverso.

Per navigare nell'articolo, puoi cliccare su questi link:

Cognome | Nome | Data di nascita | Sesso

Comune di nascita| Carattere di controllo | Conclusione

Se vuoi scoprire come creare il codice fiscale come funzione a sè stante con Excel 365, clicca qui.

Generatore codice fiscale

Il codice fiscale è composto da numerose parti che seguono regole particolari e si origina da alcuni dati per una singola persona. Per procedere ci servono, per una singola persona:

  • Cognome, che restituirà 3 caratteri
  • Nome, che restituirà altri 3 caratteri (totale 3+3 = 6)
  • Data di nascita, che restituirà ulteriori 3 caratteri (totale 3+3+3 = 9)
  • Giorno di nascita e sesso, due caratteri (totale 9+2 = 11)
  • Comune di nascita, altri 4 caratteri (totale 11+4 = 15)
  • Carattere di controllo finale, un carattere (totale 15+1 = 16)

Calcolo codice fiscale: file Excel

Saranno sufficienti due fogli. Uno sarà chiamato LISTE e ci servirà per ottenere informazioni trasformando i valori che inseriremo. L'altro sarà chiamato CALCOLO_CODICE_FISCALE e ci permetterà di calcolare il codice fiscale.

Il foglio LISTE è così composto:

  • Colonna B: lista di caratteri da A e Z
  • Colonna C: definisce se il carattere nella lista B sia una vocale o una consonante
  • Colonna E: mesi da 01 a 12
  • Colonna F: lettera corrispondente per il codice fiscale
  • Colonna G: elenco codici dei comuni Italiani
  • Colonna H: nome del comune. Queste informazioni derivano dal sito del Ministero dell'Interno
  • Colonna K, L, N, O, Q, R: sono necessarie per l'ultimo carattere di controllo e sono prese da Wikipedia al link indicato in precedenza

Il foglio CALCOLO_CODICE_FISCALE è così predisposto:

E10 è =ANNULLA.SPAZI(MAIUSC(C10))

ANNULLA.SPAZI elimina gli spazi dalla versione in maiuscolo di C10. Questo per evitare errori in fase di inserimento e restituire il valore in maiuscolo per il codice fiscale

F10 è =STRINGA.ESTRAI($E$10;RIF.COLONNA(A1);1)

STRINGA.ESTRAI prendere il valore del cognome (E10). RIF.COLONNA(A1) restituisce 1, quindi iniziamo dal primo carattere del cognome. L'1 finale ci restituisce solo il primo carattere ignorando gli altri valori. Tramite RIF.COLONNA, possiamo trascinare la formula fino a Y10 senza errori

F11 è =SE.ERRORE(INDICE(LISTE!$C$8:$C$33;CONFRONTA(F10;LISTE!$B$8:$B$33;0));"")

SE.ERRORE restituisce un valore vuoto se ci fossero errori nella funzione. INDICE + CONFRONTA permette di determinare se un singolo carattere sia una vocale o una consonante. La formula viene poi replicata fino a Y11

AA10 restituisce i tre caratteri che ci servono per il calcolo del codice fiscale

Prima di spiegarne il funzionamento, dobbiamo però fare un passo indietro e verificare come funzioni il cognome per il calcolo del codice fiscale.

1. Calcolo codice fiscale: il cognome

Le domande successive sono tutte tratte dal link di Wikipedia che spiega il funzionamento del codice fiscale. In questa fase vedremo tutte le possibili opzioni e come risolverle, almeno a livello logico.

Chiaramente, per il calcolo del codice fiscale è fondamentale conoscere il cognome della persona selezionata.

CF: cognome di due lettere composto da due vocali (AE)

Dobbiamo aggiungere una X alle due vocali. In questo caso: AE diventa AEX.

CF: cognome di due lettere composto da una vocale e una consonante (RE)

Dobbiamo inserire prima la consonante, poi la vocale e unire una X. In questo caso: RE diventa REX

CF: cognome di due lettere composto da due consonanti (HR)

Dobbiamo ricavare le due consonanti in ordine e poi aggiungere una X. In questo caso: HR diventa HRX.

CF: cognome di lunghezza variabile composto da almeno tre consonanti (ROSSI)

Caso standard. Dobbiamo ricavare le prime tre consonanti del cognome. In questo caso: ROSSI diventa RSS.

CF: cognome di lunghezza variabile composto da due consonanti e varie vocali (HAL)

Prenderemo prima le 2 consonanti e poi le uniremo con la prima vocale. In questo caso: HAL diventa HLA.

CF: cognome di lunghezza variabile composto da una consonante e varie vocali (ALI)

In questo caso, prenderemo la prima consonante e la uniremo con le vocali in ordine. In questo caso: ALI diventa LAI.

CF: cognome di lunghezza variabile composto unicamente da vocali (AEI)

In questo caso, prenderemo le prime due vocali e le uniremo con una X. In questo caso: AEI diventa AEX.


Formula per recuperare le informazioni dal cognome per il codice fiscale
Microsoft_Excel_Calcolo_Codice_Fiscale_Cognome

Spezziamo la formula in AA10 analizzando i singoli componenti:

=PIÙ.SE(

Avendo numerosi condizioni, ottimizziamo con la funzione PIÙ.SE. Ogni volta che la condizione è falsa, si passa a quella successiva.

E(LUNGHEZZA(E10)=2;CONTA.SE(F11:Y11;"V")=2);

CONCAT(F10;G10;"X");

  • E verifica che entrambe le condizioni che seguono siano vere
  • LUNGHEZZA(E10)=2 verifica che il cognome sia di due caratteri
  • CONTA.SE(F11:Y11;"V")=2 verifica che vi siano due vocali
  • Se entrambe le condizioni precedenti sono vere, CONCAT(F10:G10;"X") restituisce le due vocali in fila aggiungendo una X finale. Lo stesso risultato sarebbe raggiunto utilizzando CONCATENA che è una versione precedente della stessa funzione

E(LUNGHEZZA(E10)=2;CONTA.SE(F11:Y11;"C")=1);

CONCAT(INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1));INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");1));"X");

  • E verifica che entrambe le condizioni che seguono siano vere
  • LUNGHEZZA(E10)=2 verifica che il cognome sia di due caratteri
  • CONTA.SE(F11:Y11;"C")=1 verifica che vi sia una consonante
  • Se entrambe le condizioni precedenti sono vere, CONCAT deve restituire un valore di 3 caratteri contenente la prima consonante, poi la prima vocale e poi una X
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1)) recupera la prima consonante con una condizione specifica. Il funzionamento di INDICE + AGGREGA è spiegato nell'articolo per ordinare un elenco con duplicati su Microsoft Excel
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");1)) segue la stessa struttura precedente ma recupera la prima vocale. Al termine, si aggiunge una X

E(LUNGHEZZA(E10)=2;CONTA.SE(F11:Y11;"C")=2);

CONCAT(INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1));INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");2));"X");

  • E verifica che entrambe le condizioni che seguono siano vere
  • LUNGHEZZA(E10)=2 verifica che il cognome sia di due caratteri
  • CONTA.SE(F11:Y11;"C")=2 verifica che vi siano due consonanti
  • Se entrambe le condizioni precedenti sono vere, CONCAT deve restituire un valore di 3 caratteri contenente la prima consonante, poi la prima vocale e poi una X
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1)) recupera la prima consonante con una condizione specifica. Come sopra, per comprendere meglio la formula è possibile visionare l'articolo per ordinare un elenco con duplicati su Microsoft Excel
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");2)) recupera la seconda consonante. Al termine, si aggiunge una X

CONTA.SE(F11:Y11;"C")>=3;

CONCAT(INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1));INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");2));INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");3)));

  • CONTA.SE(F11:Y11;"C")>=3 verifica che ci siano almeno tre consonanti
  • Se la condizione precedente è vera, CONCAT deve restituire le prime tre consonanti in fila
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1)) restituisce la prima consonante
  • La funzione è equivalente anche per i valori successivi, cambia solo la condizione con 1 2 3 finale

CONTA.SE(F11:Y11;"C")=2;

CONCAT(INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1));INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");2));INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");1)));

  • CONTA.SE(F11:Y11;"C")>=2 verifica che ci siano almeno due consonanti
  • Se la condizione precedente è vera, CONCAT deve restituire le due consonanti in fila e la prima vocale
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1)) restituisce la prima consonante
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");2)) restituisce la seconda consonante
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");1)) restituisce la prima vocale

CONTA.SE(F11:Y11;"C")=1;

CONCAT(INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1));INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");1));INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");2)));

  • CONTA.SE(F11:Y11;"C")=1 verifica che ci sia esattamente una consonante
  • Se la condizione precedente è vera, CONCAT deve restituire l'unica consonante e le prime due vocali
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="C");1)) restituisce la prima consonante
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");1)) restituisce la prima vocale
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");2)) restituisce la seconda vocale

CONTA.SE(F11:Y11;"C")=0;

CONCAT(INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");1));INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");2));"X"))

  • CONTA.SE(F11:Y11;"C")=0 verifica che non ci siano consonanti
  • Se la condizione precedente è vera, CONCAT deve restituire le prime due vocali e una X
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");1)) restituisce la prima vocale
  • INDICE(F10:Y10;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F11:Y11="V");2)) restituisce la seconda vocale. Alle due vocali, si aggiunge una X finale

2. Calcolo codice fiscale: il nome

Anche in questo caso, le informazioni sono state ricavate prevalentemente da Wikipedia.

CF: nome con più di tre consonanti (Giuseppe)

Prenderemo la prima, la terza e la quarta consonante. In questo caso: Giuseppe diventa GPP.

CF: nome con tre consonanti (Marco)

Stavolta prenderemo le prime tre consonanti. In questo caso: Marco diventa MRC.

CF: nome con due consonanti (Sara)

Con due sole consonanti, recuperiamo le prime due consonanti e la prima vocale. In questo caso: Sara diventa SRA.

CF: nome con una consonante (Teo)

Stavolta ci servono le prime due consonanti e la prima vocale. In questo caso: Teo diventa TEO.

CF: nome senza consonanti (Aeo)

Prendiamo le prime due vocali e aggiungiamo una X. In questo caso: Aeo diventa AEX.

Formula per recuperare le informazioni dal nome per il codice fiscale
Microsoft_Excel_Calcolo_Codice_Fiscale_Nome

Dobbiamo spezzare la formula per renderla chiara da leggere:

=PIÙ.SE(

Come per il cognome, PIÙ.SE ci aiuta a restituire i valori con diverse condizioni.

CONTA.SE(F15:Y15;"C")>3;
CONCAT(INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="C");1));INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="C");3));INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="C");4)));

Se nel nome sono presenti più di tre consonanti, saranno restituite la prima, la terza e la quarta.

CONTA.SE(F15:Y15;"C")=3;
CONCAT(INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="C");1));INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="C");2));INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="C");3)));

Nel caso vi fossero solo tre consonanti, queste sono restituite in fila.

CONTA.SE(F15:Y15;"C")=2;
CONCAT(INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="C");1));INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="C");2));INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="V");1)));

Se il nome presenta due consonanti, vengono restituiti la prima consonante, la seconda consonante e la prima vocale in quest'ordine.

CONTA.SE(F15:Y15;"C")=1;
CONCAT(INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="C");1));INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="V");1));INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="V");2)));

Se nel nome è presente solo una consonante, la formula restituisce la consonante e le prime due vocali in ordine.

CONTA.SE(F15:Y15;"C")=0;
CONCAT(INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="V");1));INDICE(F14:Y14;AGGREGA(15;6;(RIF.COLONNA($7:$27))/(F15:Y15="V");2));"X"))

Se invece nel nome non sono presenti consonanti, prendiamo le prime due vocali in fila e aggiungiamo una X.

3. Calcolo codice Fiscale: la data di nascita

La data di nascita restituisce in totale tre caratteri. Due sono relativi all'anno di nascita, mentre uno è relativo al mese di nascita.

Microsoft_Excel_Calcolo_Codice_Fiscale_Data_Nascita

Nel foglio CALCOLO_CODICE_FISCALE è stata inserita una funzione per trasformare la data in testo:

E18 è =TESTO(C18;"gg/mm/aaaa")

Mentre successivamente vengono ricavate le due cifre necessarie per il calcolo:

AA18 è =DESTRA(E18;2)

Infine, viene ricavato l'ultimo termine facendo un INDICE + CONFRONTA dal mese che è presente nella cella E18:

AB18 è =INDICE(LISTE!$F$8:$F$19;CONFRONTA(STRINGA.ESTRAI(E18;4;2);LISTE!$E$8:$E$19;0))

4. Calcolo codice fiscale: il sesso

Il sesso restituisce un carattere ed è strettamente collegato con la data di nascita.

Microsoft_Excel_Calcolo_Codice_Fiscale_Sesso

Se la persona è un uomo, allora si ottiene il giorno di nascita. Se invece è una donna, al giorno di nascita si aggiunge 40. Di conseguenza:

AA22 è =SE(C22="M";SINISTRA(E18;2);SINISTRA(E18;2)+40)

5. Calcolo codice Fiscale: il comune

Il comune restituisce tre caratteri corrispondenti al comune di nascita, che viene controllato sulla lista nel foglio LISTE.

Dato che ci potrebbero essere casi di omonimia nei singoli comuni (come indicato giustamente nei commenti da Roberto, che ringrazio), la formula ci richiede due possibilità:

  • Se ci viene segnalata la provincia, utilizziamo la combinazione comune + provincia
  • Se non ci viene segnalata la provincia, utilizziamo unicamente il comune

Vediamo come fare:

CALCOLARE_CODICE_FISCALE_EXCEL_COMUNE

=SE(C7="";INDICE(LISTE!$H$7:$H$10682;
CONFRONTA(E27;LISTE!$I$7:$I$10682;0));
INDICE(LISTE!$H$7:$H$10682;
CONFRONTA(1;
(E27=LISTE!$I$7:$I$10682)*(C7=LISTE!$J$7:$J$10682);
0)))

In pratica la formula agisce come indicavamo prima - se non c'è un valore nella provincia (la cella C7), allora fa un INDICE + CONFRONTA. Se invece il valore c'è, allora farà =INDICE(...;CONFRONTA(1.... che ci indica il fatto che entrambe le condizioni devono verificarsi: ovvero che il valore in E27 è fra i comuni e il valore in C7 è fra le province. Questo per evitare problemi di comuni (ad esempio Brione) che hanno lo stesso nome ma in zone diverse.

6. Calcolo codice fiscale: il carattere di controllo

Il carattere di controllo è uno solo e viene ricavato da quanto calcolato fino a questo momento.

Microsoft_Excel_Calcolo_Codice_Fiscale_Carattere_Controllo

In particolare, i singoli caratteri corrispondono a una lista diversa se sono in una posizione dispari (ad esempio il primo e il terzo carattere) oppure pari (ad esempio il sesto e l'ottavo). Nel foglio LISTE abbiamo due riferimenti diversi e per questo troviamo due formule differenziate, sempre con un INDICE + CONFRONTA.

Per i caratteri dispari viene replicata la seguente formula, cancellando le celle corrispondenti a caratteri pari:

F30 è =INDICE(LISTE!$L:$L;CONFRONTA(F$29;LISTE!$K:$K;0))

Viceversa, per i caratteri pari si inserisce la seguente formula, rimuovendola dalle celle corrispondenti ai caratteri dispari:

G31 è =INDICE(LISTE!$O:$O;CONFRONTA(G$29;LISTE!$N:$N;0))

Il carattere finale viene trovato sommando tutti i riferimenti per i caratteri del codice fiscale fino a questo punto. La somma viene poi divisa per 26 e, a seconda del resto della divisione (ad esempio se fosse 30, il resto sarebbe 4), questo valore viene fatto corrispondere ancora con un'altra lista che troviamo sempre nel foglio LISTE:

AA30 è =INDICE(LISTE!R:R;CONFRONTA(RESTO(SOMMA(F30:T31);26);LISTE!Q:Q;0))

7. Calcolo codice fiscale: versione finale

A questo punto abbiamo tutti i caratteri che ci servono per comporre il codice fiscale. Basta usare la funzione CONCAT per unirli fra di loro.

Nel file troverai alcune funzioni leggermente diverse (CONCATENA, SE) ma il procedimento è assolutamente lo stesso!

Microsoft_Excel_Calcolo_Codice_Fiscale

Come calcolare il codice fiscale con la funzione LAMBDA su Excel 365

Le funzioni LAMBDA ci permettono di creare da zero una funzione in maniera personalizzata, ma funzionano esclusivamente con le ultime versioni di Excel.

Se non hai familiarità con il processo, ti suggerisco caldamente di dare un'occhiata a questa guida che racconta passo passo come creare una funzione LAMBDA su Excel 365.

In questo caso, ho creato una funzione chiamata CODICE_FISCALE che, sul nostro file, calcola in automatico il codice fiscale inserendo semplicemente i parametri di cognome, nome, data di nascita, sesso, comune e provincia:

CALCOLARE_CODICE_FISCALE_EXCEL_LAMBDA_FINALE

La funzione è piuttosto complessa, si basa unicamente sul file che trovi sull'articolo (visti i nomi delle singole tabelle) e utilizza un mix di funzioni di Excel 365 per arrivare al risultato:

=LAMBDA(cognome;nome;data_nascita;sesso;comune;provincia;
LET(
ins_cognome_nos; SOSTITUISCI(cognome; " "; "");
cog; MATR.TRASPOSTA(STRINGA.ESTRAI(ins_cognome_nos; SEQUENZA(LUNGHEZZA(ins_cognome_nos)); 1));
cog_cv; PERCOL(cog; LAMBDA(x; CERCA.X(x; TBL_NC[CAR]; TBL_NC[VC])));
cog_col; COLONNE(cog);
cog_cvv; CONTA.VALORI(FILTRO(cog_cv; cog_cv = "V"));
cog_cvc; CONTA.VALORI(FILTRO(cog_cv; cog_cv = "C"));
cog_1v; INDICE(FILTRO(cog; cog_cv = "V"); 0; 1);
cog_2v; INDICE(FILTRO(cog; cog_cv = "V"); 0; 2);
cog_3v; INDICE(FILTRO(cog; cog_cv = "V"); 0; 3);
cog_1c; INDICE(FILTRO(cog; cog_cv = "C"); 0; 1);
cog_2c; INDICE(FILTRO(cog; cog_cv = "C"); 0; 2);
cog_3c; INDICE(FILTRO(cog; cog_cv = "C"); 0; 3);
cod_cog; PIÙ.SE(
(cog_col = 2) * (cog_cvv = 2);
TESTO.UNISCI(; ; cognome; "X");
(cog_col = 2) * (cog_cvc = 1) * (cog_cvv = 1);
TESTO.UNISCI(; ; cog_1c; cog_1v; "X");
(cog_col >= 3) * (cog_cvc = 1) * (cog_cvv >= 2);
TESTO.UNISCI(; ; cog_1c; cog_1v; cog_2v);
(cog_cvc = 2) * (cog_cvv >= 1);
TESTO.UNISCI(; ; cog_1c; cog_2c; cog_1v);
(cog_cvc >= 3);
TESTO.UNISCI(; ; cog_1c; cog_2c; cog_3c);
VERO;
"ERROR"
);
ins_nome_nos; SOSTITUISCI(nome; " "; "");
nom; MATR.TRASPOSTA(STRINGA.ESTRAI(ins_nome_nos; SEQUENZA(LUNGHEZZA(ins_nome_nos)); 1));
nom_cv; PERCOL(nom; LAMBDA(x; CERCA.X(x; TBL_NC[CAR]; TBL_NC[VC])));
nom_col; COLONNE(nom);
nom_cvv; CONTA.VALORI(FILTRO(nom_cv; nom_cv = "V"));
nom_cvc; CONTA.VALORI(FILTRO(nom_cv; nom_cv = "C"));
nom_1v; INDICE(FILTRO(nom; nom_cv = "V"); 0; 1);
nom_2v; INDICE(FILTRO(nom; nom_cv = "V"); 0; 2);
nom_3v; INDICE(FILTRO(nom; nom_cv = "V"); 0; 3);
nom_1c; INDICE(FILTRO(nom; nom_cv = "C"); 0; 1);
nom_2c; INDICE(FILTRO(nom; nom_cv = "C"); 0; 2);
nom_3c; INDICE(FILTRO(nom; nom_cv = "C"); 0; 3);
nom_4c; INDICE(FILTRO(nom; nom_cv = "C"); 0; 4);
cod_nom; PIÙ.SE(
(nom_col = 2) * (nom_cvv = 2);
TESTO.UNISCI(; ; nome; "X");
(nom_col = 2) * (nom_cvc = 1) * (nom_cvv = 1);
TESTO.UNISCI(; ; nom_1c; nom_1v; "X");
(nom_col >= 3) * (nom_cvc = 1) * (nom_cvv >= 2);
TESTO.UNISCI(; ; nom_1c; nom_1v; nom_2v);
(nom_cvc = 2) * (nom_cvv >= 1);
TESTO.UNISCI(; ; nom_1c; nom_2c; nom_1v);
(nom_cvc = 3);
TESTO.UNISCI(; ; nom_1c; nom_2c; nom_3c);
(nom_cvc > 3);
TESTO.UNISCI(; ; nom_1c; nom_3c; nom_4c);
VERO;
"ERROR"
);
com_nom_cmp; TESTO.UNISCI(; ; cod_cog; cod_nom);
testo_ins; TESTO(data_nascita; "gg/mm/aaaa");
anno_ins; DESTRA(testo_ins; 2);
mese_ins; STRINGA.ESTRAI(testo_ins; 4; 2);
giorno_ins; SINISTRA(testo_ins; 2);
mese_cf; CERCA.X(mese_ins; TBL_M[MESE]; TBL_M[LETTERA]);
sesso_cf; SE(sesso = "M"; giorno_ins; giorno_ins + 40);
anno_mese_sesso_cf; TESTO.UNISCI(; ; anno_ins; mese_cf; sesso_cf);
cod_comune; CERCA.X(
comune & provincia;
ANPR[IT] & ANPR[SIG];
ANPR[CAT];
"Inserisci la provincia corretta"
);
cf_noc; TESTO.UNISCI(; ; com_nom_cmp; anno_mese_sesso_cf; cod_comune);
control_d; MAP(
STRINGA.ESTRAI(cf_noc; SEQUENZA(1; 8; 1; 2); 1);
LAMBDA(x; INDICE(TBL_DIS[VAL]; CONFRONTA(x; TBL_DIS[CAR]; 0)))
);
control_p; MAP(
STRINGA.ESTRAI(cf_noc; SEQUENZA(1; 7; 2; 2); 1);
LAMBDA(x; INDICE(TBL_PARI[VAL]; CONFRONTA(x; TBL_PARI[CAR]; 0)))
);
somma_c; SOMMA(control_d; control_p);
resto_c; RESTO(somma_c; 26);
control_code; CERCA.X(resto_c; TBL_CONT[R]; TBL_CONT[L]);
codice_fiscale; MAIUSC(TESTO.UNISCI(; ; cf_noc; control_code));
codice_fiscale
)
)

Per testarla, ti basterebbe aggiungere alla fine i valori per

  • Cognome
  • Nome
  • Data di nascita
  • Sesso
  • Comune
  • Provincia

come in questo esempio:

CALCOLARE_CODICE_FISCALE_EXCEL_LAMBDA

per poi ottenere il valore finale:

CALCOLO_CODICE_FISCALE_LAMBDA_TEST

Come noti, il risultato è uguale al primo valore sotto la scritta "Codice Fiscale" - che è stata realizzata invece proprio con la funzione =CODICE_FISCALE.

Il problema in questo caso è che la funzione è talmente complessa da non poter essere salvata come nome definito velocemente, ti rimando a questa discussione sul perchè ma in sostanza è perchè al momento l'Advanced Formula Environment di Excel, creato per gestire le LAMBDA, gestisce male le versioni del software che non siano quelle native inglesi.

Nel mio caso, sono riuscito a crearla come funzione CODICE_FISCALE e non come LAMBDA solo dopo averla tradotta, caricata su Github, importata sul mio foglio + aver impostato come standard di preferenze di Windows la lingua inglese per i formati di data e di interfaccia.

Confido che in futuro sarà più semplice gestire LAMBDA così complesse, anche perchè al momento la funzione =CODICE_FISCALE può essere utilizzata unicamente con questa combinazione di elementi (bisogna impostare le preferenze di sistema in inglese) e non è propriamente agevole.

Potresti anche trasferirla su altri tuoi file, ma occhio ai nomi delle tabelle di riferimento dato che si basa sui nomi che ho dato (ad esempio TBL_M oppure TBL_PARI), penso non ne valga la pena se non pensi di usarla massivamente.

Bisogna infatti stare attenti con i formati, ad esempio per renderla utilizzabile senza problemi con la versione inglese (quindi passando da =LAMBDA a =CODICE_FISCALE) bisogna anche cambiare il formato della data nella formula, come vedi qui:

CALCOLO_CODICE_FISCALE_LAMBDA_IT_EN_EXCEL

Per utilizzare la funzione CODICE_FISCALE, i passaggi sono questi:

  • Imposta le tue preferenze di sistema con il formato inglese (come vedi dalla immagine)
CALCOLO_CODICE_FISCALE_LAMBDA_PREFERENZE_SISTEMA
  • Scarica il file dal pulsante qui sotto
  • Modifica i dati nella tabella e inserisci quelli che preferisci tu!

18 commenti su “Calcolo codice fiscale Excel”

  1. Buongiorno,
    ho scaricato il file ma non riesco ad utilizzarlo perché modificando un valore qualsiasi (celle C2, C3, etc) il foglio di calcolo mostra diffusi messaggi di errore (#nome?, soprattutto nelle celle che dovrebbero esprimere il risultato.
    Può aiutarmi ?
    Grazie
    3805167826

    1. Ciao Pasquale!

      Grazie per il tuo commento, che versione usi di Excel? Così vediamo come si può sistemare, dovrebbe andare con Excel 2016 o 2019 / 365.

      A presto e buona giornata

      Marco

  2. Salve, mi chiedevo, dato un foglio di lavoro contenente tutti i dati di molte persone, come si inserisce per ognuna il codice fiscale in una nuova colonna generandolo in automatico?

    1. Ciao Ste,

      purtroppo il file dell'articolo non permette di calcolare velocemente il CF per una moltitudine di persone!

      Ottimo spunto per un ampliamento dell'articolo però, grazie per la domanda.

      A presto!

      Marco

  3. Bravo!
    C'è un piccolo refuso nel testo. E' all'inizio, se vuoi sistemarlo:
    "Data di nascita, che restituirà ulteriori 3 caratteri (totale 3+3+3 = 9)" Sono 4 caratteri, credo...
    Ciao

    1. Ciao Mario,

      purtroppo non ho utilizzato Google Sheets per progetti simili quindi non saprei dirti, se però trovi una soluzione sarei curioso di saperne di più!

      Marco

  4. Prima di pubblicare del codice assicurati che sia robusto. La formula per il calcolo delle lettere sul campo nome e cognome non funzione. Che figuraccia

    1. Ciao Franco,

      grazie per la precisazione, fa sempre piacere ricevere feedback anche se negativi.

      Dopo la tua segnalazione ho fatto una prova sia su mobile con Excel sia su PC con Excel 365 e mi pare funzionare tutto bene, mi spieghi meglio il tuo problema? Così nel caso aggiorno il file e l'articolo.

      A presto e buona giornata,

      Marco

      PS Immagino sia uno pseudonimo ma gran bella scelta, Franco Nero piace molto anche a me!

  5. Antonio Perasole

    Grazie Marco complimenti hai fatto davvero un lavoro eccellente !!. Avrei piacere di chiederti un consiglio a questo proposito: ho bisogno, quando inserisco il CF di un paziente (metti in G2, per brevità), di valutarne la correttezza. Ho adattato questa formula presa sul web per formattare in modo condizionale la cella ed evidenziare il cod nel caso sia errato. Il calcolo restituisce 1 se il CF è corretto e 0 se errato).
    Il codice di controllo nel caso di TRNGPP44C59H224K è ritenuto errato sia dalla formula sotto sia dall'Ag. delle Entrate, ma non dal tuo calcolo.
    Hai piacere di darci un'occhiata ? mi farebbe molto piacere sapere cosa ne pensi.

    =SE(MAIUSC(STRINGA.ESTRAI(G2;16;1))=CODICE.CARATT(RESTO((CODICE(STRINGA.ESTRAI(MAIUSC(G2);2;1))-65)+(CODICE(STRINGA.ESTRAI(MAIUSC(G2);4;1))-65)+(CODICE(STRINGA.ESTRAI(MAIUSC(G2);6;1))-65)+(CODICE(STRINGA.ESTRAI(MAIUSC(G2);8;1))-48)+(CODICE(STRINGA.ESTRAI(MAIUSC(G2);10;1))-48)+(CODICE(STRINGA.ESTRAI(MAIUSC(G2);12;1))-65)+(CODICE(STRINGA.ESTRAI(MAIUSC(G2);14;1))-48)+(TROVA(STRINGA.ESTRAI(MAIUSC(G2);1;1);"BAKPLCQDREVOSFTGUHMINJWZYX")-1)+(TROVA(STRINGA.ESTRAI(MAIUSC(G2);3;1);"BAKPLCQDREVOSFTGUHMINJWZYX")-1)+(TROVA(STRINGA.ESTRAI(MAIUSC(G2);5;1);"BAKPLCQDREVOSFTGUHMINJWZYX")-1)+(TROVA(STRINGA.ESTRAI(MAIUSC(G2);7;1);"10AAA2A3A4AAA5A6A7A8A9")-1)+(TROVA(STRINGA.ESTRAI(MAIUSC(G2);9;1);"BAKPLCQDREVOSFTGUHMINJWZYX")-1)+(TROVA(STRINGA.ESTRAI(MAIUSC(G2);11;1);"10AAA2A3A4AAA5A6A7A8A9")-1)+(TROVA(STRINGA.ESTRAI(MAIUSC(G2);13;1);"10AAA2A3A4AAA5A6A7A8A9")-1)+(TROVA(STRINGA.ESTRAI(MAIUSC(G2);15;1);"10AAA2A3A4AAA5A6A7A8A9")-1);26)+65);1;0)

    Pensi sia possibile fare il percorso inverso e proporre nel tuo file uno spazio per una verifica di correttezza del codice ? Grazie mille in anticipo e scusami se sono stato prolisso.
    Antonio

    1. Ciao Antonio,

      grazie per la domanda prima di tutto!

      Lo spunto è molto interessante, non sono riuscito a replicare però il problema del quale parlavi. Mettendo dei valori a caso (che diano TRNGPP44C59H224) mi è uscito M come valore finale sul file.

      Se hai 365, ho provato a ridurre il tutto ad una sola formula (basandosi sul mio file però) per verificarne la correttezza, seguendo quanto hai fatto:

      =SE(DESTRA(G2;1)=INDICE(LISTE!R:R;CONFRONTA(RESTO(SOMMA(SOMMA(
      INDICE(LISTE!$L:$L;CONFRONTA(STRINGA.ESTRAI(G2;SEQUENZA(8;1;1;2);1);LISTE!$K:$K;0)));SOMMA(
      INDICE(LISTE!$O:$O;CONFRONTA(STRINGA.ESTRAI(G2;SEQUENZA(7;1;2;2);1);LISTE!$N:$N;0))));26);LISTE!Q:Q;0));"OKAY";"NO")

      Spero che ti possa essere utile come spunto!

      A presto,

      Marco

  6. Dario Pedretti

    Sul pc della mia ONLUS ho Office 2016, ho scaricato il file per versione precedenti, ma purtroppo non funziona.
    Sul mio pc personale con Office 2019 invece va bene.

    Saluti

  7. Ciao Marco, gran bel lavoro complimenti !
    Una cosetta da sistemare però c'è ... non sono gestiti i casi di comuni omonimi, in ITALIA, ne esistono 8 coppie:
    Brione: vi sono 2 Brione, uno in provincia di Brescia e uno in provincia di Trento;
    Calliano: abbiamo un Calliano ancora nel Trentino ed un Calliano in provincia di Asti;
    Castro: ce ne sono 2, uno nella bergamasca ed uno in provincia di Lecce;
    Livo: esiste un Comune di Livo nel Comasco ed uno in provincia di Trento;
    Peglio: esiste un Peglio in provincia di Pesaro Urbino e uno in provincia di Como;
    Samone: vi è un Comune di Samone nel Torinese ed uno in provincia di Trento;
    San Teodoro: uno è in provincia di Olbia Tempio e uno nel messinese;
    Valverde: esiste un Comune di Valverde in provincia di Catania ed uno in provincia di Pavia.
    Nella tua lista sono:
    B184 BRIONE
    B185 BRIONE
    B418 CALLIANO
    B419 CALLIANO
    C337 CASTRO
    M261 CASTRO
    E623 LIVO
    E624 LIVO
    G415 PEGLIO
    G416 PEGLIO
    H753 SAMONE
    H754 SAMONE
    I328 SAN TEODORO
    I329 SAN TEODORO
    L659 VALVERDE
    L658 VALVERDE
    andrebbe inserito un campo aggiuntivo- tra i dati di input, ove specificare la provincia del comune nel caso di uno dei 16 casi sopra elencati.
    Mi è caduto l'occhio anche sulla coppia:
    ND SAN SIRO
    I162 SAN SIRO
    suppongo sia opportuno eliminare la prima occorrenza dalla lista.
    Approfondendo la ricerca nel foglio LISTE ci sono diversi casi da "ripulire", di seguito alcuni, di essi (tutti sono troppi)
    L551 VALDAGNO
    A179 VALDAGNO (non causa errore, ma si può eliminare, dal 1955 il nome è ALDINO (BZ), presente in elenco)
    L560 VALDIGNA D'AOSTA
    F726 VALDIGNA D'AOSTA (non causa errore, ma si può eliminare, dal 1946 il nome è MORGEX (AO), presente in elenco)
    A273 ANDALO (va eliminato, nome corretto è ANDALO VALTELLINO presente in elenco)
    A274 ANDALO
    A273 ANDALO VALTELLINO
    A333 APPIANO (va eliminato, nome corretto è ANDALO VALTELLINOAPPIANO GENTILE presente in elenco)
    A332 APPIANO
    A333 APPIANO GENTILE
    ND ARIZZANO (va eliminato)
    A409 ARIZZANO
    A410 ARIZZANO INFERIORE
    A411 ARIZZANO SUPERIORE

    Un caro saluto e grazie per il file che hai realizzato.

    1. Ciao Roberto,

      grazie mille a te per il commento e per il dettaglio - hai ragione, sono casi spot ma è giusto segnalarli.

      Ho aggiornato l'articolo mettendo sia la provincia sia la possibilità di creare il codice fiscale in automatico con LAMBDA su Excel 365!

      A presto e buona giornata,

      Marco

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *