Modules

5.63 Funzione per verificare l'esattezza di un codice IBAN
  Riccardi Giacheri

Che cosa è l'IBAN
La sigla IBAN significa International Bank Account Number (Numero Internazionale di Conto Bancario).
Sviluppato da ISO (International Organization for Standardization) ed ECBS (European Committee for Banking Standards), lo standard IBAN è stato adottato dai principali paesi europei per una rappresentazione comune ed uniforme dei numeri di conto bancari.
Lo scopo principale dell'IBAN è di promuovere il trattamento automatizzato delle operazioni finanziarie internazionali, rendendo perciò il trasferimento di fondi tra paesi diversi più semplice ed efficiente.

Il codice IBAN è composto da una serie di caratteri alfanumerici che identificano univocamente un conto aperto presso una qualsiasi banca.
Il codice IBAN ha un massimo di 34 caratteri (la lunghezza varia da stato a stato, ma è sempre uguale per i conti presso un medesimo stato), e si compone di:

1) il codice paese, di due lettere
2) il codice di controllo dell'intero IBAN, di due cifre
3) identificativo del conto in formato nazionale (BBAN - Basic Bank Account Number), di lunghezza massima di 30 caratteri, che comprende un identificativo dell'istituzione finanziaria ove è aperto il conto ed il numero di conto vero e proprio

Il Regolamento (CE) 2560/2001 ha reso obbligatorio l'utilizzo dell'IBAN (e del BIC) da parte degli ordinanti di pagamenti all'interno dell'Unione Europea.
Importante:
solo la banca presso la quale è aperto il conto è autorizzata a fornire il codice IBAN di quel conto ed il relativo codice BIC (Bank Identifier Code).
Pertanto, per ottenere un codice IBAN è necessario contattare il titolare del conto.

Il codice IBAN italiano
Per i conti detenuti presso istituzioni finanziarie in Italia, l'IBAN ha una lunghezza fissa di 27 caratteri ed è così composto:
CAMPO                 LUNGHEZZA               TIPO                           DESCRIZIONE
------------------------------------------------------------------------------------------------------------------------------------
IT                                    2                  alfanumerico                codice paese dell'Italia
nn                                   2                  numerico                      due cifre con il codice di controllo dell'intero IBAN
x                                     1                  alfabetico                     CIN del BBAN
nnnnn                             5                  numerico                      codice ABI della banca italiana
nnnnn                             5                  numerico                      codice CAB della banca italiana
nnnnnnnnnnnn             12                  alfanumerico                numero del conto corrente
Algoritmo di controllo dell'IBAN
L'IBAN deve essere una stringa costituita di almeno 5 caratteri.
Deve contenere solo lettere maiuscole dell'alfabeto latino da A a Z e cifre da 0 a 9.
Inoltre, le posizioni 0 e 1 possono essere occupate esclusivamente da una sigla valida ISO del paese, mentre le posizioni 2 e 3 da un numero tra 00 e 96.
I primi quattro caratteri della stringa originale vengono scambiati con il resto.
Ogni carattere è convertito in un codice da 0 a 35 secondo la seguente regola.
1) La cifra è trasformata nel numero corrispondente, ad esempio 7 in 7.
2) La lettera A si converte in 10, B in 11, ecc., Z si converte in 35.
Dai numeri così ottenuti viene composta una nuova stringa numerica.
La stringa numerica viene interpretata ora come un numero.
Dividendolo per 97, si dovrebbe ottenere come resto 1.
Per facilitare la divisione dei numeri eccessivamente lunghi, è possibile spezzare la stringa numerica in parti più piccole e calcolare il resto della divisione della prima parte per 97, poi comporre nuova stringa numerica dal resto della divisione e dal secondo pezzo e dividere questo numero per 97, etc.

Si riport qui di seguito il codice VBA della funzione per verificare l'esattezza del codice IBAN:
Function fcBank_IBANChek(pstrIBan As String, pstrMsg As String) As Boolean
'----------------------------------------------------------------------------------------------------
' VERIFICA DI UN CODICE IBAN
'----------------------------------------------------------------------------------------------------
' Parametri:
'       pstrIBan = Codice IBAN da verificare
'       pstrMsg = Messaggio di risposta (solo se IBAN non è corretto !!)
'----------------------------------------------------------------------------------------------------
' Autore: Riccardo Giacheri
' Email: riccardo@giacheri.it
'----------------------------------------------------------------------------------------------------
' Funzione originale in Java estratta da :
'       http://it.geocities.com/arodichevski/comp-iban-it.html
'       Autore: Alexandre Rodichevski
'----------------------------------------------------------------------------------------------------
        Dim strIBan As String
        Dim mtrString(0 To 33)
        Dim intR As Integer
        Dim intJ As Integer
        Dim intK As Integer
        Dim varChair
        ' Controllo della lunghezza e del codice di controllo
        ' IBAN deve essere una stringa costituita di almeno 5 caratteri
        If Len(pstrIBan) < 5 Then
                pstrMsg = "La lunghezza è minore di 5 caratteri"
                Exit Function
        End If
        ' Scambio dei primi quattro caratteri con il resto
        strIBan = Mid(pstrIBan, 5) & Left(pstrIBan, 4)
        ' Memorizza srtinga e verifica caratteri consentiti
        intR = 0
        For intJ = 1 To Len(strIBan)
                mtrString(intR) = Mid(strIBan, intJ, 1)
                intR = intR + 1
        Next intJ
        ' Ciclo tra caratteri della stringa
        intR = 0
        For intJ = 0 To Len(strIBan) - 1
                ' Estrae il prossimo carattere varChair
                varChair = Asc(mtrString(intJ))
                ' Calcola il codice intK da 0 a 35
                If varChair >= 48 And varChair <= 57 Then       ' per cifra 0-9
                        ' Inoltre, le posizioni 0 e 1 possono essere occupate esclusivamente da una sigla valida ISO del paese
                        If intJ = Len(strIBan) - 4 Or intJ = Len(strIBan) - 3 Then
                                pstrMsg = "Posizioni 1 e 2 non possono contenere cifre"
                                Exit Function
                        End If
                        ' La cifra è trasformata nel numero corrispondente, ad esempio 7 in 7.
                        intK = varChair - 48
                ElseIf varChair >= 65 And varChair <= 90 Then ' per lettera A-Z
                        ' Le posizioni 2 e 3 da un numero tra 00 e 96
                        If intJ = Len(strIBan) - 2 Or intJ = Len(strIBan) - 1 Then
                                pstrMsg = "Posizioni 3 e 4 non possono contenere lettere"
                                Exit Function
                        End If
                        ' La lettera A si converte in 10, B in 11, ecc., Z si converte in 35.
                        intK = varChair - 55
                Else
                        ' IBAN deve contenere solo lettere maiuscole dell'alfabeto latino da A a Z e cifre da 0 a 9.
                        pstrMsg = "Sono ammesse solo cifre e lettere maiuscole"
                        Exit Function
                End If
                ' Controllo del codice di controllo
                If Mid(pstrIBan, 4, 2) > "96" Then
                        pstrMsg = "Il codice d controllo non può superare 96"
                        Exit Function
                End If
                ' Cumula il resto della divisione per 97
                If intK > 9 Then
                        intR = (100 * intR + intK) Mod 97
                Else
                        intR = (10 * intR + intK) Mod 97
                End If
        Next intJ
                ' Il resto della divisione deve essere 1
                If intR <> 1 Then
                        pstrMsg = "Il codice di controllo è errato"
                        Exit Function
                End If
                ' Return OK
                fcBank_IBANChek = True
End Function
Qui di seguito sono invece riportati degli esempi di richiamo della funzione fcBank_IBANChek:
'----------------------------------------------------------------------------------------------------
' VERIFICA DI UN CODICE IBAN (SUBROUTINE DI TEST)
'----------------------------------------------------------------------------------------------------
' Autore: Riccardo Giacheri
' Email: riccardo@giacheri.it
'----------------------------------------------------------------------------------------------------
        Dim strIBan As String
        Dim strMsg As String
        Dim intJ As Integer
        
        '***********
        ' ESEMPIO 1
        '***********
        ' È una stringa di 27 caratteri.
        ' Contiene solo lettere maiuscole e cifre. Le posizioni 0 e 1 sono occupate dalle lettere IT, mentre le posizioni 2 e 3 sono costituite dal numero 60.
        ' Scambiando i primi quattro caratteri con il resto, si ottiene Q0123412345000000753XYZIT60.
        ' Convertendo nella stringa numerica, a Q corrisponde 26, a 0 corrisponde 0, a 1 corrisponde 1, ecc. Il risultato finale è 260123412345000000753333435182960.
        ' Spezziamo la stringa numerica in cinque parti da almeno otto caratteri: 26012341, 23450000, 00753333, 43518296 e 0. Il resto della divisione di 26012341 per 97 è 45.
        ' Il resto della divisione di 4523450000 per 97 è 15.
        ' Il resto della divisione di 1500753333 per 97 è 82.
        ' Il resto della divisione di 8243518296 per 97 è 68.
        ' Il resto della divisione di 680 per 97 è 1.
        ' Quindi il resto della divisione è 1. Questo codice IBAN è corretto.
        intJ = 1
        strIBan = "IT60Q0123412345000000753XYZ"
        If fcBank_IBANChek(strIBan, strMsg) Then
                MsgBox "IL CODICE IBAN E' CORRETTO !!!", , intJ & " - " & strIBan
        Else
                MsgBox "IL CODICE IBAN NON E' CORRETTO !!!" & vbCrLf & vbCrLf & "Motivazione:" & vbCrLf & strMsg, , intJ & " - " & strIBan
        End If

        '**********
        ' ESEMPIO 2
        '**********
        ' Questa stringa contiene alcuni spazi (avendo il formato di stampa), quindi l'IBAN è errato.
        intJ = 2
        strIBan = "IT60 Q012 3412 3450 0000 0753 XYZ"
        If fcBank_IBANChek(strIBan, strMsg) Then
                MsgBox "IL CODICE IBAN E' CORRETTO !!!", , intJ & " - " & strIBan
        Else
                MsgBox "IL CODICE IBAN NON E' CORRETTO !!!" & vbCrLf & vbCrLf & "Motivazione:" & vbCrLf & strMsg, , intJ & " - " & strIBan
        End If
        
        '**********
        ' ESEMPIO 3
        '**********
        ' Questa stringa contiene un carattere speciale /, quindi l'IBAN è errato.
        intJ = 3
        strIBan = "IT60Q012341234500000753/XYZ"
        If fcBank_IBANChek(strIBan, strMsg) Then
                MsgBox "IL CODICE IBAN E' CORRETTO !!!", , intJ & " - " & strIBan
        Else
                MsgBox "IL CODICE IBAN NON E' CORRETTO !!!" & vbCrLf & vbCrLf & "Motivazione:" & vbCrLf & strMsg, , intJ & " - " & strIBan
        End If

        '**********
        ' ESEMPIO 4
        '**********
        ' Questo esempio è identico al primo, ad eccezione del numero di controllo 63.
        ' La stringa numerica è 260123412345000000753333435182963.
        ' Il resto della divisione di questo numero per 97 è 4.
        ' Quindi l'IBAN è errato.
        intJ = 4
        strIBan = "IT63Q0123412345000000753XYZ"
        If fcBank_IBANChek(strIBan, strMsg) Then
                MsgBox "IL CODICE IBAN E' CORRETTO !!!", , intJ & " - " & strIBan
        Else
                MsgBox "IL CODICE IBAN NON E' CORRETTO !!!" & vbCrLf & vbCrLf & "Motivazione:" & vbCrLf & strMsg, , intJ & " - " & strIBan
        End If

Download:
 
  IBAN.zip (16Kb) MSAccess97 database


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.