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 correnteAlgoritmo 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 FunctionQui 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: |