﻿Attribute VB_Name = "Modulo1"
Option Compare Database
Option Explicit

Function BBAN_Chk(b As String)
'Algoritmo di controllo del BBAN by Alexandre Rodichevski http://it.geocities.com/arodichevski/comp-bban-it.html
'traduzione VBA per Access Ronni Desideri 22 gennaio 2004
'Il BBAN deve essere una stringa di 23 caratteri, con le posizioni numerate da 0 a 22.
'Deve contenere solo lettere maiuscole dell'alfabeto latino da A a Z e cifre da 0 a 9. Inoltre,
'la posizione 0 può essere occupata esclusivamente da una lettera, mentre le posizioni da 1 a 10 esclusivamente da cifre.
'Ogni carattere è convertito in un codice da 0 a 25 secondo la seguente regola. La cifra è trasformata
'nel numero corrispondente, ad esempio 7 in 7. La lettera A si converte in 0, B in 1, ecc., Z si converte in 25.
'Viene calcolata la somma di controllo per le posizioni da 1 a 22, in modo diverso per i posti pari e quelli dispari.
'Ogni posizione pari contribuisce alla somma con il proprio codice calcolato nel punto precedente dell'algoritmo.
'Ogni posizione dispari contribuisce con una funzione del proprio codice, descritta nella seguente tabella:
'--------------------------------------------------------------------------------
'Codice     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
'Contributo 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
'--------------------------------------------------------------------------------
'Dividendo la somma di controllo per 26, si ottiene il resto che deve coincidere con il codice del carattere nella posizione 0.
'
Dim OddVal(0 To 25) As Integer
OddVal(0) = 1
OddVal(1) = 0
OddVal(2) = 5
OddVal(3) = 7
OddVal(4) = 9
OddVal(5) = 13
OddVal(6) = 15
OddVal(7) = 17
OddVal(8) = 19
OddVal(9) = 21
OddVal(10) = 2
OddVal(11) = 4
OddVal(12) = 18
OddVal(13) = 20
OddVal(14) = 11
OddVal(15) = 3
OddVal(16) = 6
OddVal(17) = 8
OddVal(18) = 12
OddVal(19) = 14
OddVal(20) = 16
OddVal(21) = 10
OddVal(22) = 22
OddVal(23) = 25
OddVal(24) = 24
OddVal(25) = 23

'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

Dim res, i, k, s, c, kcin As Integer

'la lunghezza deve essere di 23 caratteri
If Len(b) <> 23 Then
    res = MsgBox("La lunghezza è diversa da 23 caratteri!!", vbCritical, "attenzione Errore")
    BBAN_Chk = False
    Exit Function
End If
For i = 0 To 23 - 1
'converte i caratteri nell'equivalente numerico ASCII
c = Asc(Mid(b, i + 1, 1))

'calcola il codice k da 0 a 25
If c >= 48 And c <= 57 Then  ' cifre da 0 a 9
    If i = 0 Then
        res = MsgBox("il codice di controllo CIN non può essere una cifra", vbCritical, "attenzione Errore")
        BBAN_Chk = False
        Exit Function
    End If
    k = c - 48
ElseIf c >= 65 And c <= 90 Then  ' per le lettere da A-Z maiuscole
    If i >= 1 And i <= 10 Then
        res = MsgBox("ABI e CAB non possono contenere lettere", vbCritical, "attenzione Errore")
        BBAN_Chk = False
        Exit Function
    End If
    k = c - 65
Else
    res = MsgBox("ammesse solo cifre e lettere maiuscole", vbCritical, "attenzione Errore")
    BBAN_Chk = False
    Exit Function
End If

'calcola la somma di controllo
If i = 0 Then  ' caso del codice di controllo
    kcin = k
ElseIf i Mod 2 = 0 Then  ' posizione cifra pari
    s = s + k
Else  ' per le posizioni dispari il contributo è nell'array OddVal
    s = s + OddVal(k)
End If
Next i

'verifica se il resto della divisione per 26 della somma di controllo è uguale al CIN
If s Mod 26 = kcin Then
    res = MsgBox("il BBAN risulta corretto!", vbInformation, "Ok!")
    BBAN_Chk = True
    Exit Function
Else
    res = MsgBox("  BBAN errato !!", vbCritical, "attenzione Errore")
    BBAN_Chk = False
    Exit Function
End If
End Function
