Codice Fiscale Header

Codice Fiscale in Access

Il calcolo del codice fiscale in linguaggio VBA

Per effettuare il calcolo del codice fiscale abbiamo bisogno di una tabella dei comuni, dalla quale estrarre il codice di quello della persona fisica.
In codice VBA dobbiamo creare queste funzioni:
  • Public Function ExtractLetters(strValue As String, bCognome As Boolean) As String che ci consenta di estrarre le 3 lettere dal cognome e poi dal nome.
  • Public Function ExtractDate(strDate As String, bUomo As Boolean) As String per estrarre i valori dalla data di nascita.
  • Public Function ExtractComune(strComune As String) As String per andare a ricercare il codice fiscale del comune di nascita dalla tabella.
  • Public Function CalcCodControllo(strCodice as String) As String per calcolare il carattere di controllo con i pesi pari e dispari del codice fin qui ottenuto.

Iniziamo allora a sviluppare la prima funzione, quella per estrarre i tre caratteri dal nome e dal cognome.

 
Public Function ExtractLetters(strValue As String, bCognome As Boolean) As String
    Dim i, iVoc, iCon As Integer, strTemp, strVoc, strCon As String
    
    i = 1
    iVoc = 0
    iCon = 0
    strTemp = ""
    strVoc = ""
    strCon = ""
    
    strValue = UCase(strValue)
    
    While i <= Len(strValue)
        strTemp = Mid(strValue, i, 1)
        If Asc(strTemp) >= 65 And Asc(strTemp) <= 90 Then
            If InStr(1, "AEIOU", strTemp) Then
                iVoc = iVoc + 1
                strVoc = Trim(strVoc) + strTemp
            Else
                iCon = iCon + 1
                strCon = Trim(strCon) + strTemp
            End If
        End If
        i = i + 1
    Wend

    strTemp = ""
    If bCognome Then
        If iCon >= 3 Then
            strTemp = Left(strCon, 3)
        ElseIf iCon = 2 Then
            strTemp = strCon
            If iVoc > 1 Then
                strTemp = strTemp + Left(strVoc, 1)
            Else
                strTemp = strTemp + "*"
            End If
        ElseIf iCon = 1 Then
            strTemp = strCon
            If iVoc >= 2 Then
                strTemp = strTemp + strVoc
            ElseIf iVoc = 1 Then
                strTemp = strTemp + strVoc + "*"
            Else
                strTemp = strTemp + "**"
            End If
        Else
            If iVoc >= 3 Then
                strTemp = strVoc
            ElseIf iVoc = 2 Then
                strTemp = strVoc + "*"
            ElseIf iVoc = 1 Then
                strTemp = strVoc + "**"
            Else
                strTemp = "***"
            End If
        End If
    Else
        If iCon >= 4 Then
            strTemp = Left(strCon, 1)
            strTemp = strTemp + Mid(strCon, 3, 2)
        ElseIf iCon = 3 Then
            strTemp = strCon
        ElseIf iCon = 2 Then
            strTemp = strCon
            If iVoc > 1 Then
                strTemp = strTemp + Left(strVoc, 1)
            Else
                strTemp = strTemp + "*"
            End If
        ElseIf iCon = 1 Then
            strTemp = strCon
            If iVoc >= 2 Then
                strTemp = strTemp + strVoc
            ElseIf iVoc = 1 Then
                strTemp = strTemp + strVoc + "*"
            Else
                strTemp = strTemp + "**"
            End If
        Else
            If iVoc >= 3 Then
                strTemp = strVoc
            ElseIf iVoc = 2 Then
                strTemp = strVoc + "*"
            ElseIf iVoc = 1 Then
                strTemp = strVoc + "**"
            Else
                strTemp = "***"
            End If
        End If
    End If
    
    ExtractLetters = strTemp

End Function
 

Tra gli argomenti della funzione ritroviamo il primo che è il valore del nome o del cognome ed il secondo di tipo boolean che indica se trattare il cognome o il nome, perché come sapete nel primo caso si prendono la prima, la seconda e la terza consonante, mentre nel secondo caso si prende la prima, la seconda e la quarta.
Ora implementiamo la seconda funzione per estrarre i dati dalla data di nascita.

 
Public Function ExtractDate(strDate As String, bUomo As Boolean) As String
    
    Dim strCarMese(12), strTemp As String
    
    strTemp = ""
    
    strCarMese(1) = "A"
    strCarMese(2) = "B"
    strCarMese(3) = "C"
    strCarMese(4) = "D"
    strCarMese(5) = "E"
    strCarMese(6) = "H"
    strCarMese(7) = "L"
    strCarMese(8) = "M"
    strCarMese(9) = "P"
    strCarMese(10) = "R"
    strCarMese(11) = "S"
    strCarMese(12) = "T"

    strTemp = Right(strDate, 2)
    strTemp = strTemp + strCarMese(CInt(Mid(strDate, 4, 2)))
    
    If bUomo Then
        strTemp = strTemp + Left(strDate, 2)
    Else
        strTemp = strTemp + CStr(CInt(Left(strDate, 2)) + 40)
    End If
    
    ExtractDate = strTemp
    
End Function
 

Questa funzione è semplice da capire, si prendono le ultime due cifre dall'anno di nascita, una lettera corrispondente al mese ed infine il giorno di nascita che nel caso delle donne viene aumentato di 40 unità. Ora sviluppiamo un'altra funzione per estrarre il codice fiscale dal comune di nascita, in questo caso dovremo collegarci alla tabella e poi trovare il comune corrispondente.

 
Public Function ExtractComune(strComune As String) As String

    Dim strTemp As String, myData As DAO.Database, myrec As DAO.Recordset
    
    strTemp = "SELECT CF FROM Comuni WHERE IDComune = " & strComune
    
    Set myData = CurrentDb
    Set myrec = myData.OpenRecordset(strTemp)
    
    strTemp = ""
    If Not myrec.EOF Then
        strTemp = myrec!CF
    End If
    
    myrec.Close
    Set myrec = Nothing
    Set myData = Nothing
    
    ExtractComune = strTemp

End Function
 

Anche nel caso di questa funzione il compito è semplice, basta aprire la tabella dei "Comuni" e con una query trovare il valore che è stato inviato tramite argomento della funzione. Infine dobbiamo implementare la funzione che calcola il carattere di controllo dai primi 15 trovati, ecco come fare.

 
Public Function GetPesiPari(strVal As String) As Integer
    Dim iTemp As Integer
    
    If Asc(strVal) >= Asc("0") And Asc(strVal) <= Asc("9") Then
         iTemp = Asc(strVal) - Asc("0")
    ElseIf Asc(strVal) >= Asc("A") And Asc(strVal) <= Asc("Z") Then
        iTemp = Asc(strVal) - Asc("A")
    End If
    
    GetPesiPari = iTemp

End Function

Public Function GetPesiDispari(strVal As String) As Integer
    Dim vPesiDispari As Variant, iTemp As Integer

    vPesiDispari = Array("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")

    If Asc(strVal) >= Asc("0") And Asc(strVal) <= Asc("9") Then
        iTemp = vPesiDispari(Asc(strVal) - Asc("0"))
    ElseIf Asc(strVal) >= Asc("A") And Asc(strVal) <= Asc("Z") Then
        iTemp = vPesiDispari(Asc(strVal) - Asc("A") + 10)
    End If
    
    GetPesiDispari = iTemp

End Function

Public Function CalcCodControllo(strVal As String) As String
    Dim i, iWeightPari, iWeightDispari As Integer, strTemp As String

    iWeightPari = 0
    iWeightDispari = 0
    
    i = 2
    While i <= 14
        strTemp = Mid(strVal, i, 1)
        iWeightPari = iWeightPari + GetPesiPari(strTemp)
        i = i + 2
    Wend

    i = 1
    While i <= 15
        strTemp = Mid(strVal, i, 1)
        iWeightDispari = iWeightDispari + GetPesiDispari(strTemp)
        i = i + 2
    Wend

    iWeightPari = iWeightPari + iWeightDispari

    strTemp = Chr(65 + (iWeightPari Mod 26))
    
    CalcCodControllo = strTemp

End Function
 

In effetti sono 3 funzioni, questo perché calcolare i pesi pari e dispari è un'operazione che dobbiamo fare più volte, ecco che allora è meglio suddividere i compiti elementari. Ora non ci resta che richiamare tutte le funzioni implementate finora per trovare il valore del codice fiscale della persona fisica.

 
If Uomo.Value = 1 Then
	bUomo = True
Else
    bUomo = False
End If
    
strCognome = ""
strNome = ""
strComune = ""
strCodFisc = ""
    
If Not IsNull(editCognome.Value) Then strCognome = ExtractLetters(editCognome.Value, True)
If Not IsNull(editNome.Value) Then strNome = ExtractLetters(editNome.Value, False)
If Not IsNull(editData.Value) Then strData = ExtractDate(editData.Value, bSex)
If Not IsNull(editComune.Value) Then strComune = ExtractComune(editComune.Value)
strCodFisc = strCognome + strNome + strData + strComune
If Len(strCodFisc) = 15 Then
    strCodFisc = strCodFisc + GetControlChar(strCodFisc)
Else
    strCodFisc = "ERRORE"
End If
 

Dopo aver creato una form con tutti i controlli per richiedere i dati all'utente ( nome e cognome, data di nascita, se uomo o donna ed il comune di nascita ) prendiamo i valori inseriti e facciamo il calcolo del codice fiscale tramite le nostre funzioni sviluppate in precedenza.
Trovare il codice fiscale delle persone fisiche non è un'operazione molto complicata, forse l'unica funzione un po' più difficile da implementare è quella del calcolo del carattere di controllo, per il resto sembra tutto molto semplice ed intuitivo. Se comunque non conoscete bene il linguaggio VBA potete sempre scaricare la nostra applicazione completa in MS Access® che fa il calcolo del codice fiscale ed anche il processo inverso, ossia che dal codice fiscale si arriva a conoscere i dati anagrafici.

Ritorna all'indice degli argomenti -> Vai a pagina web



RGPSoft su Facebook RGPSoft su Google+ RGPSoft su Twitter RGPSoft su LinkedIn


Pubblicità - Norme sulla privacy - Contatti
Tutti i contenuti di questo sito sono di proprietà di RGPSoft di Rossi Giampaolo 1996 - 2017 P.IVA 01776350561