codice:
Private dIdx As Integer
Private valoriDigit(36, 3) As String
Private peso(26) As String
Public Function ValidCF(sCF As String) As Boolean
Dim sCD As String
Dim aCF(15) As String
Dim i As Integer
Dim l As Integer
Dim nCD As Integer
Dim blPari As Boolean
Dim totale As Integer
Dim resto As Integer
dIdx = 0
' Carico la tabella dei pesi delle cifre del CF
Call caricaDigit("A", "0", "1"): Call caricaDigit("B", "1", "0")
Call caricaDigit("C", "2", "5"): Call caricaDigit("D", "3", "7")
Call caricaDigit("E", "4", "9"): Call caricaDigit("F", "5", "13")
Call caricaDigit("G", "6", "15"): Call caricaDigit("H", "7", "17")
Call caricaDigit("I", "8", "19"): Call caricaDigit("J", "9", "21")
Call caricaDigit("K", "10", "2"): Call caricaDigit("L", "11", "4")
Call caricaDigit("M", "12", "18"): Call caricaDigit("N", "13", "20")
Call caricaDigit("O", "14", "11"): Call caricaDigit("P", "15", "3")
Call caricaDigit("Q", "16", "6"): Call caricaDigit("R", "17", "8")
Call caricaDigit("S", "18", "12"): Call caricaDigit("T", "19", "14")
Call caricaDigit("U", "20", "16"): Call caricaDigit("V", "21", "10")
Call caricaDigit("W", "22", "22"): Call caricaDigit("X", "23", "25")
Call caricaDigit("Y", "24", "24"): Call caricaDigit("Z", "25", "23")
Call caricaDigit("0", "0", "1"): Call caricaDigit("1", "1", "0")
Call caricaDigit("2", "2", "5"): Call caricaDigit("3", "3", "7")
Call caricaDigit("4", "4", "9"): Call caricaDigit("5", "5", "13")
Call caricaDigit("6", "6", "15"): Call caricaDigit("7", "7", "17")
Call caricaDigit("8", "8", "19"): Call caricaDigit("9", "9", "21")
' compongo la tabella dei pesi del Check Digit
Dim speso As String
speso = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
For i = 0 To 25
peso(i) = Mid$(speso, i + 1, 1)
Next i
' ricavo il CheckDigit
sCD = Mid$(sCF, 16)
' carico in un array le restanti cifre del CF
For i = 0 To 14
aCF(i) = Mid$(sCF, i + 1, 1)
Next i
' ricavo il peso del CheckDigit
For i = 0 To 25
If peso(i) = sCD Then
nCD = i
Exit For
End If
Next i
blPari = False
totale = 0
For i = 0 To 14
For l = 0 To 35
If valoriDigit(l, 0) = aCF(i) Then
If blPari Then
totale = totale + CInt(valoriDigit(l, 1))
Debug.Print valoriDigit(l, 0), valoriDigit(l, 1)
Else
totale = totale + CInt(valoriDigit(l, 2))
Debug.Print valoriDigit(l, 0), valoriDigit(l, 2)
End If
blPari = Not blPari
End If
Next l
Next i
resto = totale Mod 26
ValidCF = False
If resto = nCD Then ValidCF = True
End Function
Private Sub caricaDigit(sItem As String, sPari As String, sDispari As String)
valoriDigit(dIdx, 0) = sItem
valoriDigit(dIdx, 1) = sPari
valoriDigit(dIdx, 2) = sDispari
dIdx = dIdx + 1
End Sub
La funzione di controllo la richiami così :