{"id":55001618,"date":"2026-10-01T00:00:00","date_gmt":"2026-10-05T19:31:00","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1618"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Pruefziffern_per_VBA_berechnen_und_pruefen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/","title":{"rendered":"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/9bab2a049d90456d94a7aff2eed23989\" width=\"1\" height=\"1\" alt=\"\"><b>Im Beitrag &#8222;Regul&auml;re Ausdr&uuml;cke in VBA, Teil 2: Praxis-Rezepte&#8220; (www.access-im-unternehmen.de\/1617) haben wir mit einem regul&auml;ren Ausdruck gepr&uuml;ft, ob eine IBAN formal richtig aufgebaut ist. Das sch&uuml;tzt aber nur vor groben Schnitzern &#8211; ein Zahlendreher in der Kontonummer geht anstandslos durch. Genau daf&uuml;r gibt es Pr&uuml;fziffern: eine oder zwei zus&auml;tzliche Stellen, aus den &uuml;brigen berechnet, die beim Vertippen fast immer nicht mehr passen. Dieser Beitrag zeigt die Verfahren hinter IBAN, ISBN, GTIN, Kreditkartennummer und Umsatzsteuer-Identifikationsnummer und liefert sie als fertige Funktionen, die Sie in Formularen und Abfragen einsetzen k&ouml;nnen.<\/b><\/p>\n<h2>Was eine Pr&uuml;fziffer leistet &#8211; und was nicht<\/h2>\n<p>Eine Pr&uuml;fziffer enth&auml;lt redundante Information. Sie enth&auml;lt keine neue Information, sondern bildet in verdichteter Form ab, was in den &uuml;brigen Stellen bereits enthalten ist. Weicht sie ab, war ein Fehler im Spiel.<\/p>\n<p>Die g&auml;ngigen Verfahren erkennen einzelne falsch eingegebene Ziffern und viele typische Zahlendreher. Welche Fehler garantiert erkannt werden, h&auml;ngt jedoch vom jeweiligen Verfahren ab: Das f&uuml;r die GTIN verwendete Modulo-10-Verfahren l&auml;sst beispielsweise bestimmte Vertauschungen benachbarter Ziffern unentdeckt, w&auml;hrend die Modulo-11- und Modulo-97-Verfahren hier strenger sind.<\/p>\n<p>Was eine Pr&uuml;fziffer dagegen <b>nicht<\/b> leistet: Sie sagt nichts dar&uuml;ber aus, ob es das Konto, das Buch oder die Firma tats&auml;chlich gibt. Eine IBAN mit korrekter Pr&uuml;fziffer kann problemlos frei erfunden sein.<\/p>\n<p>Und sie ersetzt auch nicht die Formatpr&uuml;fung &#8211; beide Schritte geh&ouml;ren zusammen.<\/p>\n<h2>Das gemeinsame Muster<\/h2>\n<p>So unterschiedlich die Verfahren im Detail sind, der Ablauf ist immer derselbe. Erst wird der Wert normalisiert, dann die Struktur gepr&uuml;ft und zuletzt gerechnet. Beim Normalisieren d&uuml;rfen allerdings <b>nur die f&uuml;r den jeweiligen Nummerntyp zul&auml;ssigen Trennzeichen entfernt werden<\/b>. Alle anderen Zeichen m&uuml;ssen zur Ablehnung der Eingabe f&uuml;hren.<\/p>\n<p>Das klingt nach Erbsenz&auml;hlerei, ist aber sicherheitsrelevant. Eine Funktion, die unterschiedslos jedes nicht alphanumerische Zeichen wegwirft, w&uuml;rde die Eingabe <b>DE89!3704 0044 0532 0130 00<\/b> klaglos als g&uuml;ltige IBAN durchwinken &#8211; das Ausrufezeichen verschwindet ja vor der Pr&uuml;fung. F&uuml;r eine Validierung ist das zu gro&szlig;z&uuml;gig.<\/p>\n<p>Wir trennen deshalb in zwei Schritte. Zuerst eine Funktion, die tats&auml;chlich nur Ziffern und Gro&szlig;buchstaben &uuml;brig l&auml;sst &#8211; siehe Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>NurAlphanumerisch(ByVal strWert<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strZeichen<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strErgebnis<span style=\"color:blue;\"> As String<\/span>\r\n    For lngPos = 1 To <span style=\"color:blue;\">Len<\/span>(strWert)\r\n        strZeichen = UCase(<span style=\"color:blue;\">Mid<\/span>(strWert, lngPos, 1))\r\n        Select Case Asc(strZeichen)\r\n            <span style=\"color:blue;\">Case <\/span>48 To 57, 65 To 90\r\n                strErgebnis = strErgebnis & strZeichen\r\n        <span style=\"color:blue;\">End Select<\/span>\r\n    <span style=\"color:blue;\">Next<\/span> lngPos\r\n    NurAlphanumerisch = strErgebnis\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Entfernen aller Trenn- und Sonderzeichen<\/span><\/b><\/p>\n<p>Ein Aufruf im Direktbereich zeigt, was die Funktion tut:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> NurAlphanumerisch(\"DE89 3704 0044\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> NurAlphanumerisch(\"0-8044-2957-x\")<\/pre>\n<p>Ergebnis:<\/p>\n<pre>DE8937040044\r\n080442957X<\/pre>\n<p>Die Pr&uuml;fung &uuml;ber die ASCII-Codes der Zeichen statt &uuml;ber einen Vergleich der Buchstaben ist beabsichtigt. Unter <b>Option Compare Database<\/b> w&uuml;rde ein Ausdruck wie <b>strZeichen >= &#8222;A&#8220;<\/b> auch Umlaute einschlie&szlig;en, was hier unerw&uuml;nscht w&auml;re.<\/p>\n<p>Und dar&uuml;ber liegt eine zweite Funktion, die zuerst kontrolliert, ob im Rohwert &uuml;berhaupt nur erlaubte Zeichen vorkommen. Ist das nicht der Fall, liefert sie einen Leerstring zur&uuml;ck &#8211; und jede nachfolgende Strukturpr&uuml;fung schl&auml;gt fehl:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>Bereinigt( _\r\n        ByVal strWert<span style=\"color:blue;\"> As String<\/span>, _\r\n        ByVal strErlaubt<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> RegExTest(strWert, strErlaubt)<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n    Bereinigt = NurAlphanumerisch(strWert)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Der Unterschied wird sofort sichtbar. Die eckigen Klammern im Aufruf dienen nur dazu, den Leerstring im Direktbereich erkennbar zu machen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> \"[\" & Bereinigt(\"DE89 3704\", _\r\n    \"^[A-Z0-9 ]+$\") & \"]\"\r\n<span style=\"color:blue;\">Debug.Print<\/span> \"[\" & Bereinigt(\"DE89!3704\", _\r\n    \"^[A-Z0-9 ]+$\") & \"]\"<\/pre>\n<p>Ergebnis:<\/p>\n<pre>[DE893704]\r\n[]<\/pre>\n<p>Welche Trennzeichen erlaubt sind, entscheidet jedes Verfahren f&uuml;r sich: bei der IBAN nur Leerzeichen, bei ISBN und GTIN zus&auml;tzlich Bindestriche. Die Funktion <b>RegExTest<\/b> stammt aus dem vorigen Beitrag dieser Reihe; wer sie nicht zur Hand hat, kann die Vorpr&uuml;fung auch mit einer Schleife &uuml;ber die Zeichen erledigen.<\/p>\n<h2>Rechnen ohne &Uuml;berlauf: das Modulo-97-Verfahren<\/h2>\n<p>Die IBAN verwendet ein Verfahren, das auf den ersten Blick in VBA gar nicht umsetzbar scheint. Man ersetzt jeden Buchstaben durch eine zweistellige Zahl, h&auml;ngt die ersten vier Zeichen hinten an und bildet vom Ergebnis den Rest bei der Division durch 97. Das Problem: Bei einer deutschen IBAN entsteht dabei eine Zahl mit &uuml;ber 20 Stellen.<\/p>\n<p>Ein <b>Long<\/b> reicht nur bis 2.147.483.647, und ein <b>Double<\/b> kann sehr lange Ganzzahlen nicht mehr zifferngenau darstellen.<\/p>\n<p>Der Ausweg ist so einfach wie elegant. Statt die ganze Zahl zu bilden, arbeiten wir uns Ziffer f&uuml;r Ziffer vor und nehmen nach jedem Schritt den Rest. Weil dieser h&ouml;chstens 96 sein kann, bleibt der Zwischenwert immer unter 970 und passt damit m&uuml;helos in ein <b>Long<\/b> (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Modulo97(ByVal strZiffern<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngRest<span style=\"color:blue;\"> As Long<\/span>\r\n    For lngPos = 1 To <span style=\"color:blue;\">Len<\/span>(strZiffern)\r\n        lngRest = (lngRest * 10 + CLng(<span style=\"color:blue;\">Mid<\/span>(strZiffern, lngPos, 1))) <span style=\"color:blue;\">Mod<\/span> 97\r\n    <span style=\"color:blue;\">Next<\/span> lngPos\r\n    Modulo97 = lngRest\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Rest der Division durch 97 f&uuml;r beliebig lange Zahlen<\/span><\/b><\/p>\n<p>Dass die Funktion auch mit Zahlen umgeht, die kein VBA-Datentyp mehr fassen kann, l&auml;sst sich leicht nachpr&uuml;fen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Modulo97(\"100\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> Modulo97(\"12345678901234567890\")<\/pre>\n<p>Ergebnis:<\/p>\n<pre>3\r\n3<\/pre>\n<p>Dieses schrittweise Vorgehen l&auml;sst sich auf jeden Modulus &uuml;bertragen &#8211; die Funktion selbst ist allerdings fest auf 97 programmiert.<\/p>\n<p>Merken Sie sich das Muster unabh&auml;ngig vom Thema Pr&uuml;fziffern: Es ist immer dann Gold wert, wenn Sie mit Zahlen jenseits der VBA-Grenzen hantieren m&uuml;ssen.<\/p>\n<h2>Rezept 1: Die IBAN<\/h2>\n<p>Nun die Umsetzung der Zeichen in Ziffern. Buchstaben werden dabei durch ihre Position im Alphabet plus 9 ersetzt, also A durch 10 bis Z durch 35. Da der Zeichencode von A bei 65 liegt, gen&uuml;gt eine Subtraktion von 55 (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IbanInZiffern(ByVal strIban<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strUmgestellt<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngCode<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strErgebnis<span style=\"color:blue;\"> As String<\/span>\r\n    ' Die ersten vier Zeichen wandern ans Ende\r\n    strUmgestellt = <span style=\"color:blue;\">Mid<\/span>(strIban, 5) & <span style=\"color:blue;\">Left<\/span>(strIban, 4)\r\n    For lngPos = 1 To <span style=\"color:blue;\">Len<\/span>(strUmgestellt)\r\n        lngCode = Asc(<span style=\"color:blue;\">Mid<\/span>(strUmgestellt, lngPos, 1))\r\n        <span style=\"color:blue;\">If <\/span>lngCode &gt;= 48 And lngCode &lt;= 57<span style=\"color:blue;\"> Then<\/span>\r\n            strErgebnis = strErgebnis & Chr(lngCode)\r\n        <span style=\"color:blue;\">Else<\/span>\r\n            strErgebnis = strErgebnis & CStr(lngCode - 55)\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">Next<\/span> lngPos\r\n    IbanInZiffern = strErgebnis\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Umsetzen der IBAN in eine reine Ziffernfolge<\/span><\/b><\/p>\n<p>Damit l&auml;sst sich das Verfahren Schritt f&uuml;r Schritt nachvollziehen. Das D wird zu 13, das E zu 14, und der Rest muss am Ende 1 ergeben:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IbanInZiffern(\"DE89370400440532013000\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> Modulo97( _\r\n    IbanInZiffern(\"DE89370400440532013000\"))\r\n370400440532013000131489\r\n1<\/pre>\n<p>Damit ist die eigentliche Pr&uuml;ffunktion kurz. Der Rest muss am Ende genau 1 betragen &#8211; das ist die Kernaussage des Verfahrens nach ISO 7064, das wir in der Funktion <b>IstIban <\/b>abgebildet haben (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstIban(ByVal strIban<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strWert<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngLaenge<span style=\"color:blue;\"> As Long<\/span>\r\n    ' Erlaubt sind nur Buchstaben, Ziffern, Leerzeichen\r\n    strWert = Bereinigt(strIban, \"^[A-Z0-9 ]+$\")\r\n    ' Grundstruktur pruefen\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> RegExTest(strWert, \"^[A-Z]{2}\\d{2}[A-Z0-9]{11,30}$\")<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">Exit Function<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    ' Land muss bekannt und die Laenge korrekt sein\r\n    lngLaenge = IbanLaenge(<span style=\"color:blue;\">Left<\/span>(strWert, 2))\r\n    <span style=\"color:blue;\">If <\/span>lngLaenge = 0<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strWert) &lt;&gt; lngLaenge<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n    IstIban = (Modulo97(IbanInZiffern(strWert)) = 1)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Pr&uuml;fen einer IBAN<\/span><\/b><\/p>\n<p>Vier Aufrufe zeigen, welche Fehler die Funktion abf&auml;ngt:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IstIban(\"DE89 3704 0044 0532 0130 00\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstIban(\"DE89 3704 0044 0532 0130 01\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstIban(\"DE89!3704 0044 0532 0130 00\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstIban(\"XX89 3704 0044 0532 0130 00\")\r\nWahr\r\nFalsch\r\nFalsch\r\nFalsch<\/pre>\n<p>Der zweite Aufruf scheitert an der Pr&uuml;fziffer, der dritte am eingeschmuggelten Ausrufezeichen und der vierte am unbekannten L&auml;ndercode.<\/p>\n<p>Die L&auml;ngenpr&uuml;fung ist wichtiger, als sie aussieht. Ohne sie w&uuml;rde eine deutsche IBAN, bei der eine Ziffer fehlt, unter Umst&auml;nden trotzdem als g&uuml;ltig durchgehen, weil das Modulo-Verfahren die L&auml;nge nicht kennt. Die Zuordnung von Land zu L&auml;nge erledigt eine schlichte Fallunterscheidung, die wir in der Funktion <b>IbanLaenge<\/b> erledigen (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IbanLaenge(ByVal strLand<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n    Select Case UCase(strLand)\r\n        <span style=\"color:blue;\">Case <\/span>\"DE\", \"GB\", \"BG\": IbanLaenge = 22\r\n        <span style=\"color:blue;\">Case <\/span>\"AT\", \"LT\", \"LU\", \"EE\": IbanLaenge = 20\r\n        <span style=\"color:blue;\">Case <\/span>\"CH\", \"LI\", \"HR\": IbanLaenge = 21\r\n        <span style=\"color:blue;\">Case <\/span>\"FR\", \"IT\", \"GR\": IbanLaenge = 27\r\n        <span style=\"color:blue;\">Case <\/span>\"ES\", \"SE\", \"CZ\", \"SK\", \"RO\": IbanLaenge = 24\r\n        <span style=\"color:blue;\">Case <\/span>\"NL\", \"DK\", \"FI\": IbanLaenge = 18\r\n        <span style=\"color:blue;\">Case <\/span>\"BE\": IbanLaenge = 16\r\n        <span style=\"color:blue;\">Case <\/span>\"NO\": IbanLaenge = 15\r\n        <span style=\"color:blue;\">Case <\/span>\"SI\": IbanLaenge = 19\r\n        <span style=\"color:blue;\">Case <\/span>\"PT\": IbanLaenge = 25\r\n        <span style=\"color:blue;\">Case <\/span>\"TR\": IbanLaenge = 26\r\n        <span style=\"color:blue;\">Case <\/span>\"PL\", \"HU\": IbanLaenge = 28\r\n        <span style=\"color:blue;\">Case Else<\/span>: IbanLaenge = 0\r\n    <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Ermitteln der L&auml;nge einer IBAN<\/span><\/b><\/p>\n<p>Die Funktion liefert zum Beispiel folgende Ergebnisse:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IbanLaenge(\"DE\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IbanLaenge(\"CH\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IbanLaenge(\"US\")<\/pre>\n<p>Ergebnisse:<\/p>\n<pre>22\r\n21\r\n0<\/pre>\n<p>Der R&uuml;ckgabewert <b>0 <\/b>bedeutet, dass das Land von der Funktion nicht unterst&uuml;tzt wird. Die IBAN wird in diesem Fall abgelehnt, weil ihre vorgeschriebene L&auml;nge nicht gepr&uuml;ft werden kann &#8211; sonst k&ouml;nnte eine formal passende Nummer mit einem gar nicht vergebenen L&auml;ndercode als g&uuml;ltig durchgehen.<\/p>\n<p>Die Liste deckt die f&uuml;r den deutschsprachigen Raum wichtigsten L&auml;nder ab. Insgesamt gibt es rund 80 IBAN-L&auml;nder; die vollst&auml;ndige und verbindliche Aufstellung pflegt die Organisation SWIFT im sogenannten IBAN-Register. Wenn Sie international arbeiten, erg&auml;nzen Sie die Liste entsprechend &#8211; oder lagern sie in eine Tabelle aus.<\/p>\n<p>Der umgekehrte Weg ist ebenso n&uuml;tzlich: aus L&auml;ndercode und der bereits zusammengesetzten nationalen Kontokennung, der BBAN, die vollst&auml;ndige IBAN erzeugen. Dazu setzt man wie in der Funktion <b>IbanErzeugen <\/b>aus Listing 6 zun&auml;chst zwei Nullen als Platzhalter ein und zieht den ermittelten Rest von 98 ab:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IbanErzeugen(ByVal strLand<span style=\"color:blue;\"> As String<\/span>, ByVal strBban<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strRoh<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngLaenge<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngRest<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strPruefziffern<span style=\"color:blue;\"> As String<\/span>\r\n    strLand = UCase(Bereinigt(strLand, \"^[A-Z]{2}$\"))\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strLand) &lt;&gt; 2<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n    lngLaenge = IbanLaenge(strLand)\r\n    <span style=\"color:blue;\">If <\/span>lngLaenge = 0<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n    strBban = Bereinigt(strBban, \"^[A-Z0-9 ]+$\")\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBban) &lt;&gt; lngLaenge - 4<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n    <span style=\"color:blue;\">If <\/span>strLand = \"DE\"<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> RegExTest(strBban, \"^\\d{18}$\")<span style=\"color:blue;\"> Then<\/span>\r\n            <span style=\"color:blue;\">Exit Function<\/span>\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    strRoh = strLand & \"00\" & strBban\r\n    lngRest = Modulo97(IbanInZiffern(strRoh))\r\n    strPruefziffern = Format(98 - lngRest, \"00\")\r\n    IbanErzeugen = strLand & strPruefziffern & strBban\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Erzeugen einer IBAN aus L&auml;ndercode und BBAN<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IbanErzeugen(\"DE\", _\r\n    \"3704 0044 0532 0130 00\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> \"[\" & IbanErzeugen( _\r\n    \"DE\", \"370400440532013\") & \"]\"<\/pre>\n<p>Ergebnisse:<\/p>\n<pre>DE89370400440532013000\r\n[]<\/pre>\n<p>Der zweite Aufruf liefert einen Leerstring, weil die &uuml;bergebene BBAN nur 15 statt 18 Stellen hat.<\/p>\n<p>Beachten Sie, dass die Funktion keine Bankleitzahl und Kontonummer entgegennimmt, sondern die bereits korrekt zusammengesetzte BBAN. Wie diese aufgebaut ist, legt jedes Land selbst fest. In Deutschland besteht sie aus der achtstelligen Bankleitzahl und der Kontonummer, die dabei <b>links mit f&uuml;hrenden Nullen<\/b> auf zehn Stellen aufgef&uuml;llt werden muss.<\/p>\n<p>F&uuml;r die Bankleitzahl 37040044 und die Kontonummer 532013000 ergibt das die BBAN <b>370400440532013000<\/b>, und der Aufruf <b>IbanErzeugen(&#8222;DE&#8220;, &#8222;370400440532013000&#8220;)<\/b> liefert die IBAN <b>DE89370400440532013000<\/b>.<\/p>\n<p>Die Funktion berechnet die IBAN-Pr&uuml;fziffer, validiert aber nicht den landesspezifischen Aufbau der BBAN. F&uuml;r Deutschland m&uuml;sste zus&auml;tzlich gepr&uuml;ft werden, ob die BBAN ausschlie&szlig;lich aus 18 Ziffern besteht &#8211; genau das erledigt die Abfrage auf den L&auml;ndercode im Listing. F&uuml;r andere L&auml;nder w&auml;ren entsprechende Regeln zu erg&auml;nzen, denn manche BBAN-Formate enthalten tats&auml;chlich Buchstaben.<\/p>\n<h2>Rezept 2: ISBN-10<\/h2>\n<p>Bis Ende 2006 wurden ISBNs zehnstellig vergeben; seit 2007 werden ausschlie&szlig;lich dreizehnstellige ISBNs verwendet. Bei &auml;lteren B&uuml;chern begegnet Ihnen deshalb h&auml;ufig noch die ISBN-10. Ihr Verfahren arbeitet mit dem Modulus 11 und gewichtet jede Stelle mit ihrer Position. Die Summe aller zehn gewichteten Ziffern muss glatt durch 11 teilbar sein.<\/p>\n<p>Weil ein Rest von 10 auftreten kann, dieser aber nicht in eine Ziffer passt, wird er als <b>X<\/b> geschrieben. Das ist der Grund f&uuml;r die auf den ersten Blick verwunderlichen ISBN-Nummern, die mit einem Buchstaben enden.<\/p>\n<p>Die Funktion zum Pr&uuml;fen einer ISBN namens <b>IstIsbn10 <\/b>finden wir in Listing 7. Hier sind Beispiele zu dieser Funktion:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstIsbn10(ByVal strIsbn<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strWert<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngZiffer<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngSumme<span style=\"color:blue;\"> As Long<\/span>\r\n    ' Ziffern, X sowie Bindestrich und Leerzeichen\r\n    strWert = Bereinigt(strIsbn, \"^[0-9X \\-]+$\")\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> RegExTest(strWert, \"^\\d{9}[\\dX]$\")<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">Exit Function<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    For lngPos = 1 To 10\r\n        <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Mid<\/span>(strWert, lngPos, 1) = \"X\"<span style=\"color:blue;\"> Then<\/span>\r\n            lngZiffer = 10\r\n        <span style=\"color:blue;\">Else<\/span>\r\n            lngZiffer = CLng(<span style=\"color:blue;\">Mid<\/span>(strWert, lngPos, 1))\r\n        <span style=\"color:blue;\">End If<\/span>\r\n        lngSumme = lngSumme + lngPos * lngZiffer\r\n    <span style=\"color:blue;\">Next<\/span> lngPos\r\n    IstIsbn10 = (lngSumme <span style=\"color:blue;\">Mod<\/span> 11 = 0)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Pr&uuml;fen einer zehnstelligen ISBN<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IstIsbn10(\"0-306-40615-2\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstIsbn10(\"0-8044-2957-X\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstIsbn10(\"0-306-40615-3\")<\/pre>\n<p>Ergebnisse:<\/p>\n<pre>Wahr\r\nWahr\r\nFalsch<\/pre>\n<p>Der zweite Aufruf zeigt eine ISBN mit dem X als Pr&uuml;fziffer, der dritte dieselbe Nummer wie der erste mit einer verf&auml;lschten letzten Stelle.<\/p>\n<p>Das X darf ausschlie&szlig;lich an der letzten Stelle stehen, was das Muster im regul&auml;ren Ausdruck bereits sicherstellt.<\/p>\n<h2>Rezept 3: GTIN und ISBN-13<\/h2>\n<p>Die Identifikationsnummern GTIN-8, GTIN-12, GTIN-13 und GTIN-14 sowie die heutige ISBN-13 verwenden dasselbe Pr&uuml;fziffernverfahren. GS1 bezeichnet die Varianten heute durchg&auml;ngig als GTIN; die &auml;ltere Bezeichnung EAN begegnet Ihnen in &auml;lteren Datenbest&auml;nden aber weiterhin. Und noch eine Unterscheidung lohnt sich: Die GTIN ist die Nummer, der Strichcode lediglich ihr grafischer Datentr&auml;ger.<\/p>\n<p>Bei diesem Verfahren werden die Stellen abwechselnd mit 1 und 3 gewichtet, und zwar so, dass die Stelle unmittelbar links von der Pr&uuml;fziffer das Gewicht 3 erh&auml;lt.<\/p>\n<p>Die Pr&uuml;fziffer f&uuml;llt die Summe dann auf das n&auml;chste Vielfache von 10 auf.<\/p>\n<p>Die Z&auml;hlung von rechts ist entscheidend, weil die Nummern unterschiedlich lang sind. Wer stattdessen von links mit 1 beginnt, erh&auml;lt bei der GTIN-8 ein falsches Ergebnis. Wir berechnen die Pr&uuml;fziffer deshalb in einer eigenen Funktion namens <b>GtinPruefziffer<\/b> (siehe Listing 8).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GtinPruefziffer(ByVal strNutzdaten<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngLaenge<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngGewicht<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngSumme<span style=\"color:blue;\"> As Long<\/span>\r\n    lngLaenge = <span style=\"color:blue;\">Len<\/span>(strNutzdaten)\r\n    For lngPos = lngLaenge To 1 Step -1\r\n        <span style=\"color:blue;\">If <\/span>(lngLaenge - lngPos) <span style=\"color:blue;\">Mod<\/span> 2 = 0<span style=\"color:blue;\"> Then<\/span>\r\n            lngGewicht = 3\r\n        <span style=\"color:blue;\">Else<\/span>\r\n            lngGewicht = 1\r\n        <span style=\"color:blue;\">End If<\/span>\r\n        lngSumme = lngSumme + lngGewicht _\r\n            * CLng(<span style=\"color:blue;\">Mid<\/span>(strNutzdaten, lngPos, 1))\r\n    <span style=\"color:blue;\">Next<\/span> lngPos\r\n    GtinPruefziffer = CStr((10 - (lngSumme <span style=\"color:blue;\">Mod<\/span> 10)) <span style=\"color:blue;\">Mod<\/span> 10)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Berechnen der Pr&uuml;fziffer f&uuml;r eine GTIN<\/span><\/b><\/p>\n<p>Die Funktion ist auch f&uuml;r sich genommen n&uuml;tzlich, etwa wenn Sie eigene Artikelnummern vergeben und die Pr&uuml;fziffer selbst anh&auml;ngen m&uuml;ssen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> GtinPruefziffer(\"978030640615\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> GtinPruefziffer(\"400638133393\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> GtinPruefziffer(\"9638507\")<\/pre>\n<p>Ergebnisse:<\/p>\n<pre>7\r\n1\r\n4<\/pre>\n<p>Das &auml;u&szlig;ere <b>Mod 10<\/b> um die Differenz ist kein Sch&ouml;nheitsfehler, sondern n&ouml;tig: Geht die Summe glatt auf, w&auml;re das Ergebnis sonst 10 statt 0.<\/p>\n<p>Die Pr&uuml;ffunktion IstGtin aus Listing 9 vergleicht dann einfach mit der letzten Stelle:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstGtin(ByVal strCode<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strWert<span style=\"color:blue;\"> As String<\/span>\r\n    strWert = Bereinigt(strCode, \"^[0-9 \\-]+$\")\r\n    ' Zulaessige Laengen der GTIN-Varianten\r\n    Select Case <span style=\"color:blue;\">Len<\/span>(strWert)\r\n        <span style=\"color:blue;\">Case <\/span>8, 12, 13, 14\r\n        <span style=\"color:blue;\">Case Else<\/span>\r\n            <span style=\"color:blue;\">Exit Function<\/span>\r\n    <span style=\"color:blue;\">End Select<\/span>\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> RegExTest(strWert, \"^\\d+$\")<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n    IstGtin = (<span style=\"color:blue;\">Right<\/span>(strWert, 1) = GtinPruefziffer(<span style=\"color:blue;\">Left<\/span>(strWert, <span style=\"color:blue;\">Len<\/span>(strWert) - 1)))\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Pr&uuml;fen von GTIN-8, GTIN-12, GTIN-13 und GTIN-14<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IstGtin(\"978-0-306-40615-7\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstGtin(\"4006381333931\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstGtin(\"96385074\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstGtin(\"4006381333930\")\r\nWahr\r\nWahr\r\nWahr\r\nFalsch<\/pre>\n<p>Die ersten drei Aufrufe zeigen eine GTIN-13 mit Bindestrichen, eine ohne Trennzeichen und eine GTIN-8. Beim vierten stimmt die Pr&uuml;fziffer nicht.<\/p>\n<p>Dasselbe Pr&uuml;fziffernverfahren gilt auch f&uuml;r die ISBN-13. Soll die Funktion ausdr&uuml;cklich eine ISBN-13 pr&uuml;fen, muss zus&auml;tzlich kontrolliert werden, ob die Nummer mit 978 oder 979 beginnt &#8211; denn diese beiden Pr&auml;fixe sind dem Buchhandel vorbehalten. Daf&uuml;r gen&uuml;gt eine kleine Erg&auml;nzung:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstIsbn13( _\r\n        ByVal strIsbn<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strWert<span style=\"color:blue;\"> As String<\/span>\r\n    strWert = Bereinigt(strIsbn, \"^[0-9 \\-]+$\")\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> RegExTest(strWert, \"^97\\d{10}$\")<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">Exit Function<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    IstIsbn13 = IstGtin(strWert)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Testaufrufe:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IstIsbn13(\"978-0-306-40615-7\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstIsbn13(\"4006381333931\")<\/pre>\n<p>Ergebnisse:<\/p>\n<pre>Wahr\r\nFalsch<\/pre>\n<p>Der zweite Aufruf ist der interessante: Diese GTIN-13 hat eine v&ouml;llig korrekte Pr&uuml;fziffer, ist aber keine ISBN, weil ihr das Pr&auml;fix 978 oder 979 fehlt.<\/p>\n<p>Damit ist der formale Aufbau einer ISBN-13 plausibel. Ob die enthaltenen Gruppenkennungen zul&auml;ssig und die ISBN tats&auml;chlich vergeben sind, l&auml;sst sich daraus nicht ableiten. Hinzu kommt, dass ein Teil des Pr&auml;fixbereichs 979 anderen Nummernsystemen vorbehalten ist &#8211; Nummern mit 9790 sind beispielsweise Musikalien zugeordnet.<\/p>\n<h2>Rezept 4: Kreditkartennummern nach Luhn<\/h2>\n<p>Das Luhn-Verfahren steckt in Kreditkartennummern, in der IMEI von Mobiltelefonen und in einigen Sozialversicherungsnummern. Auch hier wird von rechts gez&auml;hlt: Jede zweite Ziffer wird verdoppelt, und ist das Ergebnis zweistellig, zieht man 9 ab. Die Gesamtsumme muss durch 10 teilbar sein.<\/p>\n<p>Wir verwenden die Funktion <b>IstLuhn <\/b>zum Pr&uuml;fen der Pr&uuml;fziffer von Kreditkartennummern (siehe Listing 10).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstLuhn(ByVal strNummer<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strWert<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngLaenge<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngZiffer<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngSumme<span style=\"color:blue;\"> As Long<\/span>\r\n    strWert = Bereinigt(strNummer, \"^[0-9 \\-]+$\")\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> RegExTest(strWert, \"^\\d{2,}$\")<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n    lngLaenge = <span style=\"color:blue;\">Len<\/span>(strWert)\r\n    For lngPos = lngLaenge To 1 Step -1\r\n        lngZiffer = CLng(<span style=\"color:blue;\">Mid<\/span>(strWert, lngPos, 1))\r\n        <span style=\"color:blue;\">If <\/span>(lngLaenge - lngPos) <span style=\"color:blue;\">Mod<\/span> 2 = 1<span style=\"color:blue;\"> Then<\/span>\r\n            lngZiffer = lngZiffer * 2\r\n            <span style=\"color:blue;\">If <\/span>lngZiffer &gt; 9<span style=\"color:blue;\"> Then<\/span> lngZiffer = lngZiffer - 9\r\n        <span style=\"color:blue;\">End If<\/span>\r\n        lngSumme = lngSumme + lngZiffer\r\n    <span style=\"color:blue;\">Next<\/span> lngPos\r\n    IstLuhn = (lngSumme <span style=\"color:blue;\">Mod<\/span> 10 = 0)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Pr&uuml;fung von Kreditkarten-Nummern nach dem Luhn-Verfahren<\/span><\/b><\/p>\n<p>Beispielaufrufe lauten:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IstLuhn(\"7992 7398 713\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstLuhn(\"7992 7398 710\")<\/pre>\n<p>Ergebnisse:<\/p>\n<pre>Wahr\r\nFalsch<\/pre>\n<p>Die Funktion best&auml;tigt nur die Luhn-Pr&uuml;fziffer. Ob L&auml;nge und Nummernbereich zu einer tats&auml;chlich m&ouml;glichen Kreditkartennummer passen, pr&uuml;ft sie nicht &#8211; sie akzeptiert jede mindestens zweistellige Ziffernfolge mit stimmender Pr&uuml;fsumme.<\/p>\n<p>F&uuml;r eine allgemeine Luhn-Funktion ist das richtig; wer gezielt Kartennummern pr&uuml;fen will, muss L&auml;nge und Anfangsziffern je Anbieter zus&auml;tzlich abgleichen.<\/p>\n<p>Doch Vorsicht: Wenn Sie in einer Anwendung tats&auml;chlich Kreditkartennummern erfassen, sind Sie an die Sicherheitsstandards der Kartenindustrie gebunden. Die Luhn-Pr&uuml;fung ist dort eine Eingabehilfe, kein Ersatz f&uuml;r die Anforderungen an Speicherung und &Uuml;bertragung. In den allermeisten F&auml;llen ist es kl&uuml;ger, die Nummer gar nicht erst in die eigene Datenbank zu lassen.<\/p>\n<h2>Rezept 5: Die Umsatzsteuer-Identifikationsnummer<\/h2>\n<p>Die deutsche USt-IdNr. besteht aus dem L&auml;nderk&uuml;rzel DE und neun Ziffern, von denen die letzte die Pr&uuml;fziffer ist. Sie verwendet ein Verfahren, das gegen&uuml;ber den bisherigen ungewohnt aussieht: Statt einer Summe wird ein Wert schrittweise durch alle Stellen geschleust, wobei abwechselnd mit 10 und mit 11 gerechnet wird.<\/p>\n<p>Die Pr&uuml;fung der Pr&uuml;fziffer einer Umsatzsteuer-Identifikationsnummer f&uuml;hren wir mit der Funktion <b>IstUstIdNrDe<\/b> durch (siehe Listing 11).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstUstIdNrDe(ByVal strNummer<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strWert<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngP<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngM<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngPruefziffer<span style=\"color:blue;\"> As Long<\/span>\r\n    strWert = Bereinigt(strNummer, \"^(DE)?[0-9 ]+$\")\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(strWert, 2) = \"DE\"<span style=\"color:blue;\"> Then<\/span> strWert = <span style=\"color:blue;\">Mid<\/span>(strWert, 3)\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> RegExTest(strWert, \"^[1-9]\\d{8}$\")<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">Exit Function<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    lngP = 10\r\n    For lngPos = 1 To 8\r\n        lngM = (lngP + CLng(<span style=\"color:blue;\">Mid<\/span>(strWert, lngPos, 1))) <span style=\"color:blue;\">Mod<\/span> 10\r\n        <span style=\"color:blue;\">If <\/span>lngM = 0<span style=\"color:blue;\"> Then<\/span> lngM = 10\r\n        lngP = (2 * lngM) <span style=\"color:blue;\">Mod<\/span> 11\r\n    <span style=\"color:blue;\">Next<\/span> lngPos\r\n    lngPruefziffer = 11 - lngP\r\n    <span style=\"color:blue;\">If <\/span>lngPruefziffer = 10<span style=\"color:blue;\"> Then<\/span> lngPruefziffer = 0\r\n    IstUstIdNrDe = (lngPruefziffer = CLng(<span style=\"color:blue;\">Right<\/span>(strWert, 1)))\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: Pr&uuml;fen der deutschen Umsatzsteuer-Identifikationsnummer<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IstUstIdNrDe(\"DE 136 695 976\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstUstIdNrDe(\"136695976\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstUstIdNrDe(\"DE136695977\")\r\nWahr\r\nWahr\r\nFalsch<\/pre>\n<p>Das vorangestellte L&auml;nderk&uuml;rzel <b>DE<\/b> ist f&uuml;r die Funktion optional; gepr&uuml;ft werden letztlich die neun Ziffern. Der regul&auml;re Ausdruck beginnt dabei mit <b>[1-9]<\/b>, weil die erste Ziffer einer deutschen USt-IdNr. nie eine Null ist.<\/p>\n<p>Und auch hier gilt: Die Pr&uuml;fziffer sagt nichts dar&uuml;ber aus, ob die Nummer vergeben und g&uuml;ltig ist.<\/p>\n<p>Wer das wissen muss &#8211; etwa f&uuml;r eine steuerfreie Lieferung ins EU-Ausland &#8211; ben&ouml;tigt eine qualifizierte Best&auml;tigung der ausl&auml;ndischen USt-IdNr. &uuml;ber das daf&uuml;r vorgesehene Verfahren des Bundeszentralamts f&uuml;r Steuern.<\/p>\n<h2>Die Funktionen im &Uuml;berblick<\/h2>\n<p>Damit steht das komplette Werkzeug bereit. Welche Funktion f&uuml;r welchen Nummerntyp zust&auml;ndig ist, fasst diese Liste zusammen:<\/p>\n<ul>\n<li><b>IstIban<\/b> f&uuml;r Bankverbindungen, <b>IbanErzeugen<\/b> f&uuml;r den umgekehrten Weg.<\/li>\n<li><b>IstIsbn10<\/b> f&uuml;r B&uuml;cher, die bis Ende 2006 erschienen sind.<\/li>\n<li><b>IstGtin<\/b> f&uuml;r Artikelnummern aller L&auml;ngen, <b>GtinPruefziffer<\/b> zum Anh&auml;ngen einer eigenen Pr&uuml;fziffer.<\/li>\n<li><b>IstIsbn13<\/b> f&uuml;r heutige Buchnummern.<\/li>\n<li><b>IstLuhn<\/b> f&uuml;r Kreditkartennummern und IMEI-Nummern.<\/li>\n<li><b>IstUstIdNrDe<\/b> f&uuml;r deutsche Umsatzsteuer-Identifikationsnummern.<\/li>\n<\/ul>\n<p>Alle Pr&uuml;ffunktionen liefern einen Wahrheitswert und erwarten einen einzigen Parameter. Sie lassen sich damit unver&auml;ndert dort einsetzen, wo Sie sie brauchen: im Formular, in einer Abfrage oder in einer Importroutine.<\/p>\n<h2>Einsatz in Formularen und Abfragen<\/h2>\n<p>Weil alle Funktionen einen Wahrheitswert zur&uuml;ckgeben, lassen sie sich unver&auml;ndert in einer Ereignisprozedur verwenden. Wichtig ist wieder die vorgeschaltete Pr&uuml;fung auf einen leeren Wert, damit ein optionales Feld nicht beanstandet wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtIban_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me.txtIban, \"\")) = 0<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Sub<\/span>\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IstIban(Me.txtIban)<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">MsgBox<\/span> \"Diese IBAN ist nicht g&uuml;ltig. Bitte \" & _\r\n            \"pr&uuml;fen Sie Ihre Eingabe.\", vbExclamation\r\n        Cancel = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Else<\/span>\r\n        ' Einheitlich ohne Leerzeichen speichern\r\n        Me.txtIban = <span style=\"color:blue;\">Replace<\/span>(Me.txtIban, \" \", \"\")\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der <b>Else<\/b>-Zweig ist eine Empfehlung aus der Praxis. Speichern Sie solche Nummern grunds&auml;tzlich in einer einheitlichen Schreibweise, also ohne Leerzeichen und Bindestriche.<\/p>\n<p>F&uuml;r die Anzeige k&ouml;nnen Sie sie jederzeit wieder gruppieren &#8211; umgekehrt ist das Aufr&auml;umen eines gewachsenen Bestands deutlich m&uuml;hsamer.<\/p>\n<p>Und genau daf&uuml;r ist eine Auswahlabfrage der richtige Weg. Sie zeigt auf einen Blick, welche Datens&auml;tze eine Pr&uuml;fung nicht bestehen:<\/p>\n<pre>SELECT KundeID, Firma, Iban\r\nFROM tblKunden\r\nWHERE Iban Is <span style=\"color:blue;\">Not<\/span> Null\r\n    AND IstIban(Iban) = <span style=\"color:blue;\">False<\/span><\/pre>\n<h2>Ein Formular zum Ausprobieren<\/h2>\n<p>Damit Sie die Funktionen nicht nur im Direktbereich testen m&uuml;ssen, enth&auml;lt die Beispieldatenbank das Formular <b>frmPruefziffern<\/b>.<\/p>\n<p>Es besteht aus sieben Zeilen, die alle gleich aufgebaut sind: Bezeichnung, Eingabefeld, Schaltfl&auml;che und Ergebnisfeld. Sechs davon pr&uuml;fen eine Nummer, die siebte erzeugt aus einer eingegebenen BBAN die vollst&auml;ndige IBAN (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_05\/pic_1618_001.png\" alt=\"Formular zum Testen der verschiedenen Funktionen\" width=\"699,559\" height=\"338,2597\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Formular zum Testen der verschiedenen Funktionen<\/span><\/b><\/p>\n<p>In jedem Eingabefeld steht bereits ein g&uuml;ltiger Beispielwert als Standardwert. Sie k&ouml;nnen also sofort auf <b>Pr&uuml;fen<\/b> klicken und anschlie&szlig;end einzelne Ziffern verf&auml;lschen, um zu sehen, ab wann die Pr&uuml;fziffer nicht mehr passt.<\/p>\n<p>Besonders aufschlussreich ist dabei ein Zahlendreher:<\/p>\n<p>Vertauschen Sie in der IBAN zwei benachbarte Ziffern, und das Ergebnis kippt auf <b>ung&uuml;ltig<\/b>.<\/p>\n<p>Die Ereignisprozedur f&uuml;r die Schaltfl&auml;che der IBAN-Zeile sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdIban_Click()\r\n    Me.txtErgIban = Ergebnis(IstIban(Nz(Me.txtIban, \"\")))\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Hilfsfunktion <b>Ergebnis<\/b> &uuml;bersetzt dabei nur den Wahrheitswert in die Anzeigetexte <b>g&uuml;ltig<\/b> und <b>ung&uuml;ltig<\/b>. Zwei Kleinigkeiten sind beim Erzeugen von Formularen per VBA zu beachten: Ein neu angelegtes Formular tr&auml;gt zun&auml;chst einen tempor&auml;ren Namen, wird deshalb erst gespeichert und danach mit <b>DoCmd.Rename<\/b> umbenannt. Und die Eigenschaft <b>HasModule<\/b> muss auf <b>True<\/b> stehen, bevor Sie auf das Klassenmodul zugreifen k&ouml;nnen &#8211; sonst existiert es noch gar nicht.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>F&uuml;nf Verfahren, gut hundert Zeilen Code &#8211; und Sie fangen damit einen gro&szlig;en Teil der Tippfehler ab, die sonst erst beim Kunden auffallen. Der wichtigste Baustein ist dabei nicht einmal eines der Verfahren selbst, sondern die Funktion <b>Modulo97<\/b>: Das schrittweise Modulo-Rechnen vermeidet, dass die vollst&auml;ndige Zahl &uuml;berhaupt in einem numerischen VBA-Datentyp gespeichert werden muss.<\/p>\n<p>Ebenso wichtig ist die Vorpr&uuml;fung aus der Funktion <b>Bereinigt<\/b>. Eine Validierung, die vor dem Rechnen gro&szlig;z&uuml;gig alles wegwirft, was ihr nicht passt, ist keine Validierung &#8211; sie erzeugt nur den Eindruck von Sicherheit.<\/p>\n<p>Zwei Bereiche haben wir bewusst ausgelassen. Deutsche <b>Kontonummern<\/b> haben zwar ebenfalls Pr&uuml;fziffern, aber jedes Kreditinstitut darf sein eigenes Verfahren w&auml;hlen &#8211; die Deutsche Bundesbank f&uuml;hrt &uuml;ber hundert davon.<\/p>\n<p>F&uuml;r Anwendungen mit IBAN ist das ohnehin gegenstandslos, weil die IBAN-Pr&uuml;fziffer die Kontonummer mit abdeckt.<\/p>\n<p>Und die steuerliche <b>Identifikationsnummer<\/b>, kurz IdNr., ist eine elfstellige pers&ouml;nliche Identifikationsnummer &#8211; nicht zu verwechseln mit der Steuernummer des Finanzamts.<\/p>\n<p>Sie folgt ebenfalls dem Verfahren ISO\/IEC 7064 MOD 11,10, stellt aber zus&auml;tzliche Anforderungen an die Verteilung ihrer Ziffern. Wer sie braucht, findet die ma&szlig;gebliche Beschreibung beim Bundeszentralamt f&uuml;r Steuern.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>PruefziffernBerechnenUndPruefen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/E39D1D1E-F2D8-4892-B097-2306AA00A078\/aiu_1618.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Regul&auml;re Ausdr&uuml;cke in VBA, Teil 2: Praxis-Rezepte&#8220; (www.access-im-unternehmen.de\/1617) haben wir mit einem regul&auml;ren Ausdruck gepr&uuml;ft, ob eine IBAN formal richtig aufgebaut ist. Das sch&uuml;tzt aber nur vor groben Schnitzern &#8211; ein Zahlendreher in der Kontonummer geht anstandslos durch. Genau daf&uuml;r gibt es Pr&uuml;fziffern: eine oder zwei zus&auml;tzliche Stellen, aus den &uuml;brigen berechnet, die beim Vertippen fast immer nicht mehr passen. Dieser Beitrag zeigt die Verfahren hinter IBAN, ISBN, GTIN, Kreditkartennummer und Umsatzsteuer-Identifikationsnummer und liefert sie als fertige Funktionen, die Sie in Formularen und Abfragen einsetzen k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662026,66052026,44000025],"tags":[],"class_list":["post-55001618","post","type-post","status-publish","format-standard","hentry","category-662026","category-66052026","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v28.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Regul&auml;re Ausdr&uuml;cke in VBA, Teil 2: Praxis-Rezepte&quot; (www.access-im-unternehmen.de\/1617) haben wir mit einem regul&auml;ren Ausdruck gepr&uuml;ft, ob eine IBAN formal richtig aufgebaut ist. Das sch&uuml;tzt aber nur vor groben Schnitzern - ein Zahlendreher in der Kontonummer geht anstandslos durch. Genau daf&uuml;r gibt es Pr&uuml;fziffern: eine oder zwei zus&auml;tzliche Stellen, aus den &uuml;brigen berechnet, die beim Vertippen fast immer nicht mehr passen. Dieser Beitrag zeigt die Verfahren hinter IBAN, ISBN, GTIN, Kreditkartennummer und Umsatzsteuer-Identifikationsnummer und liefert sie als fertige Funktionen, die Sie in Formularen und Abfragen einsetzen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-05T19:31:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/9bab2a049d90456d94a7aff2eed23989\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen\",\"datePublished\":\"2026-10-05T19:31:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/\"},\"wordCount\":3052,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/9bab2a049d90456d94a7aff2eed23989\",\"articleSection\":[\"2026\",\"5\\\/2026\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/\",\"name\":\"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/9bab2a049d90456d94a7aff2eed23989\",\"datePublished\":\"2026-10-05T19:31:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/9bab2a049d90456d94a7aff2eed23989\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/9bab2a049d90456d94a7aff2eed23989\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Pruefziffern_per_VBA_berechnen_und_pruefen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/","og_locale":"de_DE","og_type":"article","og_title":"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen","og_description":"Im Beitrag \"Regul&auml;re Ausdr&uuml;cke in VBA, Teil 2: Praxis-Rezepte\" (www.access-im-unternehmen.de\/1617) haben wir mit einem regul&auml;ren Ausdruck gepr&uuml;ft, ob eine IBAN formal richtig aufgebaut ist. Das sch&uuml;tzt aber nur vor groben Schnitzern - ein Zahlendreher in der Kontonummer geht anstandslos durch. Genau daf&uuml;r gibt es Pr&uuml;fziffern: eine oder zwei zus&auml;tzliche Stellen, aus den &uuml;brigen berechnet, die beim Vertippen fast immer nicht mehr passen. Dieser Beitrag zeigt die Verfahren hinter IBAN, ISBN, GTIN, Kreditkartennummer und Umsatzsteuer-Identifikationsnummer und liefert sie als fertige Funktionen, die Sie in Formularen und Abfragen einsetzen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/","og_site_name":"Access im Unternehmen","article_published_time":"2026-10-05T19:31:00+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/9bab2a049d90456d94a7aff2eed23989","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen","datePublished":"2026-10-05T19:31:00+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/"},"wordCount":3052,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/9bab2a049d90456d94a7aff2eed23989","articleSection":["2026","5\/2026","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/","url":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/","name":"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/9bab2a049d90456d94a7aff2eed23989","datePublished":"2026-10-05T19:31:00+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/9bab2a049d90456d94a7aff2eed23989","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/9bab2a049d90456d94a7aff2eed23989"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Pruefziffern_per_VBA_berechnen_und_pruefen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Pr&uuml;fziffern per VBA berechnen und pr&uuml;fen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001618","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001618"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001618\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001618"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001618"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}