{"id":55000753,"date":"2010-12-01T00:00:00","date_gmt":"2020-05-22T22:08:52","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=753"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Suchen_und_ersetzen_mit_regulaeren_Ausdruecken","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/","title":{"rendered":"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/07ae7148aa3646e9977c92e048d0d5be\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Regul&auml;re Ausdr&uuml;cke dienen mitunter nicht nur der Mustererkennung, sondern leisten hervorragende Dienste beim Ersetzen bestimmter Zeichenfolgen. Damit Sie unter VBA von regul&auml;ren Ausdr&uuml;cken profitieren k&ouml;nnen, lernen Sie in diesem Beitrag die grundlegenden Techniken kennen und erfahren, wie Sie beinahe beliebige Ausdr&uuml;cke in Zeichenketten erkennen und ersetzen k&ouml;nnen. Schlie&szlig;lich liefert der Betrag ein Beispiel zum Erkennen der VBA-Schl&uuml;sselw&ouml;rter in Codemodulen.<\/b><\/p>\n<p>Regul&auml;re Ausdr&uuml;cke (<b>Regular Expressions<\/b>, kurz <b>RegExp<\/b>) dienen zum Suchen und Ersetzen von Textelementen.<\/p>\n<p>Regul&auml;re Ausdr&uuml;cke sind kein Bestandteil von VBA, sondern m&uuml;ssen &uuml;ber das Setzen eines Verweises auf die Bibliothek <b>Microsoft VBScript Regular Expressions 5.5 <\/b>verf&uuml;gbar gemacht werden.<\/p>\n<p>Im Code erzeugen Sie dann eine Instanz des Objekts <b>RegExp <\/b>und speichern den Verweis darauf in einer entsprechenden Objektvariablen:<\/p>\n<pre>Dim objRegExp As RegExp\r\nSet objRegExp = New RegExp<\/pre>\n<p>Das <b>RegExp<\/b>-Objekt hat einige wenige Eigenschaften, die folgende Aufgabe haben:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>IgnoreCase<\/b>: Legt fest, ob Gro&szlig;-\/Kleinschreibung beachtet werden soll.<\/li>\n<li class=\"aufz-hlung\"><b>Global<\/b>: Sollen nur das erste (Standard, <b>False<\/b>) oder alle Fundstellen (<b>True<\/b>) zur&uuml;ckgegeben werden<\/li>\n<li class=\"aufz-hlung\"><b>Pattern<\/b>: Legt das Muster fest, nach dem gesucht werden soll.<\/li>\n<li class=\"aufz-hlung\"><b>Multiline<\/b>: Gibt an, ob durch Zeilenumbr&uuml;che getrennte Teile einer Zeichenkette als neuer Ausdruck untersucht werden sollen. Dies erlaubt beispielsweise das Verwenden des Zeilenbeginn- und Zeilenende-Zeichens in Ausdr&uuml;cken. <\/li>\n<\/ul>\n<p><b>Aktionen<\/b><\/p>\n<p>Prinzipiell k&ouml;nnen Sie mit RegExp suchen oder suchen und ersetzen. Wenn Sie einfach nur pr&uuml;fen m&ouml;chten, ob ein Ausdruck in einem anderen Ausdruck vorkommt, geben Sie das Pattern an und pr&uuml;fen den zu durchsuchenden Ausdruck mit der <b>Test<\/b>-Funktion. Diese liefert <b>True<\/b> oder <b>False <\/b>zur&uuml;ck.<\/p>\n<p>Wenn Sie den gefundenen Ausdruck gleich ersetzen m&ouml;chten, verwenden Sie statt <b>Test <\/b>die <b>Replace<\/b>-Methode. Diese erwartet entsprechend gleich zwei Parameter, n&auml;mlich den zu durchsuchenden String sowie die Zeichenkette, die statt des in Pattern angegebenen Ausdrucks verwendet werden soll.<\/p>\n<p><b>Einfache Suche<\/b><\/p>\n<p>Die einfachste Suche realisieren die folgenden Codezeilen. Die Funktion pr&uuml;ft schlicht, ob sich der mit <b>strSuchbegriff <\/b>&uuml;bergebene Ausdruck in <b>strOriginal <\/b>befindet und gibt entweder <b>True <\/b>oder <b>False <\/b>zur&uuml;ck:<\/p>\n<pre>Public Function EinfacheSuche( _\r\n    strOriginal As String, _\r\n    strSuchbegriff As String) As Boolean\r\n    Dim objRegExp As RegExp\r\n    Set objRegExp = New RegExp\r\n    With objRegExp\r\n    .Pattern = strSuchbegriff\r\n    EinfacheSuche = .Test(strOriginal)\r\n    End With\r\n    Set objRegExp = Nothing\r\nEnd Function<\/pre>\n<p>Der folgende Ausdruck w&uuml;rde im Direktfenster also beispielsweise den Wert <b>True <\/b>zur&uuml;ckliefern:<\/p>\n<pre> EinfacheSuche(&quot;cd&quot;, &quot;abcdef&quot;)<\/pre>\n<p><b>Einfaches Suchen und Ersetzen<\/b><\/p>\n<p>Die einfachste Suchen- und Ersetzen-Funktion bildet (fast) die <b>Replace<\/b>-Funktion von VBA ab. Sie erwartet die gleichen Parameter, also den Originalausdruck, den zu ersetzenden Ausdruck und den Ersatzausdruck.<\/p>\n<p>Der Unterschied ist jedoch, dass hier nur das erste Auftreten des gesuchten Begriffs ersetzt wird. Der Grundaufbau ist wie beim reinen Suchen, allerdings kommt hier nicht die <b>Test<\/b>-Funktion, sondern die <b>Replace<\/b>-Funktion zum Einsatz.<\/p>\n<p>Diese erwartet zus&auml;tzlich den Ersatzbegriff als Parameter und liefert auch keinen Boolean-Wert zur&uuml;ck, sondern gleich die ge&auml;nderte Zeichenkette:<\/p>\n<pre>Public Function SuchenUndErsetzen( _\r\n    strOriginal As String, _\r\n    strSuchbegriff As String, _\r\n    strErsatzbegriff As String) As String\r\n    Dim objRegExp As RegExp\r\n    Set objRegExp = New RegExp\r\n    With objRegExp\r\n    .Pattern = strSuchbegriff\r\n    SuchenUndErsetzen = _\r\n    .Replace(strOriginal, strErsatzbegriff)\r\n    End With\r\n    Set objRegExp = Nothing\r\nEnd Function<\/pre>\n<p>Ein einfacher Aufruf sieht wie folgt aus und liefert das entsprechende Ergebnis zur&uuml;ck:<\/p>\n<pre> EinfachesSuchenUndErsetzen(&quot;abcdef&quot;, &quot;cd&quot;, &quot;xx&quot;)\r\nabxxef<\/pre>\n<p>Es kann auch sein, dass der Suchbegriff gleich mehrfach im Originalausdruck vorkommt. Um die <b>Replace<\/b>-Funktion von VBA vollwertig abzubilden, m&uuml;ssen wir den Suchbegriff an allen vorkommenden Stellen ersetzen. Dazu brauchen Sie einfach noch die Eigenschaft <b>Global <\/b>von <b>objRegExp <\/b>auf <b>True <\/b>einzustellen.<\/p>\n<p><b>Alle Fundstellen einzeln betrachten<\/b><\/p>\n<p>Gegebenenfalls sollen nicht alle Suchergebnisse &uuml;ber einen Kamm geschert werden, sondern Sie m&ouml;chten diese einzeln behandeln.<\/p>\n<p>Dann sind das <b>MatchCollection<\/b>&#8211; und das <b>Match<\/b>-Objekt interessant. Sie m&uuml;ssen f&uuml;r beide eine Objektvariable deklarieren:<\/p>\n<pre>Dim objMatchCollection As MatchCollection\r\nDim objMatch As Match<\/pre>\n<p>Danach &uuml;bergeben Sie das Ergebnis der <b>Execute<\/b>-Methode im <b>MatchCollection<\/b>-Objekt und durchlaufen alle darin enthaltenen <b>Match<\/b>-Objekte und geben einige Information pro Fundstelle aus:<\/p>\n<pre>Set objRegExp = New RegExp\r\nWith objRegExp\r\n.Pattern = strSuchbegriff\r\n.Global = True\r\nSet objMatchCollection = _\r\n.Execute(strOriginal)\r\nFor Each objMatch In objMatchCollection\r\n Debug.Print &quot;Position: &quot; _\r\n    &amp; objMatch.FirstIndex, &quot;Wert: &quot; _\r\n    &amp; objMatch.Value, &quot;L&auml;nge: &quot; _\r\n    &amp; objMatch.Length\r\nNext objMatch\r\nEnd With<\/pre>\n<p>Ein Beispielaufruf sieht etwa so aus:<\/p>\n<pre>SuchergebnisseEinzelnBearbeiten &quot;abcdefcd&quot;, &quot;cd&quot;\r\nPosition: 2 Wert: cd L&auml;nge: 2\r\nPosition: 6 Wert: cd L&auml;nge: 2<\/pre>\n<p>Das <b>Match<\/b>-Objekt liefert n&uuml;tzliche Informationen. Im obigen Beispiel geben wir die folgenden drei je Fundstelle aus:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>FirstIndex<\/b>: Position, an welcher der Suchbegriff befindet. Achtung: 0-basiert!<\/li>\n<li class=\"aufz-hlung\"><b>Value<\/b>: Wert des gefundenen Ausdrucks. Im einfachen Beispiel von oben entspricht dieser nat&uuml;rlich immer dem Suchausdruck. Aber da dieser auch mit Platzhaltern angegeben werden kann, kann durchaus jeder Treffer anders aussehen.<\/li>\n<li class=\"aufz-hlung\"><b>Length<\/b>: Hier gilt das Gleiche wie f&uuml;r den Treffer selbst: Seine L&auml;nge kann ja nach Formulierung des Suchbegriffs durchaus variieren. Beispiele folgen!<\/li>\n<\/ul>\n<p><b>Ausdr&uuml;cke zusammenstellen<\/b><\/p>\n<p>Nachdem Sie wichtige Grundtechniken f&uuml;r den Einsatz regul&auml;rer Ausdr&uuml;cke kennengelernt haben, schauen wir uns nun die Ausdr&uuml;cke beziehungsweise die sogenannten Pattern selbst an.<\/p>\n<p>Die einfachste M&ouml;glichkeit ist nat&uuml;rlich die Angabe einer konkreten Zeichenkette. Sicher kennen Sie das Sternchen und das Fragezeichen als Platzhalter f&uuml;r beliebig viele beziehungsweise ein einziges Zeichen in Access-SQL-Bedingungen.<\/p>\n<p>Regul&auml;re Ausdr&uuml;cke bieten hier wesentlich aufgefeiltere M&ouml;glichkeiten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Punkt (<b>.<\/b>): Beliebiges Zeichen au&szlig;er Zeilenumbruch. <b>a. <\/b>findet also etwa <b>ab<\/b>, <b>ac <\/b>oder <b>a1<\/b>.<\/li>\n<li class=\"aufz-hlung\">Sternchen (<b>*<\/b>): Keine, eine oder mehrere Wiederholungen des vorhergehenden Zeichens. <b>abc* <\/b>w&uuml;rde also beispielsweise <b>ab<\/b>, <b>abc<\/b>, <b>abcc <\/b>oder <b>abccc <\/b>finden.<\/li>\n<li class=\"aufz-hlung\">Fragezeichen (<b><\/b>): Kein oder ein Vorkommen des vorhergehenden Zeichens. <b>abc <\/b>findet also etwa <b>ab <\/b>oder <b>abc<\/b>.<\/li>\n<li class=\"aufz-hlung\">Pluszeichen (<b>+<\/b>): Ein oder mehrere Vorkommen des vorhergehenden Zeichens. <b>abc+ <\/b>findet also etwa <b>abc<\/b>, <b>abcc <\/b>oder <b>abccc<\/b>.<\/li>\n<li class=\"aufz-hlung\">Geschweifte Klammern (<b>{}<\/b>): In den Klammern k&ouml;nnen ein oder zwei durch Komma getrennte Zahlen stehen, die eine Information &uuml;ber die Anzahl des Vorkommens des vorhergehenden Zeichens enthalten. Eine einzige Zahl gibt die genaue Anzahl an, <b>a{3} <\/b>ist somit Platzhalter f&uuml;r <b>aaa<\/b>. Zwei durch Komma getrennte Zahlen geben kleinste und gr&ouml;&szlig;te Anzahl des vorherigen Zeichens an, <b>a{1,3} <\/b>ist also Platzhalter f&uuml;r <b>a<\/b>, <b>aa <\/b>und <b>aaa<\/b>. Fehlt die Zahl vor dem Komma, wird dort der Wert <b>0 <\/b>angenommen. <b>ab{,2} <\/b>ist also Platzhalter f&uuml;r <b>a<\/b>, <b>ab <\/b>und <b>abb<\/b>. Fehlt die Zahl nach dem Komma, kann die maximale Anzahl beliebig gro&szlig; sein. <b>ab{1,} <\/b>steht also f&uuml;r <b>ab<\/b>, <b>abb<\/b>, <b>abbb <\/b>und so weiter.<\/li>\n<li class=\"aufz-hlung\">Eckige Klammern (<b>[]<\/b>) definieren Zeichenklassen. <b>[abc] <\/b>repr&auml;sentiert eines der Zeichen <b>a<\/b>, <b>b <\/b>oder <b>c<\/b>. <b>[a-z] <\/b>entspricht allen Buchstaben von <b>a <\/b>bis <b>z<\/b>.<\/li>\n<li class=\"aufz-hlung\">Eckige Klammern k&ouml;nnen auch auszuschlie&szlig;ende Zeichen angeben. Dazu enth&auml;lt die Klammer als erstes das Caret-Zeichen (<b>^<\/b>). <b>[^abc] <\/b>entspricht allen Zeichen au&szlig;er <b>a<\/b>, <b>b <\/b>und <b>c<\/b>.<\/li>\n<li class=\"aufz-hlung\">Eckige Klammern k&ouml;nnen auch nicht zusammenh&auml;ngende Zeichen oder Bereiche enthalten. <b>[abd-f] <\/b>ist beispielsweise Platzhalter f&uuml;r die Buchstaben <b>a<\/b>, <b>b<\/b>, <b>d<\/b>, <b>e <\/b>und <b>f<\/b>.<\/li>\n<li class=\"aufz-hlung\">Spezielle Platzhalter sind <b>\\d <\/b>(alle Zahlen), <b>\\D <\/b>(keine Zahl), <b>\\w <\/b>(Buchstabe, Zahl oder Unterstrich), <b>\\W <\/b>(alles au&szlig;er Buchstaben, Zahlen oder Unterstrich), <b>\\s <\/b>(Leerzeichen, Tabulator, Zeilenumbruch) oder <b>\\S <\/b>(alles au&szlig;er Leerzeichen, Tabulator, Zeilenumbruch).<\/li>\n<li class=\"aufz-hlung\">Alternativen werden in Klammern und durch das Pipe-Zeichen (<b>|<\/b>) getrennt angegeben. <b>(abc|efg) <\/b>steht so f&uuml;r eine der Zeichenfolgen <b>abc <\/b>oder <b>efg<\/b>.<\/li>\n<li class=\"aufz-hlung\">Caret-Zeichen (<b>^<\/b>): Steht f&uuml;r den Zeilen- beziehungsweise Zeichenkettenbeginn. <b>^Sub <\/b>liefert also alle Fundstellen, bei den <b>Sub <\/b>am Zeilenanfang steht. Das Caret-Zeichen steht normalerweise nur stellvertretend f&uuml;r den Beginn der kompletten Zeichenkette, unabh&auml;ngig davon, ob diese noch Zeilenumbr&uuml;che enth&auml;lt. Wenn eine neue Zeile ebenfalls mit dem Caret-Zeichen erkannt werden soll, m&uuml;ssen Sie zuvor die Eigenschaft <b>Multiline <\/b>auf <b>True <\/b>einstellen.<\/li>\n<li class=\"aufz-hlung\">Dollar-Zeichen (<b>$<\/b>): Steht f&uuml;r das Zeilen- beziehungsweise Zeichenkettenende. <b>Sub$ <\/b>liefert also solche Fundstellen, bei denen <b>Sub <\/b>am Ende steht. Gut, um beispielsweise Prozedurenden zu finden. Bez&uuml;glich Zeilenumbr&uuml;che gilt hier das Gleiche wie beim Caret-Zeichen: Sie m&uuml;ssen die Eigenschaft <b>Multiline <\/b>auf <b>True <\/b>einstellen, damit jedes Zeilenende und nicht nur das Ende des kompletten Ausdrucks &uuml;ber das Dollar-Zeichen erkannt werden soll.<\/li>\n<li class=\"aufz-hlung\">Backslash (<b>\\<\/b>): M&ouml;glicherweise m&ouml;chten Sie in Texten auch nach Sonderzeichen suchen, die eine spezielle Funktion in regul&auml;ren Ausdr&uuml;cken haben. In diesem Fall stellen Sie dem Zeichen einen Backslash voran. Mit <b>abc\\$ <\/b>suchen Sie also dann schlicht nach der Zeichenkette <b>abc$ <\/b>und nicht etwa nach einem Vorkommen von <b>abc <\/b>am Zeilenende oder am Ende der Zeichenkette.<\/li>\n<li class=\"aufz-hlung\">Wagenr&uuml;cklauf (<b>\\r<\/b>): entspricht <b>vbCr<\/b><\/li>\n<li class=\"aufz-hlung\">Zeilenvorschub (<b>\\n<\/b>): entspricht <b>vbLf<\/b><\/li>\n<li class=\"aufz-hlung\">Wagenr&uuml;cklauf und Zeilenvorschub (<b>\\r\\n<\/b>): entspricht <b>vbCrLf<\/b><\/li>\n<li class=\"aufz-hlung\">Tabulator (<b>\\t<\/b>): entspricht <b>vbTab<\/b><\/li>\n<\/ul>\n<p><!--30percent--><\/p>\n<p><b>Suchen und ersetzen<\/b><\/p>\n<p>Mit der Kenntnis der m&ouml;glichen Ausdr&uuml;cke und ein wenig &Uuml;bung werden Sie schnell die gew&uuml;nschten Zeichenketten finden. Es gibt jedoch noch einen sehr wichtigen Tipp f&uuml;r das Ersetzen von Zeichenketten.<\/p>\n<p>Bei der <b>Replace<\/b>-Funktion von VBA tauschen Sie einfach einen Teilausdruck gegen einen anderen aus, wobei ersterer dem Suchbegriff entspricht. Wenn Sie dort nun beispielsweise den Ausdruck <b>cde <\/b>nicht &uuml;berall durch <b>xyz<\/b> m&ouml;chten, sondern nur dort, wo der Ausdruck in einem bestimmten Kontext steht (also beispielsweise dort, wo er in bestimmte andere Zeichenfolgen eingefasst ist &#8211; beispielsweise <b>abcdefg<\/b>), m&uuml;ssen Sie erst nach <b>abcdefg <\/b>suchen und dann m&uuml;hsam mit weiteren Zeichenkettenfunktionen den darin enthaltenen Ausdruck ersetzen.<\/p>\n<p><b>ab <\/b>und <b>fg <\/b>stehen hier stellvertretend f&uuml;r variable Ausdr&uuml;cke &#8211; sonst k&ouml;nnten Sie ja auch einfach <b>abcdefg <\/b>durch <b>abxyzfg <\/b>ersetzen!<\/p>\n<p>Regul&auml;re Ausdr&uuml;cke bieten hier eine tolle Variante: Sie k&ouml;nnen dort einfach den Bereich, der nicht ausgetauscht werden soll, in Klammern einfassen und diesen nachher in den neuen Ausdruck integrieren. Sie suchen also nach folgendem Ausdruck:<\/p>\n<pre>(ab)cde(fg)<\/pre>\n<p>Nun soll der mittlere Teil (cde) &uuml;berall durch xyz ersetzt, die umschlie&szlig;enden Teile aber beibehalten werden. Dann geben Sie als neuen Ausdruck einfach den folgenden an:<\/p>\n<pre>$1xyz$2<\/pre>\n<p><b>$1 <\/b>wird in diesem Fall durch den ersten in Klammern eingefassten Ausdruck ersetzt, <b>$2 <\/b>durch den zweiten. Auf diese Weise k&ouml;nnen Sie beliebig viele Elemente des Suchausdrucks in den Ersatzausdruck hin&uuml;berretten.<\/p>\n<p><b>Vertauschen<\/b><\/p>\n<p>Mit dieser Technik k&ouml;nnen Sie nat&uuml;rlich auch einfach Ausdr&uuml;cke vertauschen. Wenn Sie beispielsweise das Datumsformat in einem Text von <b>DD.MM.YYYY <\/b>in <b>YYYY\/MM\/DD <\/b>&auml;ndern m&ouml;chten, lautet der Suchausdruck wie folgt:<\/p>\n<pre>(\\d{1,2})\\.(\\d{1,2}).(\\d{4})<\/pre>\n<p>Der neue Ausdruck sieht so aus:<\/p>\n<pre>$3\/$2\/$1<\/pre>\n<p>Das bedeutet: Ein Auftreten von ein oder zwei Zahlen, einem Punkt, weiteren ein oder zwei Zahlen, einem weiteren Punkt und vier Zahlen soll ersetzt werden durch die vier Zahlen, einen Schr&auml;gstrich, die mittleren ein oder zwei Zahlen, einen weiteren Schr&auml;gstrich und die vorderen zwei Zahlen.<\/p>\n<p><b>Beispiel Pfad-\/Dateiname<\/b><\/p>\n<p>Wenn Sie aus einem Dateinamen mit Pfad nur den Pfad erhalten m&ouml;chten, geht das zwar auch mit den Zeichenkettenfunktionen von VBA recht einfach. Aber es ist ein gutes Beispiel f&uuml;r eine erste &Uuml;bung.<\/p>\n<p>Wie lautet die Anforderung, wenn wir aus <b>c:\\test\\test.txt <\/b>den Teil <b>c:\\test\\ <\/b>erhalten m&ouml;chten Genau: Liefere alles, was mit einem Backslash endet. Der entsprechende Ausdruck sieht so aus:<\/p>\n<pre>.*\\\\<\/pre>\n<p>Der Ausdruck liefert beliebig viele Zeichen, wobei das letzte ein Backslash sein muss. Warum liefert RegExp nicht nur <b>c:\\<\/b><\/p>\n<p>Weil es gierig ist: Es ermittelt erst die Zeichenfolge aus beliebig vielen Zeichen (<b>.*<\/b>) und geht dann von hinten nach vorne zum ersten Backslash zur&uuml;ck.<\/p>\n<p>Um nun nur den Dateinamen, also <b>test.txt <\/b>zu erhalten, probieren wir es andersherum:<\/p>\n<pre>\\\\.*<\/pre>\n<p>Dies gelingt jedoch nicht: RegExp sucht erst einen Backslash und h&auml;ngt dann die folgenden Zeichen an. Das Ergebnis sieht so aus:<\/p>\n<pre>\\test\\test.txt<\/pre>\n<p>Die richtige L&ouml;sung lautet:<\/p>\n<pre>[^\\\\]*$<\/pre>\n<p>Das Dollar-Zeichen sorgt daf&uuml;r, dass der Ausdruck das Ende der Zeichenkette einschlie&szlig;t, und der vordere Teil liefert beliebig viele aufeinanderfolgende Zeichen, die kein Backslash sind.<\/p>\n<p><b>Komplexes Beispiel: Schl&uuml;sselw&ouml;rter in VBA-Code markieren<\/b><\/p>\n<p>Im Beitrag <b>Berichte ohne Datenherkunft <\/b>(<b>www.access-im-unternehmen.de\/****<\/b>) sollen in einem Beispiel Schl&uuml;sselw&ouml;rter in VBA-Code farbig ausgegeben werden.<\/p>\n<p>Die Vorarbeit dazu soll mit Hilfe regul&auml;rer Ausdr&uuml;cke erledigt werden, und zwar durch Hervorheben der gesuchten Schl&uuml;sselw&ouml;rter durch Voranstellen einer speziellen Zeichenkombination (hier <b>\\@<\/b>).<\/p>\n<p>F&uuml;r einen ersten Versuch wollen wir die folgende typische Zeile anpassen:<\/p>\n<pre>Public Sub Test()<\/pre>\n<p>Diese soll nach dem Bearbeiten so aussehen:<\/p>\n<pre>\\@Public \\@Sub Test()<\/pre>\n<p>Die notwendige Funktion sieht wie folgt aus, wobei diese zun&auml;chst einen Suchausdruck enth&auml;lt, der nur aus wenigen Schl&uuml;sselw&ouml;rtern besteht:<\/p>\n<pre>Public Function SchluesselwoerterErsetzen(_\r\n    strModul As String) As String\r\n    Dim objRegExp As RegExp\r\n    Dim strSchluesselwoerter As String\r\n    Set objRegExp = New RegExp\r\n    strSchluesselwoerter = &quot;((Public|Private\r\n    |Friend|Sub|Function|Property|Get|\r\n    Set|Let|As|Optional))&quot;\r\n    With objRegExp\r\n    .Pattern = strSchluesselwoerter\r\n    .Global = True\r\n    SchluesselwoerterErsetzen = _\r\n    .Replace(strModul, &quot;\\@$1&quot;)\r\n    End With\r\n    Set objRegExp = Nothing\r\nEnd Function<\/pre>\n<p>Der Aufruf erfolgt beispielsweise so und liefert gleich ein entsprechendes Ergebnis:<\/p>\n<pre> SchluesselwoerterErsetzen(&quot;Public Sub Test()&quot;)\r\n\\@Public \\@Sub Test()<\/pre>\n<p>Der erste Ansatz f&uuml;r den Suchausdruck soll zun&auml;chst nur die erste Zeile einer Prozedur durchforsten und enth&auml;lt daher nur die dort verwendeten Begriffe (die Datentypen fehlen noch):<\/p>\n<pre>((Public|Private|Friend|Sub|Function|Property|Get|Set|Let|As|Optional))<\/pre>\n<p>Der Ausdruck sucht nach einem der optionalen Schl&uuml;sselw&ouml;rter (optionale Ausdr&uuml;cke werden in Klammern eingefasst und durch das Pipe-Zeichen voneinander getrennt).<\/p>\n<p>Das zweite Klammernpaar sorgt daf&uuml;r, dass die Prozedur sich den Ausdruck merken kann.<\/p>\n<p>Beim Ersetzen mit der <b>Replace<\/b>-Methode soll dann der entsprechende Ausdruck wiederverwendet und um das f&uuml;hrende <b>\\@ <\/b>erg&auml;nzt werden.<\/p>\n<p>Wenn Sie die Prozedur gleich mit einer kompletten VBA-Routine durchexerzieren m&ouml;chten, brauchen Sie einen Verweis auf die Bibliothek <b>Microsoft Visual Basic for Applications Extensibility 5.3<\/b>. Sie k&ouml;nnen dann mit der folgenden Funktion auf den Code eines Moduls zugreifen:<\/p>\n<pre>Public Function GetModuleCode(strModule As _\r\n    String) As String\r\n    Dim objCodeModule As CodeModule\r\n    Set objCodeModule = VBE.ActiveVBProject.\r\n    VBComponents(strModule).CodeModule\r\n    GetModuleCode = objCodeModule.Lines(1,\r\n    objCodeModule.CountOfLines)\r\nEnd Function<\/pre>\n<p>Der Aufruf der Funktion <b>SchluesselwoerterErsetzen<\/b> f&uuml;r das Modul, indem diese Funktion selbst gespeichert ist, sorgt dann auch gleich f&uuml;r rege Betriebsamkeit im Direktfenster, wie Bild 1 zeigt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/RegExp_5-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Dieser Bericht druckt den Inhalt einer Textdatei.<\/span><\/b><\/p>\n<p>Allerdings ist die Funktion ein wenig &uuml;bereifrig: Die im Suchausdruck-String angegebenen Schl&uuml;sselw&ouml;rter wurden n&auml;mlich ebenfalls flei&szlig;ig mit dem Pr&auml;fix \\@ versehen &#8211; und das ist nicht beabsichtigt. Wir m&uuml;ssen also Schl&uuml;sselw&ouml;rter innerhalb von Anf&uuml;hrungszeichen ausschlie&szlig;en.<\/p>\n<p>Solche Ausnahmef&auml;lle wie zu ignorierende Suchbegriffe innerhalb von Anf&uuml;hrungszeichen treten oft auf. So oft, dass wir die Schl&uuml;sselw&ouml;rter zun&auml;chst einmal separat betrachten und uns dann um Vereinfachung bem&uuml;hen.<\/p>\n<p><b>Option-Schl&uuml;sselwort entfernen<\/b><\/p>\n<p>Das <b>Option<\/b>-Schl&uuml;sselwort ist einfach zu behandeln: Es steht sicher nur am Beginn einer Zeile. Die folgende Prozedur sucht nach dem Ausdruck <b>^(Option)( )<\/b>, also nach einem Zeilenbeginn, dem Schl&uuml;sselwort <b>Option <\/b>und einem Leerzeichen.<\/p>\n<p>Der Ausdruck <b>Option <\/b>und das Leerzeichen werden jeweils in Klammern eingefasst, damit wir diese Ausdr&uuml;cke beim Ersetzen mit <b>$1 <\/b>und <b>$2 <\/b>referenzieren k&ouml;nnen.<\/p>\n<p>Es werden also alle Vorkommen dieses Ausdrucks durch den gleichen Ausdruck mit vorangestelltem <b>\\@ <\/b>und abschlie&szlig;endem <b>\\\\ <\/b>ersetzt (Letzteres scheint notwendig, damit Nicht-Schl&uuml;sselw&ouml;rter wieder anders formatiert werden k&ouml;nnen):<\/p>\n<pre>Public Function SchluesselwoerterErsetzen( _\r\n    strModul As String) As String\r\n    Dim objRegExp As RegExp\r\n    Set objRegExp = New RegExp\r\n    With objRegExp\r\n    .Multiline = True\r\n    .Global = True\r\n    .Pattern = &quot;^(Option)( )&quot;\r\n    strModul = .Replace(strModul, &quot;\\@$1\\\\$2&quot;)\r\n    End With\r\n    SchluesselwoerterErsetzen = strModul\r\n    Set objRegExp = Nothing\r\nEnd Function<\/pre>\n<p>Die ersten beiden Zeilen eines typischen Access-Mdols sehen dann wie folgt aus:<\/p>\n<pre>\\@Option\\\\ Explicit\r\n\\@Option\\\\ Compare Database<\/pre>\n<p>Machen wir beim Schl&uuml;sselwort <b>Compare <\/b>weiter, das offensichtlich immer von zwei Leerzeichen eingefasst wird und f&uuml;gen die folgenden beiden Zeilen zur Prozedur hinzu:<\/p>\n<pre>.Pattern = &quot;( )(Compare)( )&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\$3&quot;)<\/pre>\n<p>F&uuml;r das Schl&uuml;sselwort <b>Database<\/b> k&ouml;nnen wir das Zeilenende-Symbol <b>$ <\/b>verwenden:<\/p>\n<pre>.Pattern = &quot;( )(Database)$&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\&quot;)<\/pre>\n<p>Die ersten beiden Zeilen des Moduls sehen nun so aus:<\/p>\n<pre>\\@Option\\\\ Explicit\r\n\\@Option\\\\ \\@Compare\\\\ \\@Database\\\\<\/pre>\n<p>Das schreit nach einer Vereinfachung, denn schlie&szlig;lich tauchen beide Zeilen jeweils im Zusammenhang auf.<\/p>\n<p>Die zeilenweise Behandlung sieht so aus:<\/p>\n<pre>.Pattern = &quot;^(Option Compare Database)&quot;\r\nstrModul = .Replace(strModul, &quot;\\@$1\\\\&quot;)\r\n.Pattern = &quot;^(Option Explicit)&quot;\r\nstrModul = .Replace(strModul, &quot;\\@$1\\\\&quot;)<\/pre>\n<p>Dies ist das Ergebnis:<\/p>\n<pre>\\@Option Explicit\\\\\r\n\\@Option Compare Database\\\\<\/pre>\n<p>Unser eigentliches Ziel, n&auml;mlich das Vorbereiten des Codes f&uuml;r die Ausgabe in einen Bericht und gleichzeitiges Einf&auml;rben der Ausdr&uuml;cke zwischen den Markierungen \\@ und \\\\ (s. Beitrag <b>Berichte ohne Datenherkunft<\/b>, <b>www.access-im-unternehmen.de\/****<\/b>), r&uuml;ckt damit auch n&auml;her: Immerhin gelingt das Einf&auml;rben weniger gro&szlig;er Zeichenketten dort sicher schneller als die Bearbeitung vieler kleiner Zeichenketten.<\/p>\n<p>Nun kann <b>Option Compare <\/b>neben <b>Database <\/b>noch die Optionen <b>Text <\/b>und <b>Binary <\/b>annehmen, sodass wir diese kleine Erweiterung zum Pattern hinzuf&uuml;gen:<\/p>\n<pre>.Pattern = &quot;^(Option Compare Database|Text|Binary)&quot;<\/pre>\n<p>Hier werden nun alle drei m&ouml;glichen Zeilen (<b>Option Compare Database<\/b>, <b>Option Compare Text <\/b>und <b>Option Compare Binary<\/b>) ber&uuml;cksichtigt.<\/p>\n<p><b>Prozedurk&ouml;pfe suchen<\/b><\/p>\n<p>Bei Prozedurk&ouml;pfen wird es interessanter. Eine Prozedur kann mit <b>Public<\/b>, <b>Private <\/b>oder <b>Friend <\/b>beginnen (oder auch ohne einen dieser Ausdr&uuml;cke), dann folgt gelegentlich das Schl&uuml;sselwort <b>Static <\/b>und schlie&szlig;lich <b>Sub <\/b>oder <b>Function<\/b>.<\/p>\n<p>In Klassen arbeiten wir auch mit Properties &#8211; dann folgt statt <b>Sub <\/b>oder <b>Function <\/b>der Ausdruck <b>Property Get<\/b>\/<b>Let<\/b>\/<b>Set<\/b>. Der passende regul&auml;re Ausdruck und die Ersetzung sehen so aus:<\/p>\n<pre>.Pattern = &quot;^(Public |Private |Friend )(Static )(Sub |Function |Property )(Get |Let |Set )&quot;\r\nstrModul = .Replace(strModul, &quot;\\@$1$2$3$4\\\\&quot;)<\/pre>\n<p>Das hei&szlig;t: Beginne am Zeilenbeginn und suche Ausdr&uuml;cke, die mit ein oder keinmal <b>Public<\/b>, <b>Private <\/b>oder <b>Friend <\/b>enthalten, ein oder keinmal das Schl&uuml;sselwort <b>Static<\/b>, eines der Schl&uuml;sselw&ouml;rter <b>Sub<\/b>, <b>Function <\/b>oder <b>Property <\/b>und schlie&szlig;lich ein oder keinmal <b>Get<\/b>, <b>Let <\/b>oder <b>Set<\/b>.In allen F&auml;llen sind die Leerzeichen wichtig &#8211; gerade bei <b>Get<\/b>\/<b>Let<\/b>\/<b>Set<\/b>: Wenn Sie dort das Leerzeichen weglassen, findet der Ausdruck n&auml;mlich auch Texte wie <b>Public Sub GetMember<\/b>.<\/p>\n<p><b>Parameterlisten, R&uuml;ckgabewerte und Deklarationen<\/b><\/p>\n<p>Prozedurk&ouml;pfe k&ouml;nnen aber noch mehr Elemente enthalten, n&auml;mlich Parameter und R&uuml;ckgabewerte. Diese sind aus dem Variablennamen, dem Schl&uuml;sselwort <b>As <\/b>und dem Datentyp aufgebaut, also beispielsweise <b>Date <\/b>oder <b>String<\/b>.<\/p>\n<p>An dieser Stelle behandeln wir lediglich die Datentypen der VBA-Bibliothek. Das Pattern und die Ersetzung sehen so aus:<\/p>\n<pre>.Pattern = &quot;( As )(Byte|Boolean|Integer|Long|\r\nCurrency|Decimal|Single|Double|Date|String|\r\nObject|Variant)&quot;\r\nstrModul = .Replace(strModul, &quot;\\@$1$2\\\\&quot;)<\/pre>\n<p>Bei den Deklarationen wie etwa <b>Dim str As String <\/b>fehlt noch das erste Schl&uuml;sselwort, also beispielsweise <b>Dim<\/b>, <b>Public <\/b>oder <b>Private<\/b>.<\/p>\n<p>Diese greifen wir mit dem folgenden Pattern ab:<\/p>\n<pre>.Pattern = &quot;^( *)(Dim |Public |Private |Static )&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\&quot;)<\/pre>\n<p>Damit erwischen wir alle Auftreten von <b>Dim<\/b>, <b>Public<\/b>, <b>Private <\/b>oder <b>Static<\/b>, die direkt am Zeilenbeginn stehen oder die maximal durch ein oder mehrere Leerzeichen vom Zeilenbeginn getrennt werden.<\/p>\n<p><b>If&#8230;Then-Bedingungen<\/b><\/p>\n<p>Die erste Zeile einer <b>If&#8230; Then<\/b>-Bedingung besteht aus keinem, einem oder mehreren Leerzeichen gefolgt von <b>If<\/b>, einem Ausdruck von einem oder mehreren beliebigen Zeichen und dem <b>Then<\/b>:<\/p>\n<pre>.Pattern = &quot;( *)(If )(.+)( Then)&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\$3\\@$4\\\\&quot;)<\/pre>\n<p>Der <b>Else<\/b>-Teil besteht schlicht aus keinem, einem oder mehreren Leerzeichen und dem Schl&uuml;sselwort <b>Else<\/b>:<\/p>\n<pre>.Pattern = &quot;( *)(Else)&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\&quot;)<\/pre>\n<p>ElseIf ist dann wieder genauso aufgebaut wie die eigentliche <b>If&#8230;Then<\/b>-Zeile:<\/p>\n<pre>.Pattern = &quot;( *)(ElseIf )(.+)( Then)&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\$3\\@$4\\\\&quot;)<\/pre>\n<p>Die <b>End If<\/b>-Zeile haken wir direkt gemeinsam mit der <b>End Select<\/b>-Zeile ab. Dies sieht dann so aus:<\/p>\n<pre>.Pattern = &quot;^( *)(End )(If|Select)$&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2$3\\\\&quot;)<\/pre>\n<p><b>Select Case<\/b><\/p>\n<p>Damit kommen wir gleich zum <b>Select Case<\/b>-Konstrukt.<\/p>\n<p>Die <b>Select Case<\/b>-Anweisung beginnt nach keinem, einem oder mehreren Leerzeichen hinter dem Zeilenbeginn und besteht aus dem <b>Select Case<\/b>-Schl&uuml;sselwort sowie einem aus einem oder mehreren Zeichen bestehenden Ausdruck:<\/p>\n<pre>.Pattern = &quot;^( *)(Select Case )(\\w+)&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\$3&quot;)<\/pre>\n<p>Die <b>Case<\/b>&#8211; und die <b>Case Else<\/b>-Zeile werden prinzipiell gleich behandelt: Nach dem Zeilenbeginn folgen beliebig viele Leerzeichen gefolgt vom jeweiligen Schl&uuml;sselwort.<\/p>\n<p>Da <b>Case <\/b>aber in <b>Case Else <\/b>enthalten ist, kann es bei der falschen Reihenfolge beim Ersetzen dazu kommen, dass erst <b>Case <\/b>durch <b>\\@Case\\\\ <\/b>ersetzt und dann <b>Case Else <\/b>nicht mehr erkannt wird. Also pr&uuml;fen wir erst auf <b>Case Else<\/b>:<\/p>\n<pre>.Pattern = &quot;^( *)(Case Else)&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\&quot;)<\/pre>\n<p>Erst danach k&uuml;mmern wir uns um die &uuml;briggelassen <b>Case<\/b>-Zeilen:<\/p>\n<pre>.Pattern = &quot;^( *)(Case )&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\&quot;)<\/pre>\n<p>Die <b>End Select<\/b>-Zeile haben wir ja bereits erledigt.<\/p>\n<p><b>VBA-Funktionen und -Prozeduren<\/b><\/p>\n<p>Interessant ist das Auftreten von VBA-Funktionen und -Methoden.<\/p>\n<p>Eine solche folgt im Regelfall auf ein Leerzeichen wie in folgendem Beispiel:<\/p>\n<pre>str = Left(&quot;bla&quot;, 2)<\/pre>\n<p>VBA-Funktionen werden aber auch gern verschachtelt wie in folgendem Beispiel:<\/p>\n<pre>str = Right(Left(&quot;bla&quot;,2),1)<\/pre>\n<p>Das bedeutet, dass wir nach f&uuml;hrenden Leerzeichen und &ouml;ffnenden Klammern suchen, gefolgt von der VBA-Funktion und einer schlie&szlig;enden Klammer oder auch einem Leerzeichen<\/p>\n<p>Dies erledigt der folgende Ausdruck:<\/p>\n<pre>.Pattern = &quot;(\\(| *)(Len|Left|Mid|Right|Split|UBound|LBound|InStr|InStrRev|Trim|LTrim|RTrim|MsgBox|RGB|Replace)( |\\()&quot;\r\nstrModul = .Replace(strModul, &quot;$1\\@$2\\\\$3&quot;)<\/pre>\n<p>Die Menge der VBA-Funktionen und -Prozeduren ist nat&uuml;rlich nicht vollst&auml;ndig &#8211; Sie k&ouml;nnen diese nach Ihren eigenen W&uuml;nschen erg&auml;nzen.<\/p>\n<p><b>Ausstieg aus &#8230;<\/b><\/p>\n<p>Sowohl aus Funktionen, Prozeduren, Property-Prozeduren, Bedingungen und Schleifen k&ouml;nnen Sie per VBA aussteigen. Dies gelingt mit der <b>Exit<\/b>-Anweisung, die Sie wie folgt erkennen:<\/p>\n<pre>.Pattern = &quot;(Exit )(Sub|Function|For|Do|Property)&quot;\r\nstrModul = .Replace(strModul, &quot;\\@$1$2\\\\&quot;)<\/pre>\n<p><b>Debug.Print<\/b><\/p>\n<p>Das <b>Debug<\/b>-Objekt liefert neben der <b>Print<\/b>-Methode auch noch die <b>Assert<\/b>-Methode. Beide finden Sie mit der folgenden Beschreibung:<\/p>\n<pre>.Pattern = &quot;(Debug.)(Print|Assert)&quot;\r\nstrModul = .Replace(strModul, &quot;\\@$1$2\\\\&quot;)<\/pre>\n<p><b>Prozedurf&uuml;&szlig;e<\/b><\/p>\n<p>Die <b>End<\/b>-Zeile nennen wir der Einfachheit halber Prozedurfu&szlig;. Dieser zeichnet sich vor allem durch das einleitende Schl&uuml;sselwort <b>End <\/b>aus. Danach folgen entweder <b>Sub<\/b>, <b>Function <\/b>oder <b>Property<\/b>. Leichte Beute, die wir mit dem folgenden Ausdruck erlegen:<\/p>\n<pre>.Pattern = &quot;^(End )(Sub|Function|Property)&quot;\r\nstrModul = .Replace(strModul, &quot;\\@$1$2\\\\&quot;)<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Regul&auml;re Ausdr&uuml;cke sind ein praktisches Mittel zum Suchen und Ersetzen von Zeichenketten nach bestimmten Mustern. Der Clou ist, dass Sie dabei auch die Bereiche vor und nach dem zu ersetzenden Ausdruck in die Suche einbeziehen k&ouml;nnen.<\/p>\n<p>Nat&uuml;rlich lassen sich nicht alle Muster durch einen einzigen Ausdruck erkennen, aber Sie k&ouml;nnen ja durchaus mehrere regul&auml;re Ausdr&uuml;cke definieren und diese inklusive Ersetzungen nacheinander auf den zu bearbeitenden Text loslassen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>RegulaereAusdruecke.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{A70035B9-DB02-443F-9965-8040CAC80253}\/aiu_753.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Regul&auml;re Ausdr&uuml;cke dienen mitunter nicht nur der Mustererkennung, sondern leisten hervorragende Dienste beim Ersetzen bestimmter Zeichenfolgen. Damit Sie unter VBA von regul&auml;ren Ausdr&uuml;cken profitieren k&ouml;nnen, lernen Sie in diesem Beitrag die grundlegenden Techniken kennen und erfahren, wie Sie beinahe beliebige Ausdr&uuml;cke in Zeichenketten erkennen und ersetzen k&ouml;nnen. Schlie&szlig;lich liefert der Betrag ein Beispiel zum Erkennen der VBA-Schl&uuml;sselw&ouml;rter in Codemodulen.<\/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":[662010,66062010,44000025],"tags":[],"class_list":["post-55000753","post","type-post","status-publish","format-standard","hentry","category-662010","category-66062010","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken - 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\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken\" \/>\n<meta property=\"og:description\" content=\"Regul&auml;re Ausdr&uuml;cke dienen mitunter nicht nur der Mustererkennung, sondern leisten hervorragende Dienste beim Ersetzen bestimmter Zeichenfolgen. Damit Sie unter VBA von regul&auml;ren Ausdr&uuml;cken profitieren k&ouml;nnen, lernen Sie in diesem Beitrag die grundlegenden Techniken kennen und erfahren, wie Sie beinahe beliebige Ausdr&uuml;cke in Zeichenketten erkennen und ersetzen k&ouml;nnen. Schlie&szlig;lich liefert der Betrag ein Beispiel zum Erkennen der VBA-Schl&uuml;sselw&ouml;rter in Codemodulen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:08:52+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/07ae7148aa3646e9977c92e048d0d5be\" \/>\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=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken\",\"datePublished\":\"2020-05-22T22:08:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/\"},\"wordCount\":3305,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/07ae7148aa3646e9977c92e048d0d5be\",\"articleSection\":[\"2010\",\"6\\\/2010\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/\",\"name\":\"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/07ae7148aa3646e9977c92e048d0d5be\",\"datePublished\":\"2020-05-22T22:08:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/07ae7148aa3646e9977c92e048d0d5be\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/07ae7148aa3646e9977c92e048d0d5be\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken\"}]},{\"@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":"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken - 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\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/","og_locale":"de_DE","og_type":"article","og_title":"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken","og_description":"Regul&auml;re Ausdr&uuml;cke dienen mitunter nicht nur der Mustererkennung, sondern leisten hervorragende Dienste beim Ersetzen bestimmter Zeichenfolgen. Damit Sie unter VBA von regul&auml;ren Ausdr&uuml;cken profitieren k&ouml;nnen, lernen Sie in diesem Beitrag die grundlegenden Techniken kennen und erfahren, wie Sie beinahe beliebige Ausdr&uuml;cke in Zeichenketten erkennen und ersetzen k&ouml;nnen. Schlie&szlig;lich liefert der Betrag ein Beispiel zum Erkennen der VBA-Schl&uuml;sselw&ouml;rter in Codemodulen.","og_url":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:08:52+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/07ae7148aa3646e9977c92e048d0d5be","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken","datePublished":"2020-05-22T22:08:52+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/"},"wordCount":3305,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/07ae7148aa3646e9977c92e048d0d5be","articleSection":["2010","6\/2010","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/","url":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/","name":"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/07ae7148aa3646e9977c92e048d0d5be","datePublished":"2020-05-22T22:08:52+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/07ae7148aa3646e9977c92e048d0d5be","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/07ae7148aa3646e9977c92e048d0d5be"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Suchen_und_ersetzen_mit_regulaeren_Ausdruecken\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Suchen und ersetzen mit regul&auml;ren Ausdr&uuml;cken"}]},{"@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\/55000753","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=55000753"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000753\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}