I. Qu'est-ce que le code IBAN ?▲
Voici la définition qu'en donne Wikipédia :
L'International Bank Account Number (IBAN) est une norme internationale pour numéroter les comptes bancaires. Elle permet l'identification exacte du compte et de l'établissement bancaire, ce qui facilite les virements.
Il se compose de trois parties :
II. Comment calculer l'IBAN en partant du numéro du compte bancaire d'origine ?▲
Le problème se résume à calculer le nombre de contrôle.
Ce « check digit », c'est la différence entre 98 et le reste de la division d'un certain nombre par 97 :
II-A. Convention pour convertir les lettres en chiffres▲
A vaut 10 et on ajoute 1 pour chaque suivante (Z vaut 35).
Traduit en termes de programmation : c'est le code ASCII de la lettre majuscule - 55.
Soit 66 - 55 pour le « B » et 69 - 55 pour le « E ».
Exemple pour un compte bancaire belge (BE) 210 0765974 17, « le certain nombre » vaut
210 076 597 417 111 400
(Je dis : deux cent dix billiards septante-six billions cinq cent nonante-sept milliards quatre cent dix-sept millions cent onze mille quatre cents.)
II-B. Calculer le reste de la division de ce nombre par 97 ▲
Access dispose d'un opérateur Mod qui permet de calculer le reste d'une division.
La syntaxe est :
LeReste =
LeDividende Mod
LeDiviseur
19 Mod 6 donnera 1.
Dividende et diviseur peuvent être des nombres quelconques, mais pour faire l'opération, Access va d'abord les convertir en type Entier long. C'est dire que l'opération va échouer si le dividende est plus grand que 2 147 483 647 !
III. Comment contourner la limite 2 147 483 647 pour obtenir le reste d'une division ?▲
III-A. Petit rappel de la Mat Sup : une division▲
(http://www.mathovore.fr/divisions-et-problemes-cours-maths-45.php)
Ce qui nous intéresse, c'est le reste.
L'algorithme est donc :
— on commence par le 1er chiffre gauche du dividende ;
— on calcule le reste de la division de ce chiffre par le diviseur ;
— on y inscrit à sa gauche le chiffre suivant du dividende : c'est comme si on multipliait le reste par 10 et qu'on y ajoutait le chiffre suivant ;
— on calcule le reste de la division de ce « regroupement » par le diviseur ;
— on inscrit à sa gauche le chiffre suivant du dividende et ainsi de suite, jusqu'à ce qu'on n'ait plus de chiffre à droite.
III-B. YA+K traduire en VBA !▲
Cinq lignes de code :
Function
RestePar97
(
Nbre As
String
) As
Integer
Dim
i As
Integer
RestePar97 =
0
For
i =
0
To
Len
(
Nbre) -
1
RestePar97 =
(
RestePar97 *
10
+
CInt
(
Mid
(
Nbre, i +
1
, 1
))) Mod
97
Next
i
End
Function
Exemple d'utilisation :
IV. Une fonction pour calculer l'IBAN au départ du numéro bancaire local▲
IV-A. Le code ▲
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Public
Function
BANtoIBAN
(
CodePays As
String
, BAN As
String
) As
String
Dim
i As
Integer
Dim
BaseAlpha As
String
Dim
CleControle As
String
'Base de calcul de la clé de contrôle
BaseAlpha =
BAN &
CodePays &
"00"
'Conversion des lettres
For
i =
1
To
Len
(
BaseAlpha)
If
IsNumeric
(
Mid
(
BaseAlpha, i, 1
)) Then
BANtoIBAN =
BANtoIBAN &
Mid
(
BaseAlpha, i, 1
)
Else
BANtoIBAN =
BANtoIBAN &
Asc
(
UCase
(
Mid
(
BaseAlpha, i, 1
))) -
55
End
If
Next
i
'Calcul de la clé de contrôle pays
CleControle =
98
-
RestePar97
(
BANtoIBAN)
'Retour au format par tranches de 4 caractères
BANtoIBAN =
Format
(
UCase
(
CodePays) &
Format
(
CleControle, "00"
) &
BAN, "!@@@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@@"
)
End
Function
IV-B. Commentaires du code▲
2-4 : définition de variables.
6 : on construit le squelette du code IBAN. À ce stade, il contient des lettres.
8-14 : on parcourt le squelette et on y remplace chaque lettre par son équivalent en chiffres.
16 : le nombre de contrôle est la différence entre 98 et le reste de la division par 97 de la chaîne numérique obtenue à l'étape précédente.
18 : on habille le résultat.
V. Exemples d'utilisation dans un formulaire▲
V-A. L'utilisateur introduit le code Pays et le numéro de compte local, le code IBAN s'affiche▲
Option
Compare Database
Option
Explicit
Private
Sub
txtNum_AfterUpdate
(
)
'Contrôle code Pays
If
IsNull
(
Me.txtPays
) Then
MsgBox
"Code Pays manquant"
Exit
Sub
End
If
'Aménager txtIBAN
Me.txtIBAN
=
BANtoIBAN
(
Me.txtPays
, Replace
(
Me.txtNum
, " "
, ""
))
End
Sub
V-B. L'utilisateur introduit le code IBAN, le contrôle change de couleur▲
Option
Compare Database
Option
Explicit
Private
Sub
txtIBAN_AfterUpdate
(
)
Me.txtBan
=
Replace
(
Right
(
Me.txtIBAN
, Len
(
Me.txtIBAN
) -
4
), " "
, ""
)
Me.txtPays
=
UCase
(
Left
(
Me.txtIBAN
, 2
))
Me.txtIBAN
=
UCase
(
Format
(
Replace
(
Me.txtIBAN
, " "
, ""
), _
"!@@@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@@"
))
End
Sub
C'est dans la mise en forme conditionnelle que cela se passe :
VI. Exemple de calcul pour la France▲
Le « numéro du compte » est la combinaison : code banque + code guichet + n° compte + clé du RIB :
VII. Téléchargement▲
VIII. Remerciements▲
Merci à yahiko, louvamifaly et tee_grandbois pour leurs remarques et à Malick SECK et Maxy35 pour la correction orthographique.