Verifica della correttezza formale del numero di partita IVA Stampa
Scritto da Saoche   
Mercoledì 20 Luglio 2005 01:00

Il numero di partita Iva è formato da 11 caratteri numerici, di cui, i primi 7 individuano il contribuente attraverso un numero progressivo, i successivi 3 individuano la provincia dove ha sede l'Ufficio che attribuisce la partita, l'ultimo è un carattere di controllo che, essendo il risultato di calcoli operati sul resto del codice, serve per verificare la correttezza formale del numero di partita IVA evitando gli errori comunemente commessi durante la trascrizione manuale.

Verifica della correttezza formale del numero di partita IVA

 

A tutti i soggetti che intraprendono un'attività rilevante ai fini Iva (impresa, arte, professione), al momento della presentazione della dichiarazione di inizio attività, viene attribuito dall'Agenzia delle Entrate il numero di partita IVA, che serve ad identificare univocamente il soggetto ai fini fiscali fino alla cessazione dell'attività.

 

Composizione

Il numero di partita Iva è formato da 11 caratteri numerici, di cui, i primi 7 individuano il contribuente attraverso un numero progressivo, i successivi 3 individuano la provincia dove ha sede l'Ufficio che attribuisce la partita, l'ultimo è un carattere di controllo che, essendo il risultato di calcoli operati sul resto del codice, serve per verificare la correttezza formale del numero di partita IVA evitando gli errori comunemente commessi durante la trascrizione manuale.

 

Algoritmo di calcolo del carattere di controllo

L'algoritmo per il calcolo del codice di controllo è il seguente:

 

1.Si sommano le cifre di posizione dispari, dalla prima alla nona;

 

2. Si moltiplica ogni cifra di posizione pari, dalla seconda alla decima, per due e se il prodotto è maggiore di nove, gli si sottrae nove;

 

3.Si sommano i risultati di cui ai precedenti punti;

4.Si calcola il resto della divisione della somma così ottenuta per dieci;

5.Se il resto della divisione è uguale a zero anche il codice di controllo sarà uguale a zero, altrimenti il codice di controllo sarà uguale a dieci meno il resto della divisione di cui al punto precedente.

 

Creazione di una formula per il calcolo, con excel, del carattere di controllo

Per calcolare la somma delle cifre di posizione dispari si può utilizzare la funzione STRINGA.ESTRAI(), utilizzando come secondo argomento la costante di matrice {1;3;5;7;9} per indicare alla funzione le posizioni dei caratteri da estrarre:

=STRINGA.ESTRAI(A1;{1;3;5;7;9};1)

(la parentesi graffe aperta si ottiene con Alt+123 mentre quella chiusa con Alt+125).

Per verificare il risultato di questa formula, selezionarla all'interno della barra delle formule e premere F9 (per ripristinare premere Esc), comparirà il seguente risultato:

 

In C1 è riportata la formula presente in B1.

Il risultato, come evidenziano le virgolette, è costituito da caratteri alfanumerici rappresentanti delle cifre, quindi, prima di sommarli tra loro è necessario trasformarli in numeri coinvolgendoli in una operazione matematica che non ne alteri il valore, moltiplicandoli per 1 per esempio

=1*STRINGA.ESTRAI(A1;{1;3;5;7;9};1)

 

oppure se ne può cambiare il segno due volte consecutive:

=--STRINGA.ESTRAI(A1;{1;3;5;7;9};1)

 

Come si può notare, in ambedue i casi le virgolette sono sparite e anche l'allineamento del numero otto nella cella B1, primo valore del vettore, non è più a sinistra.

Si può quindi procedere alla somma ed ottenere la somma ricercata con:

=SOMMA(--STRINGA.ESTRAI(A1;{1;3;5;7;9};1))

 

Per estrarre le cifre di posizione pari da 2 a 10 e moltiplicarle per 2 si può usare questa formula:

=STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2

 

in cui, però, dobbiamo sottrarre 9 ai prodotti che lo superano.

Per fare questo ci sono diverse possibilità, per es., si effettua la somma e poi si sottrae 9 per ogni volta che questo viene superato, cioè con questa formula:

=(STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2)>9

poiché il risultato logico FALSO equivale a 0, mentre il valore logico VERO ad 1, moltiplicando per 9 si avrà:

=((STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2)>9)*9

 

assemblando il tutto si otterrà il contributo delle cifre di posizione pari:

=SOMMA(STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2;-(STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2>9)*9)

 

inserendo anche la formula per l'estrazione delle cifre di posizione dispari si avrà:

=SOMMA(--STRINGA.ESTRAI(A1;{1;3;5;7;9};1);STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2;-(STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2>9)*9)

A questo punto basterà sottrarre a 10 il resto della divisione della somma per 10, se quest'ultima è maggiore di 0, altrimenti porre il risultato della formula uguale a 0, sfruttando per questo la funzione RESTO() e ricordando che RESTO("numero<10";10) è uguale a "numero<10", mentre RESTO(10;10)=0 si avrà:

=RESTO(10-RESTO(SOMMA(--STRINGA.ESTRAI(A1;{1;3;5;7;9};1);STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2;-(STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2>9)*9);10);10)

 

Che rappresenta la formula, anzi una delle formule, per ricavarsi il codice di controllo di un numero di partita IVA.

Formula per la verifica della correttezza formale del numero di partita IVA

Per verificare l'esattezza formale di un numero di partita IVA è sufficiente controllare che il codice di controllo corrisponda al risultato della formula appena vista, magari aggiungendo un controllo per il numero di caratteri che, come si è visto, devono essere 11:

Soluzione 1

=E(LUNGHEZZA(A1)=11;--DESTRA(A1;1)=RESTO(10-RESTO(SOMMA(--STRINGA.ESTRAI(A1;{1;3;5;7;9};1);STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2;-(STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2>9)*9);10);10))

 

A questa formula ci sono diverse alternative, una, interessante e che penso si possa preferire a quella appena vista, la si può ottenere sfruttando la particolarità che la somma delle cifre di posizione dispari dalla prima alla undicesima, e quelle di posizione pari dalla seconda alla  decima moltiplicate per due e diminuite di 9, se maggiori a 9, devono dare come risultato un multiplo di 10.

Per esempio:

Dal totale bisogna togliere 27 perché ci sono tre numeri superiori a 9 e si ottiene 60 che è un multiplo di 10, quindi il numero di PI è formalmente corretto.

La formula, pertanto, sarà:

Soluzione 2

=E(LUNGHEZZA(A1)=11;RESTO(SOMMA(STRINGA.ESTRAI(A1;{1;2;3;4;5;6;7;8;9;10;11};1)*{1;2;1;2;1;2;1;2;1;2;1};-(STRINGA.ESTRAI(A1;{2;4;6;8;10};1)*2>9)*9);10)=0)

 

In questa formula si è proceduto con un approccio diverso nel calcolo delle somma delle cifre di posizione dispari con il doppio di quelle di posizione pari.

La formula:

=STRINGA.ESTRAI(A1;{1;2;3;4;5;6;7;8;9;10;11};1)*{1;2;1;2;1;2;1;2;1;2;1}

 

moltiplica ogni cifra di posizione dispari per uno e ciascuna cifra di posizione pari per due restituendo il risultato che si può vedere in figura alla verifica con F9, quindi si è proceduto come per la formula precedente.

 

Al posto delle costanti di matrice si possono anche utilizzare le matrici, per esempio la seconda soluzione proposta può essere scritta anche come segue:


=E(LUNGHEZZA(A1)=11;RESTO(SOMMA(STRINGA.ESTRAI(A1;RIF.RIGA($A$1:$A$11);1)*(RESTO(RIF.RIGA($A$1:$A$11)+1;2)+1);-STRINGA.ESTRAI(A1;RIF.RIGA($A$1:$A$5)*2;1)*2>9)*9);10)=0)

matriciale da inserirsi come con Ctrl+Shift+Invio, dove RIF.RIGA($A$1:$A$11), alla verifica con F9, restituisce {1\2\3\4\5\6\7\8\9\10\11}, mentre RIF.RIGA($A$1:$A$5)*2 restituisce {2\4\6\8\10}.

Trattandosi di un numero molto limitato di elementi, solo 11, penso sia da preferirsi l'utilizzo delle costanti di matrice a quest'ultima formula che ho voluto comunque riportare per quei casi in cui si lavori con matrici di dimensioni maggiori.


Soluzione con il VBA

Di seguito è riportata una delle possibili soluzioni utilizzando il VBA.

 

Function PI1(codice) As Boolean

'Controllo dell'esattezza formale della Partita IVA
  Dim n As Integer  ' contatore
  Dim cd As Integer ' contributo cifre dispari
  Dim cp As Integer ' contributo cifre pari
  Dim ct As Integer ' contributo totale

  'controlla la lunghezza del codice
  If Len(codice) 11 Then
    PI1 = False
    Exit Function
  End If

  'controlla l'esattezza del carattere di controllo
  ct = 0
  For n = 1 To 9 Step 2
    cd = CInt(Mid(codice, n, 1))
    cp = CInt(Mid(codice, n + 1, 1)) * 2
    If cp > 9 Then cp = cp - 9
    ct = ct + cd + cp
  Next n

  If (10 - ct Mod 10) Mod 10 = CInt(Right(codice, 1)) Then
    PI1 = True
  Else
    PI1 = False
  End If

End Function

 

 


Sistema operativo: WIN32
Applicazioni: Excel 97, Excel 2000, Excel 2002/XP, Excel 2003

 

Allegati:
FileDescrizioneDimensione del File
Scarica questo file (partitaiva.pdf)partitaiva.pdfCopia dell'articolo in formato PDF46 Kb
Ultimo aggiornamento Lunedì 03 Agosto 2009 14:20