Developpez.com

Plus de 2 000 forums
et jusqu'à 5 000 nouveaux messages par jour

Calcul du code IBAN

Comment calculer le reste d'une division lorsque le dividende est un nombre très élevé

Deux sujets seront abordés.

Qu'est-ce qu'un code IBAN et comment le calculer avec Access quand on connaît le numéro du compte dans le pays d'origine ?

Comment contourner les limites de l'opérateur Mod pour calculer le reste d'une division quand le dividende est trop grand (>2 147 483 647) ?

4 commentaires Donner une note à l'article (5) 

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 :

Image non disponible

II. Comment calculer l'IBAN partant du numéro du compte bancaire d'origine ?

Le problème se résume à calculer les chiffres 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 :

Image non disponible

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

Image non disponible

210 076 597 417 111 400

(Je dis : deux cent dix billiards septante-six billions C:\MesDocuments\MesImages\frites-salut[1].gif cinq cent nonante-sept C:\MesDocuments\MesImages\frites-salut[1].gif milliards quatre cent dix-sept millions cent onze mille quatre cents.)

II-B. Calculer le reste de la division par 97 de ce nombre

Access dispose d'un opérateur Mod qui permet de calculer le reste d'une division.

La syntaxe est :

 
Sélectionnez
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 !

Image non disponible

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

Image non disponible

(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 ajoute 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'à plus de chiffre à droite.

III-B. YA+K traduire en VBA !

Cinq lignes de code :

 
Sélectionnez
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 :

Image non disponible

IV. Une fonction pour calculer l'IBAN au départ du numéro bancaire local

IV-A.

Image non disponible

IV-B. Le code

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Function BANtoIBAN(CodePays As String, BAN As String) As String
  Dim NbrePays As String
  Dim Base As String
  Dim CleControle As String
  'Transformation CodePays en Nbre
  NbrePays = Asc(Left(UCase(CodePays), 1)) - 55 & Asc(Right(UCase(CodePays), 1)) - 55
  'Base de calcul de la clé de contrôle Pays
  Base = BAN & NbrePays & "00"
  'Calcul de la clé de contrôle pays
  CleControle = 98 - RestePar97(Base)
  'Retour au format belge
  BANtoIBAN = UCase(CodePays) & Format(CleControle, "00") & " " & Format(BAN, "@@@@ @@@@ @@@@")
End Function

IV-C. Commentaires du code

2-4 : définition de variables.

6 : on concatène les codes ASCII - 55 de la majuscule des deux lettres du code Pays.

7 : on construit le nombre qui sert de base au calcul des chiffres de contrôle.

10 : le nombre de contrôle est la différence entre 98 et le reste de la division par 97 de la base.

12 : on habille le résultat. Format(CleControle, "00") pour obtenir 02, 03… si le nombre contrôle est inférieur à 10. Format(BAN, "@@@@ @@@@ @@@@") pour présenter le N° par groupe de quatre chiffres comme c'est l'usage en Belgique.

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

Image non disponible
 
Sélectionnez
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, Me.txtNum)
End Sub

V-B. L'utilisateur introduit le code IBAN, le contrôle change de couleur

Image non disponible

C'est dans la mise en forme conditionnelle que cela se passe :

Image non disponible

VI. Téléchargement

VII. Remerciements

Merci à yahikopour ses remarques et à Malick SECK pour la correction orthographique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2014 Claude Leloup. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.