Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Quizzone di Excel] Verifica del Codice Fiscale alfanumerico

1,182 views
Skip to first unread message

r

unread,
Oct 6, 2014, 5:36:48 PM10/6/14
to
Ciao a tutti,
ho provato a cercare nell'NG ma non ho trovato una soluzione con formula per il controllo del Codice Fiscale alfanumerico di 16 caratteri. Probabilmente ho cercato male :-) ... Ho trovato qualcosa in google ma non soddisfatto mi sono scritto una formula che verifica la correttezza formale del codice fiscale ovvero verificare la correttezza del codice di controllo (sedicesimo carattere).

Da qui le regole che riporto qui sotto http://it.wikipedia.org/wiki/Codice_fiscale#Generazione_del_codice_fiscale :

Carattere di controllo (una lettera)
A partire dai quindici caratteri alfanumerici ricavati in precedenza, si determina il carattere di controllo (indicato a volte come CIN, Control Internal Number) in base a un particolare algoritmo che opera in questo modo:
- si mettono da una parte i caratteri alfanumerici che si trovano in posizione dispari (il primo, il terzo eccetera) e da un'altra quelli che si trovano in posizione pari (il secondo, il quarto eccetera);
- fatto questo, i caratteri vengono convertiti in valori numerici secondo le seguenti tabelle:

CARATTERI ALFANUMERICI DISPARI
Carattere Valore
0 1
1 0
2 5
3 7
4 9
5 13
6 15
7 17
8 19
9 21
A 1
B 0
C 5
D 7
E 9
F 13
G 15
H 17
I 19
J 21
K 2
L 4
M 18
N 20
O 11
P 3
Q 6
R 8
S 12
T 14
U 16
V 10
W 22
X 25
Y 24
Z 23

CARATTERI ALFANUMERICI PARI
Carattere Valore
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
A 0
B 1
C 2
D 3
E 4
F 5
G 6
H 7
I 8
J 9
K 10
L 11
M 12
N 13
O 14
P 15
Q 16
R 17
S 18
T 19
U 20
V 21
W 22
X 23
Y 24
Z 25

a questo punto, i valori che si ottengono dai caratteri alfanumerici pari e dispari vanno sommati tra di loro e il risultato va diviso per 26; il resto della divisione fornirà il codice identificativo, ottenuto dalla seguente tabella di conversione:

RESTO LETTERA
0 A
1 B
2 C
3 D
4 E
5 F
6 G
7 H
8 I
9 J
10 K
11 L
12 M
13 N
14 O
15 P
16 Q
17 R
18 S
19 T
20 U
21 V
22 W
23 X
24 Y
25 Z


XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

adesso immaginiamo che in A1 ci sia il codice fiscale ... che può essere maiuscolo o scritto in minuscolo ... e in B1 scriviamo la formula che restituisce VERO se il codice di controllo corrisponde e quindi il codice fiscale è formalmente corretto.
La formula viene scritta in modo che possa essere trascinata verso il basso.

La mia soluzione è lunga:
289 caratteri formula non matriciale senza matrici di costanti (239 versione en)
271 caratteri formula matriciale senza matrici di costanti (223 versione en)
273 caratteri formula non matriciale con matrici di costanti (235 versione en)

Sicuramente si può fare di meglio ... o anche solo diversamente ...
Vediamo cosa proponete.

Saluti
r

ninai

unread,
Oct 7, 2014, 10:01:39 AM10/7/14
to
ma il "calcoletto" , va fatto senza nessun appoggio???? devono esserci solo le celle A1 e B1?
o solo le tabelle per l'estrazione dei numeri o lettera? o cosa?

ninai

unread,
Oct 7, 2014, 11:03:17 AM10/7/14
to
con tabelle di appoggio:
=DESTRA(A1;1)=INDICE($C$87:$C$112;RESTO(MATR.SOMMA.PRODOTTO(CERCA(STRINGA.ESTRAI(A1;{1.3.5.7.9.11.13.15};1);$C$8:$C$43;$D$8:$D$43))+MATR.SOMMA.PRODOTTO(CERCA(STRINGA.ESTRAI(A1;{2.4.6.8.10.12.14};1);$C$47:$C$82;$D$47:$D$82));26)+1)
CARATTERI 230 , attribuendo i nomi alle tabelle , si dovrebbero risparmiare caratteri

c87:c112 tabella di conversione

C8:D43 tabella dispari

c47:d82 tabella pari

ninai

unread,
Oct 7, 2014, 11:20:57 AM10/7/14
to
in forma matriciale:
=DESTRA(A1;1)=INDICE($C$87:$C$112;RESTO(SOMMA(CERCA(STRINGA.ESTRAI(A1;{1.3.5.7.9.11.13.15};1);$C$8:$C$43;$D$8:$D$43))+SOMMA(CERCA(STRINGA.ESTRAI(A1;{2.4.6.8.10.12.14};1);$C$47:$C$82;$D$47:$D$82));26)+1)

202 caratteri

r

unread,
Oct 7, 2014, 11:33:45 AM10/7/14
to
Il giorno martedì 7 ottobre 2014 16:01:39 UTC+2, ninai ha scritto:
> ma il "calcoletto" , va fatto senza nessun appoggio???? devono esserci solo le celle A1 e B1?
>
> o solo le tabelle per l'estrazione dei numeri o lettera? o cosa?

senza appoggio naturalmente ...
ciao
r

ninai

unread,
Oct 7, 2014, 4:05:59 PM10/7/14
to

>
> senza appoggio naturalmente ...
>

della serie "senza vergogna".
Gli appoggi li ho eliminati, ma è un tantino più lunga , (629 caratteri) ;) ;)

matriciale

=DESTRA(A1;1)=CODICE.CARATT(RESTO(SOMMA(CERCA(STRINGA.ESTRAI(A1;{1.3.5.7.9.11.13.15};1);{"0"."1"."2"."3"."4"."5"."6"."7"."8"."9"."a"."b"."c"."d"."e"."f"."g"."h"."i"."j"."k"."l"."m"."n"."o"."p"."q"."r"."s"."t"."u"."v"."w"."x"."y"."z"};{1.0.5.7.9.13.15.17.19.21.1.0.5.7.9.13.15.17.19.21.2.4.18.20.11.3.6.8.12.14.16.10.22.25.24.23}))+SOMMA(CERCA(STRINGA.ESTRAI(A1;{2.4.6.8.10.12.14};1);{"0"."1"."2"."3"."4"."5"."6"."7"."8"."9"."a"."b"."c"."d"."e"."f"."g"."h"."i"."j"."k"."l"."m"."n"."o"."p"."q"."r"."s"."t"."u"."v"."w"."x"."y"."z"};{0.1.2.3.4.5.6.7.8.9.0.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25}));26)+97)

prima o poi ce la farò :)

r

unread,
Oct 7, 2014, 4:58:45 PM10/7/14
to
Il giorno martedì 7 ottobre 2014 22:05:59 UTC+2, ninai ha scritto:

> prima o poi ce la farò :)

beh ce l'hai già fatta! :-)
nel quizzone la regola era che la prima risposta funzionante faceva guadagnare 5 degli 8 punti disponibili e l'onere onore di pubblicare il quiz successivo ... 5 punti li hai guadagnati :-)

la tua formula è molto simile alla mia ... solo un piccolo trucco ancora per raggiungerla ... e poi magari superarla!

intanto nella tua matrice di costanti è inutile usare "1"."2" ... usando 1.2.3.4 guadagneresti un bel po' di caratteri ... ma c'è ppi un modo più conciso ... senza tutte quelle "" ... spremete le meningi :-)
ciao
r

ninai

unread,
Oct 7, 2014, 5:03:59 PM10/7/14
to
294 caratteri

=DESTRA(A1;1)=CODICE.CARATT(RESTO(SOMMA(TROVA(STRINGA.ESTRAI(A1;{1.3.5.9};1);"BAKPLCQDREVOSFTGUHMINJWZYX")-1;TROVA(STRINGA.ESTRAI(A1;{7.11.13.15};1);"10AAA2A3A4AAA5A6A7A8A9")-1)+SOMMA(CODICE(STRINGA.ESTRAI(MAIUSC(A1);{2.4.6.12};1))-65;CODICE(STRINGA.ESTRAI(MAIUSC(A1);{8.10.14};1))-48);26)+97)

ninai

unread,
Oct 7, 2014, 5:13:01 PM10/7/14
to
ci siamo accavallati.....
per stasera mi fermo......,
non sapevo sta storia dei punti...., mi informerò ;) ;)

notte

r

unread,
Oct 7, 2014, 5:23:10 PM10/7/14
to
Il giorno martedì 7 ottobre 2014 23:03:59 UTC+2, ninai ha scritto:
> 294 caratteri
>
>
>
> =DESTRA(A1;1)=CODICE.CARATT(RESTO(SOMMA(TROVA(STRINGA.ESTRAI(A1;{1.3.5.9};1);"BAKPLCQDREVOSFTGUHMINJWZYX")-1;TROVA(STRINGA.ESTRAI(A1;{7.11.13.15};1);"10AAA2A3A4AAA5A6A7A8A9")-1)+SOMMA(CODICE(STRINGA.ESTRAI(MAIUSC(A1);{2.4.6.12};1))-65;CODICE(STRINGA.ESTRAI(MAIUSC(A1);{8.10.14};1))-48);26)+97)

sempre meglio!
bravo!
insisti
r

r

unread,
Oct 7, 2014, 5:25:53 PM10/7/14
to
Il giorno martedì 7 ottobre 2014 23:03:59 UTC+2, ninai ha scritto:
> 294 caratteri
>
>
>
> =DESTRA(A1;1)=CODICE.CARATT(RESTO(SOMMA(TROVA(STRINGA.ESTRAI(A1;{1.3.5.9};1);"BAKPLCQDREVOSFTGUHMINJWZYX")-1;TROVA(STRINGA.ESTRAI(A1;{7.11.13.15};1);"10AAA2A3A4AAA5A6A7A8A9")-1)+SOMMA(CODICE(STRINGA.ESTRAI(MAIUSC(A1);{2.4.6.12};1))-65;CODICE(STRINGA.ESTRAI(MAIUSC(A1);{8.10.14};1))-48);26)+97)

attenzione però che trova è sensibile a maiuscole minuscole ... bisognerebbe quindi convertire la stringa in maiuscolo ... oppure usare una funzione che non è insensibile :-)

r

unread,
Oct 7, 2014, 5:30:13 PM10/7/14
to
Il giorno martedì 7 ottobre 2014 23:03:59 UTC+2, ninai ha scritto:
> 294 caratteri
>
>
>
> =DESTRA(A1;1)=CODICE.CARATT(RESTO(SOMMA(TROVA(STRINGA.ESTRAI(A1;{1.3.5.9};1);"BAKPLCQDREVOSFTGUHMINJWZYX")-1;TROVA(STRINGA.ESTRAI(A1;{7.11.13.15};1);"10AAA2A3A4AAA5A6A7A8A9")-1)+SOMMA(CODICE(STRINGA.ESTRAI(MAIUSC(A1);{2.4.6.12};1))-65;CODICE(STRINGA.ESTRAI(MAIUSC(A1);{8.10.14};1))-48);26)+97)

un'ultima nota ... attenzione a questa wiki precisazione:
Due diverse persone potrebbero avere uguali tutte e sedici le lettere/cifre generate usando questo schema (omocodia). In questo caso, l'Agenzia delle Entrate provvede a sostituire sistematicamente i soli caratteri numerici (a partire dal carattere numerico più a destra) con una lettera, secondo la seguente tabella di corrispondenza:

l'ultimo numero quindi potrebbe essere anche una lettera ...

questa parte CODICE(STRINGA.ESTRAI(MAIUSC(A2);{8.10.14};1))-48
quindi non funziona sempre e comunque era accorciabile così:
--STRINGA.ESTRAI(MAIUSC(A2);{8.10.14};1) non trovi?
notte
r

r

unread,
Oct 7, 2014, 5:39:00 PM10/7/14
to
Il giorno martedì 7 ottobre 2014 23:13:01 UTC+2, ninai ha scritto:

> non sapevo sta storia dei punti...., mi informerò ;) ;)

ecco qua:
https://sites.google.com/site/e90e50/documento-plinius/quizzone-di-excel
r

ninai

unread,
Oct 8, 2014, 12:48:46 AM10/8/14
to
>
> Due diverse persone potrebbero avere uguali tutte e sedici le lettere/cifre generate usando questo schema (omocodia). In questo caso, l'Agenzia delle Entrate provvede a sostituire sistematicamente i soli caratteri numerici (a partire dal carattere numerico più a destra) con una lettera, secondo la seguente tabella di corrispondenza:
>
> l'ultimo numero quindi potrebbe essere anche una lettera ...

Per questo, al momento, posso solo corrompere l'impiegato dell'anagrafe comunale per falsificare i dati degli "omocodi" ;) ;)

per il resto (grazie alle tue dritte), ho sistemato ed accorciato ancora un po. (281)

=DESTRA(A1;1)=CODICE.CARATT(RESTO(SOMMA(RICERCA(STRINGA.ESTRAI(A1;{1.3.5.9};1);"BAKPLCQDREVOSFTGUHMINJWZYX")-1;RICERCA(STRINGA.ESTRAI(A1;{7.11.13.15};1);"10AAA2A3A4AAA5A6A7A8A9")-1)+SOMMA(CODICE(STRINGA.ESTRAI(MAIUSC(A1);{2.4.6.12};1))-65;--STRINGA.ESTRAI(A1;{8.10.14};1));26)+97)

r

unread,
Oct 8, 2014, 6:02:58 AM10/8/14
to
stai andando molto bene ... però non va bene corrompere gli impiegati ... cerca di sistemare in modo che la formula consideri anche questa casistica ... intanto la tua può essere accorciata così:
=DESTRA(A1)=CODICE.CARATT(RESTO(SOMMA(RICERCA(STRINGA.ESTRAI(A1;{1.3.5.9};1);"BAKPLCQDREVOSFTGUHMINJWZYX");RICERCA(STRINGA.ESTRAI(A1;{7.11.13.15};1);"10AAA2A3A4AAA5A6A7A8A9");CODICE(STRINGA.ESTRAI(MAIUSC(A1);{2.4.6.12};1))-65;--STRINGA.ESTRAI(A1;{8.10.14};1);-8);26)+97)

e non è necessario confermarla come matriciale
r

r

unread,
Oct 8, 2014, 5:02:43 PM10/8/14
to
Il giorno lunedì 6 ottobre 2014 23:36:48 UTC+2, r ha scritto:

> La mia soluzione è lunga:
>
> 289 caratteri formula non matriciale senza matrici di costanti (239 versione en)
>
> 271 caratteri formula matriciale senza matrici di costanti (223 versione en)
>
> 273 caratteri formula non matriciale con matrici di costanti (235 versione en)

la mia soluzione ... è la formula prima della lista, 289 chr non matriciale e non usa matrici di costanti ... non che io abbia qualcosa contro le matrici di costanti o contro le formule matriciali anzi :-) ... però sappiamo che in excel italiano i separatori nelle matrici di costanti sono diversi a seconda delle versioni così onde permettere a tutti di goderne il funzionamento preferisco evitarle ... allo stesso modo l'inserimento matriciale a volte per i meno esperti crea qualche difficoltà ... così ecco:

=DESTRA(A1)=CODICE.CARATT(RESTO(SOMMA(INDICE(INT(RICERCA(STRINGA.ESTRAI(A1;RIF.RIGA($1:$7)*2;1);"#0A1B2C3D4E5F6G7H8I9JK#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z")/2););INDICE(INT(RICERCA(STRINGA.ESTRAI(A1;RIF.RIGA($1:$8)*2-1;1);"#1B0AK#P#L#2CQ#3DR#4EV#O#S#5FT#6GU#7HM#8IN#9JW#Z#Y#X")/2);))-15;26)+65)

e la versione in inglese (per bruno)
=RIGHT(A1)=CHAR(MOD(SUM(INDEX(INT(SEARCH(MID(A1,ROW($1:$7)*2,1),"#0A1B2C3D4E5F6G7H8I9JK#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z")/2),),INDEX(INT(SEARCH(MID(A1,ROW($1:$8)*2-1,1),"#1B0AK#P#L#2CQ#3DR#4EV#O#S#5FT#6GU#7HM#8IN#9JW#Z#Y#X")/2),))-15,26)+65)

questa formula tiene conto anche del fatto che l'ultimo numero può essere sostituito con una lettera nei casi di codici identici.
vediamo se riuscite a tagliuzzarla!
ciao
r

ninai

unread,
Oct 9, 2014, 12:51:49 AM10/9/14
to

ciao
Io avevo "buttato la spugna", non credo ci sarei arrivato, anzi, avendo già rimosso, non capisco come risolve il problema dell' omocodia. Vedrò di studiarmela

plinius

unread,
Oct 19, 2014, 1:45:40 PM10/19/14
to
Non passavo da queste parti da oltre un mese e... ma che bel quizzone e
che bella soluzione!
Migliorabile? non saprei dirlo, ma senza dubbio molto molto valida.

Però, tanto per celiare, rubacchio qualche carattere (-7) :-D

=CODICE(DESTRA(A1))=RESTO(SOMMA(INDICE(INT(RICERCA(STRINGA.ESTRAI(A1;RIF.RIGA($1:$7)*2;1);"#0A1B2C3D4E5F6G7H8I9JK#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z")/2););INDICE(INT(RICERCA(STRINGA.ESTRAI(A1;RIF.RIGA($1:$8)*2-1;1);"#1B0AK#P#L#2CQ#3DR#4EV#O#S#5FT#6GU#7HM#8IN#9JW#Z#Y#X")/2);))-15;26)+65

Ciao,
E.

---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
http://www.avast.com

r

unread,
Oct 20, 2014, 12:18:26 PM10/20/14
to
Sono dal cellulare ma sembrerebbe che tiene conto del maiuscolo minuscolo ... A prposito, ciao!

r

unread,
Oct 20, 2014, 12:26:44 PM10/20/14
to
Ovvero per rispettare i requisiti dovrebbe essere tipo
=CODICE(MAIUSC(DESTRA(A1)))=RESTO(....

plinius

unread,
Oct 22, 2014, 9:55:20 AM10/22/14
to
Il 20/10/2014 18:26, r ha scritto:
> Ovvero per rispettare i requisiti dovrebbe essere tipo
> =CODICE(MAIUSC(DESTRA(A1)))=RESTO(....
>


Hai dimenticato che sono pigro? La formula è esattamente la tua, salvo
che anziché confrontare due caratteri confronta due codici.

Cambia da così:
M=CODICE.CARATT(N) [18 caratteri]

a così:
CODICE(M)=N [11 caratteri]

con M e N identici

Ciao r!
E. :-)

r

unread,
Oct 22, 2014, 12:28:36 PM10/22/14
to
Hai provato a scrivere il cf in minuscolo? Il fatto è che codice("a")=codice("A") restituisce falso (tua formula) mentre "a"="A" restituisce vero (mia formula)

plinius

unread,
Oct 22, 2014, 2:01:14 PM10/22/14
to
Il 22/10/2014 18:28, r ha scritto:
> Hai provato a scrivere il cf in minuscolo? Il fatto è che codice("a")=codice("A") restituisce falso (tua formula) mentre "a"="A" restituisce vero (mia formula)
>

Giusto, hai ragione (com'è ovvio!) :-D

r

unread,
Oct 22, 2014, 4:37:39 PM10/22/14
to
:-)
0 new messages