Wie kann man in MS-Access ein IBAN (International Bank Account Number) berechnen?
Voraussetzungen:
Das Bsp ist ab A2000 lauffähig. (Download enthält eine mdb-Datei)
Lösung:
Dazu muss man den Aufbau der IBAN kennen. Sie steht aus max. 34 Stellen.
Einige Länder sind in der Bsp-DB enthalten.
Ausführliche Informationen hier
Dann kommt die BLZ und die Kontonummer. Diese haben je nach Land unterschiedliche Längen.
Da am Anfang die Prüffziffer unbekannt ist wird 00 eingesetzt.
DE Länderkenzzeichen
00 Prüfziffer noch unbekannt
67250020 BLZ in Deutschland immer 8 Stellen
1234560 Kontonummer (10 Stellen erforderlich, bei weniger werden die fehlenden Stellen mit führenden Nullen aufgefüllt)
1. Schritt
Die ersten 4 Stellen werden an das Ende gesetzt
2. Schritt
Die beiden Buchstaben des Länderkürzels müssen in numerische Werte umgewandelt werden.
Die Übersetzung dafür ist A=10, B=11,..., Z=35
Das Zwischenergebnis sähe so aus:
3. Schritt
Berechnung nach Modulo 97 Methode
672500200001234560131400 Mod 97
Das geht aber nicht da es zu einem Buffer Overrun kommt. VBA ist nicht in der Lage mit
solchen großen Zahlen richtig umzugehen.
Deshalb greifen wir auf eine Hilfsmethode zurück (Division großer Zahlen (9 Stellen-Methode))
Es wird der Rest der ersten 9 Stellen berechnet, also in unserem Bsp:
672500200 Mod 97
Der Rest wird diese an den Anfang des nächsten Blocks gesetzt und mit den weiteren Zahlen unseres IBAN Strings bis
zur 9. Stelle aufgefüllt usw..
Die letzte Berechnung ergibt dann die IBAN-Prüfziffer.
Die Bsp.-DB funktioniert dann folgendermaßen:
Im Modul "mod_Global" sind 2 Prozeduren und 2 globale Variablen enthalten.
'Arrayvariable für die Zuordnung des LKZ zu numerisch Public vArray(26, 2) As Variant 'Anfangswert der Prüfziffer ist 0 Public Const cPP As Integer = 0 Public Function Fill_LKZ_Array() Dim i As Integer For i = 0 To 25 vArray(i, 0) = i + 10 vArray(i, 1) = Chr(i + 65) Next i End Function Public Function SearchArray(sSearch As String) As Integer Dim i As Integer For i = 0 To 25 If vArray(i, 1) = sSearch Then SearchArray = vArray(i, 0) Exit For End If Next i End Function
Die Erste füllt beim Aufruf ein Array mit den Zuordnungen der LKZ zu den Zahlen.
Die Zweite wird dann benötigt um nach der Länderauswahl die jeweiligen Zahler aus dem Array zu ermitteln.
Die Berechnung erfolgt dann mit dem Klick auf den Button "IBAN berechnen" in dem Form:
Private Sub cmd_IBAN_Click() Dim vLetter1 As Variant, vLetter2 As Variant Dim vEmptyPP As Variant, vTempKtoNr As Variant, iKtoLength As Integer, iIBANLength As Integer Dim vTempIBAN As Variant, k As Integer, i As Integer, iRest As Integer Dim iRestLength As Integer, iAllLength As Integer, vResult As Variant '****************************************************************************** 'Prüfen ob Felder BLZ und KtoNr gefüllt sind If Me.txt_BLZ = "" Or IsNull(Me.txt_BLZ) Then MsgBox "Keine BLZ eingegeben!", vbCritical + vbOKOnly, "Fehler" Me.txt_BLZ.SetFocus Exit Sub Else If Len(Me.txt_BLZ) <> CInt(Me.cbo_Land.Column(3)) Then MsgBox "Die BLZ muss für das gewählte Land muss " & Me.cbo_Land.Column(3) & _ " Stellen haben!", vbCritical + vbOKOnly, "Fehler" Me.txt_BLZ.SetFocus Exit Sub End If End If If Me.txt_KtoNr = "" Or IsNull(Me.txt_KtoNr) Then MsgBox "Keine KtoNr eingegeben!", vbCritical + vbOKOnly, "Fehler" Me.txt_KtoNr.SetFocus Exit Sub End If '****************************************************************************** 'Prüfziffer zum Start auf 00 setzen vEmptyPP = Format(cPP, "00") 'Zuordnung der Kennzahlen des LKZ's aus dem Array vLetter1 = SearchArray(Left(Me.cbo_Land.Column(1), 1)) vLetter2 = SearchArray(Right(Me.cbo_Land.Column(1), 1)) 'Länge der KtoNr bestimmen und bei Bearf mit Nullen vorn auffüllen iKtoLength = Len(Me.txt_KtoNr) If iKtoLength < Me.cbo_Land.Column(4) Then vTempKtoNr = Format(0, String(Me.cbo_Land.Column(4) - iKtoLength, "0")) & Me.txt_KtoNr Else vTempKtoNr = Me.txt_KtoNr End If 'Aufbau der temporären IBAN und deren länge bestimmen vTempIBAN = Me.txt_BLZ & vTempKtoNr & vLetter1 & vLetter2 & vEmptyPP iIBANLength = Len(vTempIBAN) 'Anzahl der Durchläufe in 9er Schritten bestimmen da VBA nicht mit solch großen Zahlen rechnen kann k = Int(iIBANLength / 9) + 2 'Durchlaufen der temp. IBAN in 9er Schritten und berechnen der jeweiligen Prüfziffer For i = 1 To k If i = 1 Then '1. Durchlauf immer 9 Stellen iRest = Left(vTempIBAN, 9) Mod 97 iRestLength = Len(iRest) iAllLength = 9 ElseIf i = 2 Then '2. Durchlauf Anzahl der Stellen der 1. Prüfziffer und weiteren Stellen der 'temp IBAN auffüllen bis 9 Stellen iRest = (iRest & Mid(vTempIBAN, 10, 9 - iRestLength)) Mod 97 iRestLength = Len(iRest) iAllLength = iAllLength + (9 - iRestLength) Else iRest = (iRest & Mid(vTempIBAN, iAllLength + 1, 9 - iRestLength)) Mod 97 iRestLength = Len(iRest) iAllLength = iAllLength + (9 - iRestLength) 'Ist die Länge der temp. IBAN ereicht dann raus hier If iAllLength >= iIBANLength Then vResult = iRest Exit For Else vResult = iRest End If End If Next i 'Rerrechnen der Prüfziffer vResult = 98 - vResult 'Komplette IBAN anzeigen Me.txt_IBAN = Me.cbo_Land.Column(1) & Format(vResult, "00") & Me.txt_BLZ & vTempKtoNr End Sub
Das Ergebnis in unserem Fall wäre als Prüfziffern die "09"
Errechnen einer IBAN mit Access
ab A00
Ähnliche Artikel
Weiterlesen...