{"id":55000508,"date":"2026-04-01T00:00:00","date_gmt":"2026-05-16T17:25:05","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=508"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Regulaere_Ausdruecke_in_VBA_Die_neue_RegExpKlasse","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Regulaere_Ausdruecke_in_VBA_Die_neue_RegExpKlasse\/","title":{"rendered":"Regul&auml;re Ausdr&uuml;cke in VBA: Die neue RegExp-Klasse"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/250c21e7432b4e0f8d84e4653f1f2eae\" width=\"1\" height=\"1\" alt=\"\"><b>Seit Office Version 2508 sind regul&auml;re Ausdr&uuml;cke direkt in die VBA-Objektbibliothek integriert. Damit entf&auml;llt der bisherige Umweg &uuml;ber einen externen Verweis auf die VBScript-Bibliothek. Dieser Artikel erkl&auml;rt die Hintergr&uuml;nde dieser &Auml;nderung, stellt alle Klassen und ihre Mitglieder vor und zeigt anhand zahlreicher Beispiele, wie Du regul&auml;re Ausdr&uuml;cke in Deinen VBA-Projekten einsetzen kannst.<\/b><\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele in diesem Artikel sind nicht an eine Datenbank gebunden. Du kannst alle Prozeduren und Funktionen in einem beliebigen Standardmodul einer Access-, Excel- oder Word-Datei anlegen und im Direktbereich aufrufen.<\/p>\n<h2>Warum jetzt diese &Auml;nderung?<\/h2>\n<p>Im Mai 2024 k&uuml;ndigte Microsoft die geplante Abschaffung von VBScript als Windows-Komponente an. Diese Nachricht l&ouml;ste unter VBA-Entwicklern erhebliche Unruhe aus, denn die bis dahin genutzte Klasse <b>RegExp<\/b> war Bestandteil der Datei <b>vbscript.dll<\/b>, die im Zuge der Abschaffung entfernt werden soll.<\/p>\n<p>Microsoft reagierte auf die Bedenken der Community: Mit Office Version 2508 (Build 19127.20154), ver&ouml;ffentlicht im September 2025, wurden die Klassen <b>RegExp<\/b>, <b>Match<\/b>, <b>MatchCollection<\/b> und <b>SubMatches<\/b> direkt in die VBA-Bibliothek aufgenommen.<\/p>\n<p>Es handelt sich um eine der ersten gr&ouml;&szlig;eren Erweiterungen der VBA-Objektbibliothek seit vielen Jahren.<\/p>\n<h2>Welche Office-Versionen sind betroffen?<\/h2>\n<p>Die neuen Klassen stehen nicht nur in Microsoft 365 zur Verf&uuml;gung, sondern generell in Click-to-Run-Installationen von Office, die auf Version 2508 oder h&ouml;her aktualisiert wurden. Dazu z&auml;hlen auch viele Einzelplatzinstallationen von Office 2016, 2019, 2021 und 2024. Ausgenommen sind die LTSC-Versionen (Long Term Service Channel), da diese keine Feature-Updates erhalten.<\/p>\n<p>Du kannst im Objektkatalog des VBA-Editors &uuml;berpr&uuml;fen, ob die Klassen verf&uuml;gbar sind: &Ouml;ffne den Objektkatalog mit <b>F2<\/b> und w&auml;hle in der Bibliotheksliste den Eintrag <b>VBA<\/b>. Dort sollten die vier neuen Klassen <b>RegExp<\/b>, <b>Match<\/b>, <b>MatchCollection<\/b> und <b>SubMatches<\/b> erscheinen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_02\/pic_508_001.png\" alt=\"Die neuen Elemente der VBA-Bibliothek\" width=\"499,6267\" height=\"383,0172\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die neuen Elemente der VBA-Bibliothek<\/span><\/b><\/p>\n<p>Durch die Integration in die VBA-Bibliothek kannst Du nun mit Early Binding arbeiten, ohne einen externen Verweis hinzuzuf&uuml;gen. Die Deklaration <b>Dim rx As RegExp<\/b> funktioniert direkt, und Du erh&auml;ltst IntelliSense-Unterst&uuml;tzung im VBA-Editor.<\/p>\n<h2>Vorsicht in Kundenumgebungen<\/h2>\n<p>Du darfst nicht davon ausgehen, dass diese Klasse bereits &uuml;berall verf&uuml;gbar ist. Eventuell aktualisiert ein Kunde seine Office-Installation nicht regelm&auml;&szlig;ig und arbeitet noch mit einer Version, in der die RegExp-Klasse nicht in der VBA-Bibliothek enthalten ist &#8211; oder er verwendet eine &auml;ltere Runtime.<\/p>\n<h2>Die Klasse RegExp<\/h2>\n<p>Die Klasse <b>RegExp<\/b> ist das zentrale Objekt f&uuml;r die Arbeit mit regul&auml;ren Ausdr&uuml;cken.<\/p>\n<p>&Uuml;ber ihre Eigenschaften konfigurierst Du das Suchverhalten, und &uuml;ber ihre Methoden f&uuml;hrst Du die eigentliche Suche durch.<\/p>\n<p>Eigenschaften der Klasse <b>RegExp<\/b>:<\/p>\n<ul>\n<li><b>Pattern<\/b> (<b>String<\/b>, Lesen\/Schreiben): Das Suchmuster als regul&auml;rer Ausdruck. Diese Eigenschaft muss vor dem Aufruf einer Methode gesetzt werden.<\/li>\n<li><b>Global<\/b> (<b>Boolean<\/b>, Lesen\/Schreiben): Bestimmt, ob alle Treffer oder nur der erste Treffer gesucht werden. Der Standardwert ist <b>False<\/b>, es wird also nur der erste Treffer ermittelt.<\/li>\n<li><b>IgnoreCase<\/b> (<b>Boolean<\/b>, Lesen\/Schreiben): Steuert, ob die Suche zwischen Gro&szlig;- und Kleinschreibung unterscheidet. Der Standardwert ist <b>False<\/b>, die Suche ist also standardm&auml;&szlig;ig empfindlich gegen&uuml;ber der Schreibweise.<\/li>\n<li><b>Multiline<\/b> (<b>Boolean<\/b>, Lesen\/Schreiben): Legt fest, ob die Anker <b>^ <\/b>und <b>$ <\/b>nur am Anfang und Ende der gesamten Zeichenkette wirken oder auch am Anfang und Ende jeder einzelnen Zeile. Der Standardwert ist <b>False<\/b>.<\/li>\n<\/ul>\n<p>Methoden der Klasse <b>RegExp<\/b>:<\/p>\n<ul>\n<li><b>Test(Zeichenkette)<\/b>: Gibt <b>True<\/b> zur&uuml;ck, wenn das Muster in der &uuml;bergebenen Zeichenkette gefunden wird, andernfalls <b>False<\/b>. Die Eigenschaft <b>Global<\/b> hat auf das Ergebnis keinen Einfluss.<\/li>\n<li><b>Execute(Zeichenkette)<\/b>: Durchsucht die &uuml;bergebene Zeichenkette und gibt ein <b>MatchCollection<\/b>-Objekt zur&uuml;ck, das alle gefundenen Treffer enth&auml;lt (beziehungsweise nur den ersten, wenn <b>Global<\/b> auf <b>False<\/b> steht).<\/li>\n<li><b>Replace(Zeichenkette, Ersetzung)<\/b>: Ersetzt die gefundenen Treffer in der Zeichenkette durch den angegebenen Ersetzungstext und gibt das Ergebnis als neue Zeichenkette zur&uuml;ck. In der Ersetzung kannst Du mit <b>$1<\/b>, <b>$2 <\/b>und so weiter auf eingefangene Gruppen zugreifen. Mit <b>$&#038; <\/b>f&uuml;gst Du den gesamten Treffer ein.<\/li>\n<\/ul>\n<h2>Die Klasse MatchCollection<\/h2>\n<p>Ein <b>MatchCollection<\/b>-Objekt wird ausschlie&szlig;lich von der Methode <b>Execute<\/b> der Klasse <b>RegExp<\/b> erzeugt.<\/p>\n<p>Es handelt sich um eine schreibgesch&uuml;tzte Auflistung von <b>Match<\/b>-Objekten:<\/p>\n<ul>\n<li><b>Count<\/b> (<b>Long<\/b>, nur Lesen): Die Anzahl der gefundenen Treffer. Wenn kein Treffer gefunden wurde, ist der Wert <b>0<\/b>.<\/li>\n<li><b>Item(Index)<\/b> (<b>Match<\/b>, nur Lesen): Gibt den Treffer an der angegebenen Position zur&uuml;ck. Der Index beginnt bei <b>0<\/b> und reicht bis <b>Count &#8211; 1<\/b>. Da <b>Item<\/b> die Standardeigenschaft ist, kannst Du auch die Kurzform <b>MatchCollection(0) <\/b>verwenden.<\/li>\n<\/ul>\n<p>Am h&auml;ufigsten wirst Du eine <b>MatchCollection<\/b> mit <b>For Each<\/b> durchlaufen. Alternativ ist auch eine Schleife mit <b>For&#8230;Next<\/b> &uuml;ber den Index m&ouml;glich.<\/p>\n<h2>Die Klasse Match<\/h2>\n<p>Jedes <b>Match<\/b>-Objekt repr&auml;sentiert einen einzelnen Treffer innerhalb der durchsuchten Zeichenkette. Alle Eigenschaften sind schreibgesch&uuml;tzt:<\/p>\n<ul>\n<li><b>Value<\/b> (<b>String<\/b>, nur Lesen): Der Text, der durch das Muster gefunden wurde. <b>Value<\/b> ist die Standardeigenschaft der Klasse.<\/li>\n<li><b>FirstIndex<\/b> (<b>Long<\/b>, nur Lesen): Die Position des ersten Zeichens des Treffers innerhalb der durchsuchten Zeichenkette. Achtung: Der Index ist nullbasiert. Das erste Zeichen der Zeichenkette hat den Index <b>0<\/b>. Dies unterscheidet sich von den meisten anderen VBA-Funktionen wie <b>Mid<\/b> oder <b>InStr<\/b>, die mit <b>1 <\/b>beginnen.<\/li>\n<li><b>Length<\/b> (<b>Long<\/b>, nur Lesen): Die L&auml;nge des gefundenen Treffers in Zeichen.<\/li>\n<li><b>SubMatches<\/b> (<b>SubMatches<\/b>, nur Lesen): Eine Auflistung der durch einfangende Gruppen (Klammern im Muster) gefundenen Teil&uuml;bereinstimmungen. Wenn das Muster keine Klammern enth&auml;lt, ist die Auflistung leer.<\/li>\n<\/ul>\n<h2>Die Klasse SubMatches<\/h2>\n<p>Die Klasse <b>SubMatches<\/b> ist eine schreibgesch&uuml;tzte Auflistung von Zeichenketten.<\/p>\n<p>Jeder Eintrag entspricht dem Text, der durch eine einfangende Gruppe im Suchmuster gefunden wurde.<\/p>\n<ul>\n<li><b>Count<\/b> (<b>Long<\/b>, nur Lesen): Die Anzahl der Teil&uuml;bereinstimmungen.<\/li>\n<li><b>Item(Index)<\/b> (<b>String<\/b>, nur Lesen): Gibt die Teil&uuml;bereinstimmung an der angegebenen Position zur&uuml;ck. Der Index beginnt bei <b>0<\/b>. Beachte, dass <b>SubMatches(0)<\/b> nicht den gesamten Treffer enth&auml;lt, sondern den Text der ersten einfangenden Gruppe. Dies unterscheidet sich von vielen anderen Programmiersprachen, in denen Index <b>0 <\/b>den Gesamttreffer liefert.<\/li>\n<\/ul>\n<h2>Kurz&uuml;bersicht: Muster-Syntax<\/h2>\n<p>Bevor wir zu den Beispielen kommen, hier eine kompakte &Uuml;bersicht der wichtigsten Elemente der Muster-Syntax. Die Zeichen in einem regul&auml;ren Ausdruck lassen sich in drei Kategorien einteilen: literale Zeichen, Metazeichen und Quantifizierer. Wir listen diese in den folgenden Abschnitten auf.<\/p>\n<p><b>Zeichenklassen und Metazeichen:<\/b><\/p>\n<ul>\n<li><b>. <\/b>(Punkt): Steht f&uuml;r ein beliebiges Zeichen au&szlig;er dem Zeilenumbruch.<\/li>\n<li><b>\\d<\/b>: Eine Ziffer (entspricht <b>[0-9]<\/b>).<\/li>\n<li><b>\\D<\/b>: Ein Zeichen, das keine Ziffer ist.<\/li>\n<li><b>\\w<\/b>: Ein Wortzeichen (Buchstabe, Ziffer oder Unterstrich).<\/li>\n<li><b>\\W<\/b>: Ein Zeichen, das kein Wortzeichen ist.<\/li>\n<li><b>\\s<\/b>: Ein Whitespace-Zeichen (Leerzeichen, Tabulator, Zeilenumbruch).<\/li>\n<li><b>\\S<\/b>: Ein Zeichen, das kein Whitespace ist.<\/li>\n<li><b>[abc]<\/b>: Eines der Zeichen <b>a<\/b>, <b>b <\/b>oder <b>c<\/b>.<\/li>\n<li><b>[^abc]<\/b>: Kein Zeichen aus <b>a<\/b>, <b>b <\/b>oder <b>c<\/b>.<\/li>\n<li><b>[a-z]<\/b>: Ein Zeichen im Bereich von <b>a <\/b>bis <b>z<\/b>.<\/li>\n<\/ul>\n<p><b>Quantifizierer:<\/b><\/p>\n<ul>\n<li><b>*<\/b>: Null oder mehr Wiederholungen.<\/li>\n<li><b>+<\/b>: Eine oder mehr Wiederholungen.<\/li>\n<li><b>?<\/b>: Null oder eine Wiederholung.<\/li>\n<li><b>{n}<\/b>: Genau <b>n <\/b>Wiederholungen.<\/li>\n<li><b>{n,}<\/b>: Mindestens <b>n <\/b>Wiederholungen.<\/li>\n<li><b>{n,m}<\/b>: Mindestens <b>n<\/b>, h&ouml;chstens <b>m <\/b>Wiederholungen.<\/li>\n<\/ul>\n<p><b>Anker und Gruppen:<\/b><\/p>\n<ul>\n<li><b>^<\/b>: Anfang der Zeichenkette (beziehungsweise der Zeile bei <b>Multiline = True<\/b>).<\/li>\n<li><b>$<\/b>: Ende der Zeichenkette (beziehungsweise der Zeile bei <b>Multiline = True<\/b>).<\/li>\n<li><b>\\b<\/b>: Wortgrenze.<\/li>\n<li><b>(Ausdruck)<\/b>: Einfangende Gruppe. Der Treffer der Gruppe wird in <b>SubMatches<\/b> gespeichert.<\/li>\n<li><b>|<\/b>: Alternation (&#8220;oder&#8221;).<\/li>\n<\/ul>\n<h2>Grundlegende Beispiele<\/h2>\n<p>Wir beginnen mit den grundlegenden Methoden der <b>RegExp<\/b>-Klasse. Alle Prozeduren verwenden Early Binding, das hei&szlig;t, Du ben&ouml;tigst mindestens Office Version 2508.<\/p>\n<h2>Einfacher Test auf ein Muster<\/h2>\n<p>Die Methode Test gibt <b>True<\/b> zur&uuml;ck, sobald das Muster irgendwo in der Zeichenkette gefunden wird.<\/p>\n<p>In diesem Fall sucht das Muster <b>\\d+<\/b> nach einer oder mehreren aufeinanderfolgenden Ziffern.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TestAufMuster()\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"\\d+\"\r\n    'Pr&uuml;ft, ob Ziffern enthalten sind\r\n    <span style=\"color:blue;\">Debug.Print<\/span> rx.Test(\"Hallo 42\")\r\n    'Ausgabe: <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Debug.Print<\/span> rx.Test(\"Hallo Welt\")\r\n    'Ausgabe: <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Alle Treffer mit Execute ermitteln<\/h2>\n<p>Beachte, dass <b>Global<\/b> auf <b>True<\/b> gesetzt werden muss, damit alle Treffer und nicht nur der erste ermittelt werden.<\/p>\n<p>Die Eigenschaft <b>FirstIndex<\/b> ist nullbasiert, Position <b>5 <\/b>entspricht also dem sechsten Zeichen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AlleTreffer()\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Dim <\/span>colMatches<span style=\"color:blue;\"> As <\/span>MatchCollection\r\n    <span style=\"color:blue;\">Dim <\/span>objMatch<span style=\"color:blue;\"> As <\/span>Match\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"\\d+\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> colMatches = rx.Execute(\"Art. 12, Art. 345\")\r\n    <span style=\"color:blue;\">Debug.Print<\/span> \"Treffer: \" & colMatches.Count\r\n    'Ausgabe: Treffer: 2\r\n    For Each objMatch In colMatches\r\n        <span style=\"color:blue;\">Debug.Print<\/span> objMatch.Value & \" an Position \" _\r\n            & objMatch.FirstIndex\r\n    <span style=\"color:blue;\">Next<\/span> objMatch\r\n    'Ausgabe:\r\n    '12 an Position 5\r\n    '345 an Position 14\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Einfaches Ersetzen mit Replace<\/h2>\n<p>Im folgenden Beispiel wollen wir alle Auftreten von Zahlenwerten durch <b>XXX <\/b>ersetzen. Dazu stellen wir als Pattern <b>\\d+ <\/b>ein, was nach einer oder mehreren aufeinanderfolgenden Ziffern sucht. Diese werden durch die <b>Replace<\/b>-Methode jeweils durch <b>XXX <\/b>ersetzt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EinfachesErsetzen()\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Dim <\/span>strResult<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"\\d+\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    strResult = rx.<span style=\"color:blue;\">Replace<\/span>(\"Art. 12, Art. 345\", \"XXX\")\r\n    <span style=\"color:blue;\">Debug.Print<\/span> strResult\r\n    'Ausgabe: Art. XXX, Art. XXX\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>SubMatches: Gruppen auswerten<\/h2>\n<p>Einfangende Gruppen in runden Klammern erm&ouml;glichen es, Teile eines Treffers gezielt auszulesen. Die gefundenen Teile stehen anschlie&szlig;end in der <b>SubMatches<\/b>-Auflistung des jeweiligen <b>Match<\/b>-Objekts zur Verf&uuml;gung:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GruppenAuswerten()\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Dim <\/span>colMatches<span style=\"color:blue;\"> As <\/span>MatchCollection\r\n    <span style=\"color:blue;\">Dim <\/span>objMatch<span style=\"color:blue;\"> As <\/span>Match\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    'Datum im Format TT.MM.JJJJ\r\n    rx.Pattern = \"(\\d{2})\\.(\\d{2})\\.(\\d{4})\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> colMatches = rx.Execute(\"Beginn: 15.03.2025, \" _\r\n        & \"Ende: 30.06.2025\")\r\n    For Each objMatch In colMatches\r\n        <span style=\"color:blue;\">Debug.Print<\/span> \"Gesamt: \" & objMatch.Value\r\n        <span style=\"color:blue;\">Debug.Print<\/span> \"  Tag:   \" & objMatch.SubMatches(0)\r\n        <span style=\"color:blue;\">Debug.Print<\/span> \"  Monat: \" & objMatch.SubMatches(1)\r\n        <span style=\"color:blue;\">Debug.Print<\/span> \"  Jahr:  \" & objMatch.SubMatches(2)\r\n    <span style=\"color:blue;\">Next<\/span> objMatch\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Muster <b>(\\d{2})\\.(\\d{2})\\.(\\d{4}) <\/b>enth&auml;lt drei einfangende Gruppen f&uuml;r Tag, Monat und Jahr. Der Punkt muss mit <b>\\. <\/b>maskiert werden, da er als Metazeichen sonst f&uuml;r ein beliebiges Zeichen stehen w&uuml;rde. Beachte, dass <b>SubMatches(0) <\/b>den Tag liefert, nicht den Gesamttreffer. Der Gesamttreffer steht in der Eigenschaft <b>Value <\/b>des <b>Match<\/b>-Objekts.<\/p>\n<h2>Ersetzen mit R&uuml;ckverweisen<\/h2>\n<p>In der Methode Replace kannst Du mit $1, $2 und so weiter auf den Inhalt der einfangenden Gruppen zugreifen. Das er&ouml;ffnet m&auml;chtige M&ouml;glichkeiten zur Umstrukturierung von Texten:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DatumUmformatieren()\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Dim <\/span>strResult<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"(\\d{2})\\.(\\d{2})\\.(\\d{4})\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    'Deutsches in ISO-Format wandeln\r\n    strResult = rx.<span style=\"color:blue;\">Replace<\/span>(\"15.03.2025\", \"$3-$2-$1\")\r\n    <span style=\"color:blue;\">Debug.Print<\/span> strResult\r\n    'Ausgabe: 2025-03-15\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier wird das deutsche Datumsformat <b>TT.MM.JJJJ <\/b>in das ISO-Format <b>JJJJ-MM-TT <\/b>&uuml;berf&uuml;hrt, indem die Reihenfolge der Gruppen im Ersetzungstext vertauscht wird.<\/p>\n<h2>Validierung von Eingaben<\/h2>\n<p>Ein klassischer Anwendungsfall f&uuml;r regul&auml;re Ausdr&uuml;cke ist die Validierung von Benutzereingaben. Das folgende Beispiel pr&uuml;ft, ob eine Zeichenkette dem Aufbau einer E-Mail-Adresse entspricht.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstGueltigeEmail(strEmail<span style=\"color:blue;\"> As String<\/span>) _\r\n       <span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.IgnoreCase = <span style=\"color:blue;\">True<\/span>\r\n    rx.Pattern = \"^[\\w.+-]+@\" & \"[\\w-]+(\\.[\\w-]+)*\" _\r\n        & \"\\.[a-z]{2,}$\"\r\n    IstGueltigeEmail = rx.Test(strEmail)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Anker <b>^ <\/b>und <b>$ <\/b>stellen sicher, dass die gesamte Zeichenkette dem Muster entsprechen muss und nicht nur ein Teil davon. Die Eigenschaft <b>IgnoreCase<\/b> sorgt daf&uuml;r, dass sowohl gro&szlig;- als auch kleingeschriebene Domainendungen akzeptiert werden. Du kannst die Funktion im Direktbereich testen:<\/p>\n<pre>'Im Direktbereich:\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstGueltigeEmail(\"test@example.com\")\r\n'Ausgabe: <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstGueltigeEmail(\"ungueltig@@test\")\r\n'Ausgabe: <span style=\"color:blue;\">False<\/span><\/pre>\n<h2>Mehrere Muster auf einen Blick<\/h2>\n<p>Regul&auml;re Ausdr&uuml;cke erlauben mit dem Pipe-Zeichen <b>|<\/b> die Angabe von Alternativen. So lassen sich mehrere Muster in einer einzigen Suche zusammenfassen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AlternativenSuchen()    Dim rx<span style=\"color:blue;\"> As <\/span>RegExp    Dim colMatches<span style=\"color:blue;\"> As <\/span>MatchCollection    Dim objMatch<span style=\"color:blue;\"> As <\/span>Match    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp    rx.Pattern = \"\\b(Herr|Frau|Dr\\.)\"    rx.Global = <span style=\"color:blue;\">True<\/span>    <span style=\"color:blue;\">Set<\/span> colMatches = rx.Execute(\"Herr Meier und \" _        & \"Dr. Schmidt\")    For Each objMatch In colMatches        <span style=\"color:blue;\">Debug.Print<\/span> objMatch.Value    <span style=\"color:blue;\">Next<\/span> objMatch    'Ausgabe:    'Herr    'Dr.End Sub<\/pre>\n<p>Die Wortgrenze <b>\\b <\/b>am Anfang des Musters verhindert, dass zum Beispiel &#8220;Herrlich&#8221; als Treffer erkannt wird. Am Ende der Gruppe steht bewusst kein <b>\\b<\/b>, da der Punkt hinter &#8220;Dr.&#8221; kein Wortzeichen ist und die Wortgrenze dort nicht greifen w&uuml;rde.<\/p>\n<h2>Mehrere Zeilen durchsuchen<\/h2>\n<p>Die Eigenschaft <b>Multiline<\/b> beeinflusst das Verhalten der Anker <b>^ <\/b>und <b>$<\/b>. Standardm&auml;&szlig;ig stehen sie nur f&uuml;r den Anfang und das Ende der gesamten Zeichenkette. Mit <b>Multiline = True<\/b> erkennen sie auch den Anfang und das Ende jeder einzelnen Zeile.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>MehrzeiligeSuche()\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>colMatches<span style=\"color:blue;\"> As <\/span>MatchCollection\r\n    <span style=\"color:blue;\">Dim <\/span>objMatch<span style=\"color:blue;\"> As <\/span>Match\r\n    strText = \"Zeile eins\" & <span style=\"color:blue;\">vbCrLf<\/span> & \"Zeile zwei\" _\r\n        & <span style=\"color:blue;\">vbCrLf<\/span> & \"Zeile drei\"\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"^Zeile \\w+\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    rx.Multiline = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> colMatches = rx.Execute(strText)\r\n    For Each objMatch In colMatches\r\n        <span style=\"color:blue;\">Debug.Print<\/span> objMatch.Value\r\n    <span style=\"color:blue;\">Next<\/span> objMatch\r\n    'Ausgabe:\r\n    'Zeile eins\r\n    'Zeile zwei\r\n    'Zeile drei\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ohne <b>Multiline = True<\/b> w&uuml;rde nur &#8220;Zeile eins&#8221; gefunden, weil <b>^ <\/b>dann ausschlie&szlig;lich den Anfang der gesamten Zeichenkette markiert.<\/p>\n<h2>Leerzeichen normalisieren<\/h2>\n<p>Beim Import von Daten aus externen Quellen enthalten Texte h&auml;ufig &uuml;berfl&uuml;ssige Leerzeichen. Mit einem regul&auml;ren Ausdruck lassen sich mehrere aufeinanderfolgende Leerzeichen in einem Schritt auf ein einzelnes reduzieren.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Normalisieren(strText<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \" {2,}\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    Normalisieren = <span style=\"color:blue;\">Trim<\/span>(rx.<span style=\"color:blue;\">Replace<\/span>(strText, \" \"))\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Das Muster <b>{2,}<\/b> (ein Leerzeichen gefolgt von dem Quantifizierer f&uuml;r mindestens zwei Wiederholungen) findet alle Stellen mit zwei oder mehr aufeinanderfolgenden Leerzeichen.<\/p>\n<p>Die Methode <b>Replace<\/b> ersetzt sie jeweils durch ein einzelnes Leerzeichen, und Trim entfernt zus&auml;tzlich f&uuml;hrende und abschlie&szlig;ende Leerzeichen.<\/p>\n<p>Der Aufruf lautet wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Normalisieren(\"Text mit zu vielen  Leerzeichen.\")<\/pre>\n<h2>HTML-Tags entfernen<\/h2>\n<p>Wer Texte aus HTML-Quellen verarbeitet, m&ouml;chte h&auml;ufig alle Tags entfernen und nur den reinen Text behalten. Das gelingt mit einem einzigen Aufruf von Replace.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>StripHTML(strHTML<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"&lt;[^&gt;]*&gt;\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    StripHTML = rx.<span style=\"color:blue;\">Replace<\/span>(strHTML, \"\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Das Muster <b><[^>]*> <\/b>sucht nach einer &ouml;ffnenden spitzen Klammer, gefolgt von beliebig vielen Zeichen, die keine schlie&szlig;ende spitze Klammer sind, und schlie&szlig;t mit einer schlie&szlig;enden spitzen Klammer ab.<\/p>\n<p>Durch die Ersetzung mit einer leeren Zeichenkette werden alle Tags entfernt. Der Beispielaufruf lautet:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> StripHTML(\"&lt;p&gt;Beispiel&lt;\/p&gt;\")<\/pre>\n<h2>Telefonnummern extrahieren<\/h2>\n<p>In Freitextfeldern stehen Telefonnummern oft in den unterschiedlichsten Formaten. Ein regul&auml;rer Ausdruck kann die verschiedenen Schreibweisen erfassen und die reinen Ziffernfolgen extrahieren:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TelefonnummernFinden()\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Dim <\/span>colMatches<span style=\"color:blue;\"> As <\/span>MatchCollection\r\n    <span style=\"color:blue;\">Dim <\/span>objMatch<span style=\"color:blue;\"> As <\/span>Match\r\n    <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n    strText = \"Tel: 0234-567890, \" _\r\n        & \"Fax: 0234\/567891, \" _\r\n        & \"Mobil: + 170 1234567\"\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"(\\+?\\d[\\d\\s\/-]{6,}\\d)\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> colMatches = rx.Execute(strText)\r\n    For Each objMatch In colMatches\r\n        <span style=\"color:blue;\">Debug.Print<\/span> objMatch.Value\r\n    <span style=\"color:blue;\">Next<\/span> objMatch\r\n    'Ausgabe:\r\n    '0234-567890\r\n    '0234\/567891\r\n    '+ 170 1234567\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Muster beginnt mit einem optionalen Pluszeichen, erwartet dann eine Ziffer, gefolgt von mindestens sechs Zeichen, die Ziffern, Leerzeichen, Schr&auml;gstriche oder Bindestriche sein d&uuml;rfen, und endet wieder mit einer Ziffer. Damit werden die g&auml;ngigsten deutschen Schreibweisen abgedeckt.<\/p>\n<h2>Postleitzahlen validieren<\/h2>\n<p>Deutsche Postleitzahlen bestehen aus exakt f&uuml;nf Ziffern. Die folgende Funktion pr&uuml;ft, ob eine Eingabe diesem Format entspricht.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IstGueltigePLZ(strPLZ<span style=\"color:blue;\"> As String<\/span>) _\r\n       <span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"^\\d{5}$\"\r\n    IstGueltigePLZ = rx.Test(strPLZ)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Hier sind einige Beispielaufrufe:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> IstGueltigePLZ(\"47137\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstGueltigePLZ(\"4100\")\r\n<span style=\"color:blue;\">Debug.Print<\/span> IstGueltigePLZ(\"D-47137\")<\/pre>\n<h2>Unerw&uuml;nschte Zeichen entfernen<\/h2>\n<p>Bei der Datenbereinigung m&ouml;chte man manchmal alle Zeichen entfernen, die nicht einem bestimmten Satz angeh&ouml;ren. Mit einer negierten Zeichenklasse gelingt das m&uuml;helos.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>NurZiffern(strText<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"[^0-9]\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    NurZiffern = rx.<span style=\"color:blue;\">Replace<\/span>(strText, \"\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Der Aufruf <b>NurZiffern(&#8220;Tel: +-170\/123 4567&#8221;) <\/b>liefert als Ergebnis &#8220;1701234567&#8221;. Die negierte Zeichenklasse <b>[^0-9] <\/b>erfasst jedes Zeichen, das keine Ziffer ist, und <b>Replace<\/b> entfernt es.<\/p>\n<h2>CamelCase in W&ouml;rter aufl&ouml;sen<\/h2>\n<p>Bezeichner in <b>CamelCase<\/b>-Schreibweise lassen sich mit einem regul&auml;ren Ausdruck in einzelne W&ouml;rter aufl&ouml;sen, indem vor jedem Gro&szlig;buchstaben, dem ein Kleinbuchstabe vorausgeht, ein Leerzeichen eingef&uuml;gt wird.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CamelCaseAufloesen(strText<span style=\"color:blue;\"> As String<\/span>) _\r\n       <span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"([a-z])([A-Z])\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    CamelCaseAufloesen = rx.<span style=\"color:blue;\">Replace<\/span>(strText, \"$1 $2\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Der Aufruf <b>CamelCaseAufloesen(&#8220;KundenNummer&#8221;) <\/b>liefert &#8220;Kunden Nummer&#8221;. Die zwei Gruppen (<b>$1 <\/b>f&uuml;r den Kleinbuchstaben, <b>$2 <\/b>f&uuml;r den Gro&szlig;buchstaben) werden im Ersetzungstext durch ein Leerzeichen getrennt wieder eingesetzt.<\/p>\n<h2>URLs aus einem Text extrahieren<\/h2>\n<p>Das folgende Beispiel zeigt, wie Du alle URLs aus einem Flie&szlig;text herausfiltern kannst. Das Muster erkennt sowohl <b>http<\/b>&#8211; als auch <b>https<\/b>-Adressen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>URLsExtrahieren()\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Dim <\/span>colMatches<span style=\"color:blue;\"> As <\/span>MatchCollection\r\n    <span style=\"color:blue;\">Dim <\/span>objMatch<span style=\"color:blue;\"> As <\/span>Match\r\n    <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n    strText = _\r\n        \"Besuche https:\/\/www.example.com\" _\r\n        & \" oder http:\/\/test.de\/seite\"\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = \"https?:\/\/[^\\s]+\"\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    rx.IgnoreCase = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> colMatches = rx.Execute(strText)\r\n    For Each objMatch In colMatches\r\n        <span style=\"color:blue;\">Debug.Print<\/span> objMatch.Value\r\n    <span style=\"color:blue;\">Next<\/span> objMatch\r\n    'Ausgabe:\r\n    'https:\/\/www.example.com\r\n    'http:\/\/test.de\/seite\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Fragezeichen nach dem &#8220;s&#8221; in <b>https? <\/b>macht das &#8220;s&#8221; optional, sodass sowohl <b>http <\/b>als auch <b>https <\/b>erkannt werden.<\/p>\n<p>Der Ausdruck <b>[^\\s]+ <\/b>liest dann alle folgenden Zeichen bis zum n&auml;chsten Whitespace.<\/p>\n<h2>Wiederverwendung als Hilfsfunktionen<\/h2>\n<p>Wenn Du regul&auml;re Ausdr&uuml;cke h&auml;ufig verwendest, lohnt es sich, allgemeine Hilfsfunktionen zu erstellen, die Du in verschiedenen Projekten einsetzen kannst. Die folgenden drei Funktionen decken die wichtigsten Anwendungsf&auml;lle ab: Pr&uuml;fen, Ersetzen und Extrahieren.<\/p>\n<p>Die erste Funktion pr&uuml;ft, ob das &uuml;bergebene Muster in der Zeichenkette vorkommt, und gibt <b>True <\/b>oder <b>False <\/b>zur&uuml;ck. Der optionale Parameter <b>bolIgnoreCase <\/b>steuert, ob die Gro&szlig;-\/Kleinschreibung ignoriert werden soll:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RegExTest(strText<span style=\"color:blue;\"> As String<\/span>, _\r\n        strPattern<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> bolIgnoreCase _\r\n       <span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">False<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = strPattern\r\n    rx.IgnoreCase = bolIgnoreCase\r\n    RegExTest = rx.Test(strText)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Funktion <b>RegExReplace <\/b>ersetzt alle Vorkommen des Musters in der Zeichenkette durch den angegebenen Ersetzungstext.<\/p>\n<p>Im Ersetzungstext kannst Du mit <b>$1<\/b>, <b>$2 <\/b>und so weiter auf einfangende Gruppen zugreifen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RegEx<span style=\"color:blue;\">Replace<\/span>(strText<span style=\"color:blue;\"> As String<\/span>, _\r\n        strPattern<span style=\"color:blue;\"> As String<\/span>, strReplace<span style=\"color:blue;\"> As String<\/span>, _\r\n        <span style=\"color:blue;\">Optional<\/span> bolIgnoreCase<span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">False<\/span>) _\r\n       <span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = strPattern\r\n    rx.Global = <span style=\"color:blue;\">True<\/span>\r\n    rx.IgnoreCase = bolIgnoreCase\r\n    RegEx<span style=\"color:blue;\">Replace<\/span> = rx.<span style=\"color:blue;\">Replace<\/span>(strText, strReplace)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Funktion <b>RegExExtract<\/b> gibt den ersten Treffer des Musters in der Zeichenkette zur&uuml;ck. Wird kein Treffer gefunden, liefert die Funktion eine leere Zeichenkette:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RegExExtract(strText<span style=\"color:blue;\"> As String<\/span>, _\r\n        strPattern<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> bolIgnoreCase _\r\n       <span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">False<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>rx<span style=\"color:blue;\"> As <\/span>RegExp\r\n    <span style=\"color:blue;\">Dim <\/span>colMatches<span style=\"color:blue;\"> As <\/span>MatchCollection\r\n    <span style=\"color:blue;\">Set<\/span> rx = <span style=\"color:blue;\">New<\/span> RegExp\r\n    rx.Pattern = strPattern\r\n    rx.IgnoreCase = bolIgnoreCase\r\n    <span style=\"color:blue;\">Set<\/span> colMatches = rx.Execute(strText)\r\n    <span style=\"color:blue;\">If <\/span>colMatches.Count &gt; 0<span style=\"color:blue;\"> Then<\/span>        RegExExtract = colMatches(0).Value    Else        RegExExtract = \"\"    End If\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Alle drei Funktionen akzeptieren einen optionalen Parameter f&uuml;r die Gro&szlig;-\/Kleinschreibung.<\/p>\n<h2>Hinweis zur Performance<\/h2>\n<p>Das Erzeugen eines <b>RegExp<\/b>-Objekts ist vergleichsweise aufwendig.<\/p>\n<p>Wenn Du denselben Ausdruck auf viele Zeichenketten anwendest, zum Beispiel in einer Schleife &uuml;ber Tausende von Datens&auml;tzen, solltest Du das Objekt einmal erstellen und wiederverwenden, anstatt es in jedem Schleifendurchlauf neu zu instanziieren.<\/p>\n<p>In den Hilfsfunktionen k&ouml;nntest Du dazu mit einer <b>Static<\/b>-Variablen arbeiten, die das Objekt &uuml;ber mehrere Aufrufe hinweg am Leben h&auml;lt.<\/p>\n<h2>Was ist mit FileSystemObject und Dictionary?<\/h2>\n<p>Neben der <b>RegExp<\/b>-Klasse hatten viele Entwickler auch Sorgen um zwei weitere h&auml;ufig genutzte VBScript-Komponenten: das <b>FileSystemObject<\/b> und die <b>Dictionary<\/b>-Klasse.<\/p>\n<p>Beide geh&ouml;ren zur Microsoft Scripting Runtime (<b>scrrun.dll<\/b>), nicht zur <b>vbscript.dll<\/b>. Recherchen des Access-Forever-Teams haben best&auml;tigt, dass weder das <b>FileSystemObject<\/b> noch das <b>Dictionary<\/b>-Objekt von der VBScript-Abschaffung betroffen sein werden.<\/p>\n<p>Beide Objekte bleiben auch nach Entfernung der VBScript-Komponente aus Windows weiterhin verf&uuml;gbar.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Die Integration der <b>RegExp<\/b>-Klassen in die VBA-Objektbibliothek ist eine willkommene Neuerung, die sowohl die Zukunftssicherheit bestehender Projekte als auch den Komfort bei der Neuentwicklung verbessert.<\/p>\n<p>Die vier Klassen <b>RegExp<\/b>, <b>Match<\/b>, <b>MatchCollection<\/b> und <b>SubMatches<\/b> bieten alles, was Du f&uuml;r Mustersuche, Validierung und Texttransformation brauchst. Early Binding steht ab Version 2508 ohne zus&auml;tzlichen Verweis zur Verf&uuml;gung.<\/p>\n<p>Late Binding mit <b>CreateObject(&#8220;VBScript.RegExp&#8221;) <\/b>funktioniert weiterhin, solange die <b>VBScript<\/b>-Komponente im System verf&uuml;gbar ist.<\/p>\n<p>Da Microsoft VBScript schrittweise aus Windows entfernt, solltest Du langfristig auf Early Binding umstellen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>RegulaereAusdrueckeInVBA.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/94E41EE3-F6B6-4CE0-9A46-A29A56FC5A25\/vbe_508.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seit Office Version 2508 sind regul&auml;re Ausdr&uuml;cke direkt in die VBA-Objektbibliothek integriert. Damit entf&auml;llt der bisherige Umweg &uuml;ber einen externen Verweis auf die VBScript-Bibliothek. Dieser Artikel erkl&auml;rt die Hintergr&uuml;nde dieser &Auml;nderung, stellt alle Klassen und ihre Mitglieder vor und zeigt anhand zahlreicher Beispiele, wie Du regul&auml;re Ausdr&uuml;cke in Deinen VBA-Projekten einsetzen kannst.<\/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,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022026,662026,44000024,44000027,44000026,44000030,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000508","post","type-post","status-publish","format-standard","hentry","category-66022026","category-662026","category-Berichte_und_Reporting","category-Excel_programmieren","category-Outlook_programmieren","category-PowerPoint_programmieren","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000508","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000508"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000508\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000508"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}