Private Function AlgoLuhn(ByVal sNo As String, ByVal bResult As Boolean) As Variant Dim i As Integer, iTest As Integer, iTC As Integer Dim iNo As Integer, iNo2 As Integer For i = Len(sNo) To 1 Step -1 iTest = iTest + 1 iNo = Mid(sNo, i, 1) If iTest Mod 2 <> 0 Then 'On additionne les chiffres de position paire : No 2, 4, 6, etc iTC = iTC + iNo Else 'On double les chiffres de position impaires : No 1, 3, 5, etc iNo2 = iNo * 2 If iNo2 > 9 Then 'Si Double > 9 on soustrait 9 iTC = iTC + iNo2 - 9 Else 'Si Double <= 9 on additionne iTC = iTC + iNo2 End If End If Next 'Valeur de la clefs si True, ou OK? sinon If bResult Then If iTC Mod 10 = 0 Then AlgoLuhn = 0 Else AlgoLuhn = 10 - (iTC Mod 10) End If Else If iTC Mod 10 <> 0 Then AlgoLuhn = True Else AlgoLuhn = False End If End Function
Public Function ClefNumeroSecu(NumeroSecu As Variant) As Variant Dim dNumSecu As Double Dim iReste As Integer Application.Volatile (True) If Len(NumeroSecu) > 13 Then ClefNumeroSecu = "Trop de chiffre" Exit Function End If If Len(NumeroSecu) < 13 Then ClefNumeroSecu = "Pas assez de chiffre" Exit Function End If dNumSecu = CDbl(NumeroSecu) iReste = (dNumSecu / 97 - Int(dNumSecu / 97)) * 97 ClefNumeroSecu = Format(97 - iReste, "00") End Function
Function Siren_Valide(Siren As String) As Boolean Dim Tampon_Siren As String Dim Position As Byte Dim Cumul_Siren As Integer Siren_Valide = False If Len(Siren) <> 9 Then Exit Function Tampon_Siren = "" For Position = 1 To 9 Tampon_Siren = Tampon_Siren + CStr(Val(Mid(Siren, Position, 1)) * IIf((Position Mod 2) = 0, 2, 1)) Next Position Cumul_Siren = 0 For Position = 1 To Len(Tampon_Siren) Cumul_Siren = Cumul_Siren + Val(Mid(Tampon_Siren, Position, 1)) Next Position Siren_Valide = ((Cumul_Siren Mod 10) = 0) End Function
Public Function ClefNumeroSiret(NumeroSiret As Variant) As Variant Dim dNumSiret As Double Dim iReste As Integer Application.Volatile (True) If Len(NumeroSiret) > 14 Then ClefNumeroSiret = "Trop de chiffre" Exit Function End If If Len(NumeroSiret) < 13 Then ClefNumeroSiret = "Pas assez de chiffre" Exit Function End If If Len(NumeroSiret) = 13 Then 'Ajout de 0 pour faire 14 chiffres NumeroSiret = NumeroSiret & "0" 'Renvoi la valeur de la clef ClefNumeroSiret = Format(AlgoLuhn(NumeroSiret, True), "0") Else 'Renvoi OK si la clef est correcte If AlgoLuhn(NumeroSiret, False) Then ClefNumeroSiret = "Erreur de saisie" Else ClefNumeroSiret = "No valide" End If End If End Function
Function TVA_Clef(Siren As String) As String Dim lSiren As Long Dim dTmp As Double, sTmp As String If Siren = "" Then GoTo Err_Vide If Not (IsNumeric(Siren)) Then GoTo Err_Num If Len(Siren) <> 9 Then GoTo Err_Len If Not (Siren_Valide(Siren)) Then GoTo Err_Siren On Error GoTo Err_Gen lSiren = CLng(Siren) '( ( (Siren Mod 97) *3 ) + 12 ) Mod 97 dTmp = (((lSiren Mod 97) * 3) + 12) Mod 97 sTmp = CStr(dTmp) If Len(sTmp) = 1 Then sTmp = "0" & sTmp TVA_Clef = sTmp Exit Function Err_Vide: TVA_Clef = "" Exit Function Err_Siren: TVA_Clef = "No SIREN erroné" Exit Function Err_Num: TVA_Clef = "Erreur de saisie" Exit Function Err_Len: TVA_Clef = "Nbr de chiffres erroné" Exit Function Err_Gen: TVA_Clef = Err.Number & " " & Err.Description Exit Function End Function
Pour vérifier si le numéro bancaire est correct, il faut prendre les 10 premiers chiffres, et prendre le reste de la division par 97, ce reste doit correspondre aux 2 derniers chiffres du numéro.
ex: 348-0026609-95 —> 3480026609 mod 97 = 95
CheckDigits=val(gauche(replace(n°Compte,”-”,””),10)) mod 97
Pour info, les numéro de TVA Belges fonctionnent quasi de la même façon mais avec une étape en plus.
Donc prendre les 7 premiers chiffres, faire le modulo 97 dessus, ensuite faire 97 - le modulo obtenu juste avant et on obtien 2 chiffres qui correspondent aux 2 derniers du n° de TVA.