{"id":55001353,"date":"2022-02-01T00:00:00","date_gmt":"2022-01-31T15:18:29","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1353"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"VBACode_manipulieren_mit_der_CodeModuleKlasse","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/","title":{"rendered":"VBA-Code manipulieren mit der CodeModule-Klasse"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/d9c9abc8585b4e01a1c12aa5f3927e18\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie sich mit den anderen Beitr&auml;gen dieser Reihe bis zum VBComponent-Objekt eines Moduls vorgearbeitet haben, ist es nur noch ein Katzensprung bis zur CodeMod-ule-Klasse. Damit k&ouml;nnen Sie dann die Inhalte eines VBA-Moduls auslesen und bearbeiten. Dieser Beitrag zeigt, welche Methoden die CodeModule-Klasse bietet und wie Sie diese f&uuml;r die verschiedenen Anwendungszwecke einsetzen k&ouml;nnen.<\/b><\/p>\n<h2>Vorbereitung<\/h2>\n<p>Um die Elemente der Klasse <b>VBE<\/b> nutzen zu k&ouml;nnen, ben&ouml;tigen Sie einen Verweis auf die Bibliothek <b>Microsoft Visual Basic for Applications Extensibility 5.3 Object Library<\/b>, den Sie im <b>Verweise<\/b>-Dialog des VBA-Editors hinzuf&uuml;gen k&ouml;nnen (Men&uuml;eintrag <b>Extras|Verweise<\/b>).<\/p>\n<h2>Vorbereitende Beitr&auml;ge<\/h2>\n<p>Wenn Sie erfahren wollen, wie Sie &uuml;berhaupt bis zu der hier beschriebenen Klasse gelangen, helfen die folgenden Beitr&auml;ge weiter:<\/p>\n<ul>\n<li><b>VBA-Projekt per VBA referenzieren <\/b>(<b>www.access-im-unternehmen.de\/1337<\/b>)<\/li>\n<li><b>Zugriff auf den VBA-Editor mit der VBE-Klasse <\/b>(<b>www.access-im-unternehmen.de\/1350<\/b>)<\/li>\n<li><b>Zugriff auf VBA-Projekte per VBProject <\/b>(<b>www.access-im-unternehmen.de\/1351<\/b>)<\/li>\n<li><b>Module und Co. im Griff mit VBComponent <\/b>(<b>www.access-im-unternehmen.de\/1352<\/b>)<\/li>\n<\/ul>\n<h2>Elemente der VBComponent-Klasse<\/h2>\n<p>Die <b>CodeModule<\/b>-Klasse und ihre Eigenschaften, Methoden und Auflistungen k&ouml;nnen Sie im Objektkatalog im &Uuml;berblick ansehen, wenn Sie dort nach <b>CodeModule <\/b>suchen (siehe Bild 1). Hier sehen wir neben den Elementen dieser Klasse auch, dass diese sowohl ein Unterelement von <b>VBComponent <\/b>als auch von <b>CodePane <\/b>ist. Als Element von <b>VBComponent <\/b>k&ouml;nnen Sie es anlegen, und <b>CodePane <\/b>ist die Schnittstelle zwischen dem anzeigenden <b>Window<\/b>-Element im VBA-Editor und dem <b>CodeModule<\/b>-Objekt, das einige M&ouml;glichkeiten f&uuml;r den Zugriff auf den Code &uuml;ber die Benutzeroberfl&auml;che erm&ouml;glicht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_01\/pic_1353_001.png\" alt=\"Die CodeModule-Klasse im Objektkatalog\" width=\"499,5589\" height=\"514,225\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die CodeModule-Klasse im Objektkatalog<\/span><\/b><\/p>\n<p>Die Klasse <b>CodeModule <\/b>bietet folgende Elemente:<\/p>\n<ul>\n<li><b>AddFromFile<\/b>: F&uuml;gt VBA-Code aus der per Parameter angegebenen Textdatei hinzu.<\/li>\n<li><b>AddFromString<\/b>: F&uuml;gt VBA-Code aus der per Parameter &uuml;bergebenen Zeichenkette hinzu.<\/li>\n<li><b>CodePane<\/b>: Liefert einen Verweis auf das <b>CodePane<\/b>-Element, mit dem Sie speziell Zugriffsm&ouml;glichkeiten auf die angezeigte Version des <b>CodeModule<\/b>-Objekts haben &#8211; beispielsweise um Markierungen abzufragen oder zu setzen.<\/li>\n<li><b>CountOfDeclarationLines<\/b>: Liefert die Anzahl der Zeilen im Deklarationsbereich des Moduls.<\/li>\n<li><b>CountOfLines<\/b>: Liefert die gesamte Anzahl der Zeilen im Modul.<\/li>\n<li><b>CreateEventProc<\/b>: Erstellt eine Ereignisprozedur f&uuml;r das mit den beiden Parametern angegebene Ereignis und Objekt.<\/li>\n<li><b>DeleteLines<\/b>: L&ouml;scht die mit dem zweiten Parameter angegebene Anzahl von Zeilen ab der mit dem ersten Parameter angegebenen Zeile.<\/li>\n<li><b>Find<\/b>: Sucht nach dem mit dem ersten Parameter angegebenen Ausdruck und liefert mit den folgenden Parametern die Position des Fundorts zur&uuml;ck.<\/li>\n<li><b>InsertLines<\/b>: F&uuml;gt ab der mit dem ersten Parameter angegebenen Zeile den mit dem zweiten Parameter angegebenen Text im Modul ein.<\/li>\n<li><b>Lines<\/b>: Liefert den Inhalt einer oder mehrerer Zeilen, wobei der erste Parameter die Nummer der ersten Zeile und der zweite die Anzahl der Zeilen angibt.<\/li>\n<li><b>Parent<\/b>: Referenziert das &uuml;bergeordnete Objekt, in diesem Fall ein Objekt des Typs <b>VBComponent<\/b>.<\/li>\n<li><b>ProcBodyLine<\/b>: Liefert die Nummer der Zeile der angegebenen Prozedur mit dem <b>Sub|Function|Property<\/b>-Schl&uuml;sselwort.<\/li>\n<li><b>ProcCountLines<\/b>: Liefert die Anzahl der Zeilen einer Prozedur.<\/li>\n<li><b>ProcOfLine<\/b>: Gibt die Prozedur und den Typ der Prozedur f&uuml;r eine bestimmte Zeile zur&uuml;ck.<\/li>\n<li><b>ProcStartLine<\/b>: Liefert die Nummer der ersten Zeile nach der letzten Zeile der vorherigen Prozedur oder des allgemeinen Deklarationsteils.<\/li>\n<li><b>ReplaceLine<\/b>: Ersetzt die Zeile mit der im ersten Parameter angegebenen Nummer durch den mit dem zweiten Parameter angegebenen Text.<\/li>\n<li><b>VBE<\/b>: Referenziert das VBA-Editor-Objekt des <b>CodeModule<\/b>-Objekts.<\/li>\n<\/ul>\n<h2>Das CodeModule-Objekt referenzieren<\/h2>\n<p>Um das <b>CodeModule<\/b>-Objekt eines Moduls zu referenzieren, ben&ouml;tigen Sie zuerst Zugriff auf das entsprechende <b>VBComponent<\/b>-Element. Meist wollen Sie direkt auf ein bestimmtes Objekt zugreifen, dessen Namen Sie kennen. Dann k&ouml;nnen Sie dieses &uuml;ber die <b>VBComponents<\/b>-Auflistung des <b>VBProject<\/b>-Elements referenzieren.<\/p>\n<p>Das <b>VBComponent<\/b>-Element bietet dann &uuml;ber die <b>CodeModule<\/b>-Eigenschaft die M&ouml;glichkeit des Zugriffs auf das <b>CodeModule<\/b>-Objekt an. Im folgenden Beispiel referenzieren wir dieses und geben dann die Anzahl der Codezeilen in diesem <b>CodeModule<\/b>-Objekt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CodeModuleReferenzieren()\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBComponent\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     <span style=\"color:blue;\">Set<\/span> objVBComponent =  objVBProject.VBComponents(\"mdlVBE\")\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = objVBComponent.CodeModule\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objCodeModule.CountOfLines\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Code aus einer Textdatei hinzuf&uuml;gen<\/h2>\n<p>Mit der <b>Export<\/b>-Methode des <b>VBComponent<\/b>-Objekts k&ouml;nnen Sie eine Textdatei mit dessen Inhalt exportieren. Diese k&ouml;nnen Sie beispielsweise mit der <b>AddFromFile<\/b>-Methode der <b>CodeModule<\/b>-Klasse wieder einlesen.<\/p>\n<p>Wie das gelingt, zeigen wir in folgendem Beispiel. Hier legen wir ein neues, leeres <b>VBComponent<\/b>-Objekt an und nutzen dann die <b>AddFromFile<\/b>-Methode seines <b>CodeModule<\/b>-Objekts, um den Inhalt des exportierten Moduls in das neue Modul einzulesen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CodeModuleAddFromFile()\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBComponent\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     <span style=\"color:blue;\">Set<\/span> objVBComponent =  objVBProject.VBComponents.Add(vbext_ct_StdModule)\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = objVBComponent.CodeModule\r\n     objCodeModule.AddFromFile CurrentProject.Path  & \"\\Neu.txt\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Zu beachten ist hier, dass bei exportierten Modulen auch die Attribute mit exportiert werden, also zum Beispiel der Modulname.<\/p>\n<p>Dieser wird beim Importieren in ein vorhandenes Modul dann f&uuml;r das &uuml;bergeordnete <b>VBComponent<\/b>-Objekt verwendet.<\/p>\n<p>Sie k&ouml;nnen mit <b>AddFromFile <\/b>jedoch auch Textdateien mit dem reinen Inhalt des Moduls laden.<\/p>\n<h2>Code per Zeichenkette hinzuf&uuml;gen<\/h2>\n<p>Gegebenenfalls stellen Sie den Code f&uuml;r ein Modul in einer Textvariablen zusammen oder lesen diesen von anderer Stelle ein, beispielsweise aus einem Feld einer Datenbanktabelle. Wenn Sie den Inhalt der Variablen schnell in ein neues, leeres Modul einf&uuml;gen m&ouml;chten, bietet sich die Methode <b>AddFromString <\/b>an. Diese schreibt den Code direkt in das <b>CodeModule<\/b>-Objekt.<\/p>\n<p>Im folgenden Beispiel stellen wir den einzuf&uuml;genden Code zuvor in der Variablen <b>strCode <\/b>zusammen und weisen diesen dann mit <b>AddFromString <\/b>dem <b>CodeModule<\/b>-Objekt zu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CodeModuleAddFromString()\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBComponent\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>strCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     <span style=\"color:blue;\">Set<\/span> objVBComponent = objVBProject.VBComponents. Add(vbext_ct_StdModule)\r\n     objVBComponent.Name = \"mdlAddFromString\"\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = objVBComponent.CodeModule\r\n     strCode = \"Dim strTest<span style=\"color:blue;\"> As String<\/span>\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strCode = strCode & \"Public Sub Test()\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strCode = strCode & \"    <span style=\"color:blue;\">Debug.Print<\/span> \"\"Test\"\"\"  & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strCode = strCode & \"End Sub\"\r\n     objCodeModule.AddFromString strCode\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis finden Sie in Bild 2.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_01\/pic_1353_002.png\" alt=\"Per AddFromString initial hinzugef&uuml;gter Code\" width=\"499,5589\" height=\"254,8562\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Per AddFromString initial hinzugef&uuml;gter Code<\/span><\/b><\/p>\n<p>Sie k&ouml;nnen <b>AddFromString <\/b>auch nutzen, um Code in ein Modul einzuf&uuml;gen, das bereits Code enth&auml;lt. Der neu einzuf&uuml;gende Code landet dann genau hinter der letzten Deklarationszeile im Modul.<\/p>\n<p>Das macht Sinn, denn wenn der einzuf&uuml;gende Code auch im oberen Bereich Deklarationszeilen und im unteren Routinen enth&auml;lt, dann gibt es weiterhin eine Trennung zwischen den Deklarationen im oberen Bereich und der Programmlogik im unteren Bereich. Die folgende Prozedur f&uuml;gt eine Deklarationszeile zum bestehenden Code aus dem vorherigen Beispiel hinzu: <\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CodeModuleAddMoreFromString()\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>strCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = objVBProject.VBComponents( \"mdlAddFromString\").CodeModule\r\n     strCode = \"Dim strTest2<span style=\"color:blue;\"> As String<\/span>\"\r\n     objCodeModule.AddFromString strCode\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dieser wird dann im Modul wie in Bild 3 eingef&uuml;gt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_01\/pic_1353_003.png\" alt=\"Per AddFromString nachtr&auml;glich hinzugef&uuml;gter Code\" width=\"499,5589\" height=\"254,8562\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Per AddFromString nachtr&auml;glich hinzugef&uuml;gter Code<\/span><\/b><\/p>\n<h2>Das CodePane-Objekt eines Moduls referenzieren<\/h2>\n<p>Im Beitrag <b>Zugriff auf den VBA-Editor mit der VBE-Klasse <\/b>(<b>www.access-im-unternehmen.de\/1350<\/b>) haben wir den Unterschied und die Zusammenh&auml;nge zwischen <b>VBComponent<\/b>, <b>Window <\/b>und <b>CodePane <\/b>erl&auml;utert. Das <b>CodePane <\/b>ist das Element, in dem das <b>CodeModule<\/b>-Objekt im <b>Window<\/b>-Objekt angezeigt wird.<\/p>\n<p>Deshalb k&ouml;nnen wir vom <b>CodeModule<\/b>-Element &uuml;ber die Eigenschaft <b>CodePane<\/b> auch auf das betroffene <b>Code-Pane<\/b>-Element zugreifen. Das <b>CodePane<\/b>-Element referenzieren wir dabei wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CodePaneReferenzieren()\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>objCodePane<span style=\"color:blue;\"> As <\/span>CodePane\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = objVBProject.VBComponents( \"mdlCodeModule\").CodeModule\r\n     <span style=\"color:blue;\">Set<\/span> objCodePane = objCodeModule.CodePane\r\n     ''... Dinge mit dem CodePane erledigen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Welche M&ouml;glichkeiten die <b>CodePane<\/b>-Klasse bietet, lesen Sie im Beitrag <b>Auf VBA-Code zugreifen per CodePane <\/b>(<b>www.access-im-unternehmen.de\/1354<\/b>).<\/p>\n<h2>Schneller Zugriff auf das CodeModule per CodePane<\/h2>\n<p>Das <b>CodePane<\/b>-Objekt hat eine Eigenart, die wir uns in den folgenden Beispielen zunutze machen wollen: Sie k&ouml;nnen das aktive <b>CodePane<\/b>-Objekt, also den Container im aktuell aktiven VBA-Fenster mit dem <b>CodeModule<\/b>-Objekt, auch direkt mit der Eigenschaft <b>ActiveCodePane <\/b>der &uuml;bergeordneten <b>VBE<\/b>-Klasse referenzieren.<\/p>\n<h2>Zeilen z&auml;hlen im Modul<\/h2>\n<p>Es gibt einige Eigenschaften, mit denen Sie verschiedene Zeilenanzahlen ermitteln k&ouml;nnen.<\/p>\n<p>Diese schauen wir uns in den n&auml;chsten Abschnitten an.<\/p>\n<h2>Anzahl aller Zeilen im Modul<\/h2>\n<p>Am einfachsten ist das Z&auml;hlen aller Zeilen. Dies erledigen wir mit der Eigenschaft <b>CountOfLines<\/b>. Diese liefert die Anzahl der Zeilen von der ersten bis zur letzten Zeile des Moduls.<\/p>\n<p>Wir gehen davon aus, dass das zu untersuchende Modul ge&ouml;ffnet ist und dass das entsprechende VBA-Fenster den Fokus hat.<\/p>\n<p>Dann k&ouml;nnen wir n&auml;mlich ganz einfach wie folgt &uuml;ber den Direktbereich auf zu die untersuchenden Eigenschaften zugreifen &#8211; hier auf die Anzahl der Codezeilen:<\/p>\n<pre>  VBE.ActiveCodePane.CodeModule.CountOfLines\r\n  9<\/pre>\n<p><!--30percent--><\/p>\n<p>Die Eigenschaft <b>CountOfLines <\/b>liefert die Anzahl der Zeilen, wobei auch solche Zeilen ohne Inhalt mitgez&auml;hlt werden. In Bild 4 ist die Zeile mit dem Kommentar <b>&#8220;09 <\/b>die letzte Zeile. Wenn wir hinter <b>&#8220;09 <\/b>noch einmal die Eingabetaste bet&auml;tigen und somit einen Zeilenumbruch hinzuf&uuml;gen, liefert <b>CountOfLines <\/b>folglich den Wert <b>10<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_01\/pic_1353_004.png\" alt=\"Abfragen von CodeModule-Eigenschaften per Direktbereich\" width=\"649,559\" height=\"233,0479\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Abfragen von CodeModule-Eigenschaften per Direktbereich<\/span><\/b><\/p>\n<h2>Beispielmodul f&uuml;r die folgenden Beispiele<\/h2>\n<p>Damit Sie Beispielmaterial haben, anhand dessen Sie die folgenden Beispiele nachvollziehen k&ouml;nnen, haben wir das Modul <b>mdlBeispielcode <\/b>aus Bild 5 zum Projekt hinzugef&uuml;gt. Mit der <b>CountOfLines<\/b>-Eigenschaft erhalten Sie f&uuml;r dieses Modul den Wert <b>28<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_01\/pic_1353_008.png\" alt=\"Beispielmodul\" width=\"424,5589\" height=\"451,9231\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Beispielmodul<\/span><\/b><\/p>\n<h2>Anzahl der Deklarationszeilen<\/h2>\n<p>Die Eigenschaft <b>CountOfDeclarationLines <\/b>liefert die Anzahl der Zeilen bis zur letzten Deklarationsanweisung im Modul. Da Sie keine Deklarationszeilen hinter der ersten Routine mehr verwenden d&uuml;rfen, k&ouml;nnen Sie beide Bereiche somit sehr gut voneinander unterscheiden.<\/p>\n<p>Im Gegensatz zu <b>CountOfLines <\/b>k&uuml;mmert sich <b>CountOfDeclarationLines <\/b>situationsbedingt nicht um nachfolgende Leerzeilen:<\/p>\n<ul>\n<li>Wenn nach der letzten Deklarationszeile mindestens eine <b>Sub<\/b>-, <b>Function<\/b>&#8211; oder <b>Property<\/b>-Prozedur folgt, dann gibt <b>CountOfDeclarationLines <\/b>die Anzahl der Zeilen bis zur letzten Deklarationszeile aus.<\/li>\n<li>Wenn nach der letzten Deklarationszeile keine <b>Sub<\/b>-, <b>Function<\/b>&#8211; oder <b>Property<\/b>-Prozedur folgt, wenn das Modul also nur einen Deklarationsteil enth&auml;lt, dann liefert <b>CountOfDeclarationsLines <\/b>die Anzahl der Zeilen bis zur letzten Zeile des Moduls.<\/li>\n<\/ul>\n<p>Im Fall des Moduls aus dem Beispiel erhalten wir also folgendes Ergebnis:<\/p>\n<pre>  VBE.ActiveCodePane.CodeModule.CountOfDeclarationLines\r\n  4<\/pre>\n<h2>Anzahl der Zeilen einer Prozedur<\/h2>\n<p>Wenn Sie die Anzahl der Zeilen einer speziellen Prozedur ermitteln wollen, nutzen Sie die Eigenschaft <b>ProcCountLines<\/b>. Diese Eigenschaft erwartet zwei Parameter:<\/p>\n<ul>\n<li><b>ProcName<\/b>: Name der zu untersuchenden Prozedur<\/li>\n<li><b>ProcKind<\/b>: Art der zu untersuchenden Prozedur. M&ouml;gliche Werte: <b>vbext_pk_Get <\/b>(<b>Property Get<\/b>-Prozedur), <b>vbext_pk_Let <\/b>(<b>Property Let<\/b>-Prozedur), <b>vbext_pk_Proc<\/b> (<b>Sub<\/b>&#8211; oder <b>Function<\/b>-Prozedur) oder <b>vbext_pk_Set <\/b>(<b>Property Set<\/b>-Prozedur)<\/li>\n<\/ul>\n<p>Um diese Eigenschaft nutzen zu k&ouml;nnen, m&uuml;ssen Sie sowohl den Namen als auch den Typ der Prozedur kennen. Ein Beispielaufruf aus dem Direktbereich heraus lautet:<\/p>\n<pre>  VBE.ActiveCodePane.CodeModule.ProcCountLines(\"Testsub\", vbext_pk_Proc)\r\n  5 <\/pre>\n<p>Warum erscheint hier der Wert <b>5<\/b> Weil sowohl die Kommentarzeile als auch die leeren Zeilen unmittelbar vor der untersuchten Prozedur mitgez&auml;hlt werden &#8211; also alle seit dem allgemeinen Deklarationsteil oder der vorherigen Prozedur inklusive Kommentarzeilen.<\/p>\n<h2>Alle Zeilen eines Moduls ausgeben<\/h2>\n<p>Wenn Sie eine oder mehrere Zeilen eines Moduls ausgeben wollen, referenzieren Sie als erstes das <b>CodeModule<\/b>-Objekt. Dann k&ouml;nnen Sie mit der <b>Lines<\/b>-Methode gezielt den Inhalt einer oder mehrerer Zeilen gleichzeitig abfragen.<\/p>\n<p>Im ersten Beispiel geben wir f&uuml;r das erste Argument der <b>Lines<\/b>-Methode den Wert <b>1 <\/b>f&uuml;r die erste Zeile und den Wert der Eigenschaft <b>CountOfLines <\/b>des <b>CodeModule<\/b>-Objekts f&uuml;r den zweiten Parameter an. <b>Lines <\/b>sollte hier also alle Zeilen in einem Rutsch liefern:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AlleZeilenGleichzeitigAusgeben()\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = VBE.ActiveVBProject. VBComponents(\"mdlBeispielcode\").CodeModule\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objCodeModule.Lines(1,  objCodeModule.CountOfLines)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis finden Sie in Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_01\/pic_1353_006.png\" alt=\"Ausgabe aller Zeilen\" width=\"424,5589\" height=\"204,9594\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Ausgabe aller Zeilen<\/span><\/b><\/p>\n<p>Nun wollen wir die Prozedur inklusive Zeilennummern ausgeben. Dazu referenziert die folgende Prozedur das Modul <b>mdlBeispielcode <\/b>und durchl&auml;uft in einer <b>For Next<\/b>-Schleife die Zahlen von <b>1 <\/b>bis zu der mit der Eigenschaft <b>CountOfLines <\/b>ermittelten Anzahl der Zeilen.<\/p>\n<p>Dabei gibt sie jeweils den Inhalt der aktuellen Zeile im Direktbereich aus. Hier f&uuml;gen wir vorn noch die Nummer der aktuellen Zeile im Format <b>00 <\/b>an:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AufEineZeileZugreifen()\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = VBE.ActiveVBProject. VBComponents(\"mdlBeispielcode\").CodeModule\r\n     For i = 1 To objCodeModule.CountOfLines\r\n         <span style=\"color:blue;\">Debug.Print<\/span> Format(i, \"00\"),  objCodeModule.Lines(i, 1)\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>F&uuml;r die ersten paar Zeilen lautet das Ergebnis beispielsweise wie in Bild 7.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_01\/pic_1353_005.png\" alt=\"Ausgabe aller Zeilen inklusive Zeilennummern\" width=\"424,5589\" height=\"204,9594\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Ausgabe aller Zeilen inklusive Zeilennummern<\/span><\/b><\/p>\n<h2>Prozedur einer Zeile ermitteln<\/h2>\n<p>Wir legen noch einen drauf und ermitteln jetzt zus&auml;tzlich noch den Namen der Prozedur der jeweiligen Zeile und geben den Typ der Prozedur aus.<\/p>\n<p>Dazu f&uuml;gen wir lediglich eine Variable des Typs <b>vbext_ProcKind <\/b>hinzu und passen die <b>Debug.Print<\/b>-Anweisung so an, dass sie diesmal nicht die Zeile mit der <b>Lines<\/b>-Eigenschaft ermittelt, sondern mit <b>ProcOfLine <\/b>den Namen der Prozedur, die sich in der jeweiligen Zeile befindet.<\/p>\n<p>Diese Eigenschaft gibt mit dem zweiten Parameter noch den Typ der Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AlleZeilenMitProzeduren()\r\n     <span style=\"color:blue;\">Dim <\/span>eProcType<span style=\"color:blue;\"> As <\/span>vbext_ProcKind\r\n     ...\r\n         <span style=\"color:blue;\">Debug.Print<\/span> Format(i, \"00\"),  objCodeModule.ProcOfLine(i, eProcType), eProcType\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Den Output dieser Prozedur f&uuml;r die Zeilen ab dem Beginn der ersten Zeile nach dem Deklarationsbereich erscheint wie in Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_01\/pic_1353_007.png\" alt=\"Ausgabe aller Zeilennummern mit Prozedur und Prozedurtyp\" width=\"424,5589\" height=\"294,7512\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Ausgabe aller Zeilennummern mit Prozedur und Prozedurtyp<\/span><\/b><\/p>\n<h2>Weitere Eigenschaften zu Prozeduren<\/h2>\n<p>Es gibt noch zwei weitere Eigenschaften, mit denen Sie Informationen speziell zu Prozeduren ermitteln k&ouml;nnen. <\/p>\n<ul>\n<li><b>ProcBodyLine<\/b>: Liefert die Nummer der Zeile mit dem <b>Sub|Function|Property<\/b>-Schl&uuml;sselwort.<\/li>\n<li><b>ProcStartLine<\/b>: Liefert die Nummer der ersten Zeile nach dem allgemeinen Deklarationsteil oder der vorherigen Prozedur.<\/li>\n<\/ul>\n<p>Um das besser nachvollziehen zu k&ouml;nnen, zwei Beispiele. Das erste ermittelt die Nummer der Zeile mit dem <b>Sub<\/b>-Schl&uuml;sselwort, in diesem Fall Zeile <b>7<\/b>:<\/p>\n<pre>  VBE.ActiveCodePane.CodeModule.ProcBodyLine(\"TestSub\", vbext_pk_Proc)\r\n  7 <\/pre>\n<p>Und die Eigenschaft <b>ProcStartLine <\/b>ermittelt die erste Zeile nach dem allgemeinen Deklarationsteil, der hier vier Zeilen lang ist &#8211; also lautet das Ergebnis <b>5<\/b>:<\/p>\n<pre>  VBE.ActiveCodePane.CodeModule.ProcStartLine( \"TestSub\", vbext_pk_Proc)\r\n  5 <\/pre>\n<h2>Mit Zeilen arbeiten<\/h2>\n<p>Die <b>CodeModule<\/b>-Klasse bietet einige M&ouml;glichkeiten, um Zeilen hinzuzuf&uuml;gen, zu leeren oder zu ersetzen. Diese schauen wir uns in den folgenden Abschnitten an.<\/p>\n<h2>Zeilen l&ouml;schen<\/h2>\n<p>Am schnellsten erkl&auml;rt ist die Methode <b>DeleteLines<\/b>, mit der Sie eine oder mehrere Zeilen l&ouml;schen k&ouml;nnen. Diese Methode erwartet als ersten Parameter die erste zu l&ouml;schende Zeile und als zweiten die Anzahl der zu l&ouml;schenden Zeilen.<\/p>\n<p>Im folgenden Beispiel wollen wir alle &uuml;berz&auml;hligen leeren Zeilen am Ende eines Moduls l&ouml;schen. Eine leere Zeile nach der letzten Zeile mit Text ist &uuml;brigens immer vorhanden, damit Sie eine weitere Zeile eingeben k&ouml;nnen. Diese wird jedoch von der Eigenschaft <b>CountOfLines <\/b>nicht erfasst.<\/p>\n<p>Die Prozedur referenziert das Beispielmodul <b>mdlBeispielcode <\/b>und durchl&auml;uft eine <b>Do While<\/b>-Schleife solange, bis die letzte Zeile nicht mehr eine leere Zeichenkette enth&auml;lt, also ihre L&auml;nge nicht <b>0 <\/b>ist.<\/p>\n<p>Falls nicht vorhanden, f&uuml;gen Sie dem Modul <b>mdlBeispielcode <\/b>vor dem Aufruf einige leere Zeilen am Ende hinzu.<\/p>\n<p>Innerhalb der <b>Do While<\/b>-Schleife l&ouml;scht die Methode <b>DeleteLines <\/b>immer einen Bereich beginnend mit der letzten Zeile und mit der L&auml;nge einer Zeile:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>LeerzeilenAmEndeLoeschen()\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = VBE.ActiveVBProject. VBComponents(\"mdlBeispielcode\").CodeModule\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Len<\/span>(objCodeModule.Lines( objCodeModule.CountOfLines, 1)) = 0\r\n         objCodeModule.DeleteLines  objCodeModule.CountOfLines, 1\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zeilen ersetzen<\/h2>\n<p>Die n&auml;chste Methode hei&szlig;t <b>ReplaceLine<\/b>. Sie erwartet ebenfalls zwei Parameter. Der erste gibt die Nummer der zu ersetzenden Zeile an, der zweite den neuen Inhalt f&uuml;r diese Zeile.<\/p>\n<p>Wenn Sie beispielsweise ein komplettes Modul auskommentieren wollen, k&ouml;nnen Sie das mit dieser Methode erledigen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ModulAuskommentieren()\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>l<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = VBE.ActiveVBProject .VBComponents(\"mdlBeispielcode\").CodeModule\r\n     For l = 1 To objCodeModule.CountOfLines\r\n         objCodeModule.ReplaceLine l, \"''\" &  objCodeModule.Lines(l, 1)\r\n     <span style=\"color:blue;\">Next<\/span> l\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur durchl&auml;uft alle Zeilen eines Moduls von <b>1 <\/b>bis zu der mit <b>CountOfLines <\/b>ermittelten letzten Zeile. Dabei ersetzt es mit der <b>Replace<\/b>-Methode die jeweils aktuelle durch ein Hochkomma und den vorherigen Inhalt der Zeile.<\/p>\n<p>Wenn Sie die Kommentare wieder entfernen wollen, brauchen Sie &uuml;brigens nur die Zeile innerhalb der <b>For&#8230;Next<\/b>-Schleife zu ersetzen &#8211; und den Prozedurnamen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AlleKommentareEntfernen()\r\n     ...\r\n         objCodeModule.ReplaceLine l,  <span style=\"color:blue;\">Mid<\/span>(objCodeModule.Lines(l, 1), 2)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier ersetzen wir die jeweiligen Zeilen einfach durch die aktuelle Zeile ohne das erste Zeichen, in dem sich nach dem Anwenden der Prozedur <b>ModulAuskommentieren <\/b>die Hochkommata (<b>&#8220;<\/b>) befinden.<\/p>\n<h2>Zeilen einf&uuml;gen<\/h2>\n<p>Mit der <b>InsertLines<\/b>-Methode k&ouml;nnen wir Zeilen an beliebigen Stellen im Modul einf&uuml;gen. Dazu bietet diese Methode zwei Parameter an: Der erste nimmt die Nummer der Zeile entgegen, hinter welcher der Text eingesetzt werden soll, und der zweite den einzuf&uuml;genden Text.<\/p>\n<p>Diese Methode ist hilfreich, wenn Sie an beliebigen Stellen innerhalb des Moduls Text einf&uuml;gen wollen. Wenn Sie etwas einen beschreibenden Kommentarblock ganz oben im Modul hinzuf&uuml;gen wollen, verwenden Sie Code wie den aus Listing 1. Hier referenzieren wir das <b>CodeModule<\/b>-Objekt des Moduls, in das wir den Code einf&uuml;gen wollen. Dann ermitteln wir &uuml;ber dessen Eigenschaft <b>Parent.Name <\/b>den Namen des Moduls. Parent liefert dabei den Verweis auf das &uuml;bergeordnete <b>VBComponent<\/b>-Objekt, das die <b>Name<\/b>-Eigenschaft bereitstellt.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KommentarEinfuegen()\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>strCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strModulname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = VBE.ActiveVBProject.VBComponents(\"mdlBeispielcode\").CodeModule\r\n     strModulname = objCodeModule.Parent.Name\r\n     strCode = \"''*******************************************\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strCode = strCode & \"'''' \" & strModulname & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strCode = strCode & \"''*******************************************\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     objCodeModule.InsertLines 1, strCode\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Einf&uuml;gen von Kommentaren oben im Modul<\/span><\/b><\/p>\n<p>Dann stellen wir in der Variablen <b>strCode <\/b>den einzuf&uuml;genden Kommentar zusammen. Diesen f&uuml;gen wir dann mit der <b>InsertLines<\/b>-Methode ganz oben im Modul ein.<\/p>\n<h2>Code finden<\/h2>\n<p>Eine wichtige Funktion in Zusammenhang mit dem L&ouml;schen oder Ersetzen von Code ist die <b>Find<\/b>-Funktion. Schlie&szlig;lich m&uuml;ssen Sie erst einmal den Code finden, den Sie ersetzen wollen. Die <b>Find<\/b>-Funktion stellt die folgenden Parameter bereit:<\/p>\n<ul>\n<li><b>Target<\/b>: Zu suchende Zeichenkette<\/li>\n<li><b>StartLine<\/b>: R&uuml;ckgabeparameter, der die erste Zeile des Fundorts angibt. Gleichzeitig k&ouml;nnen Sie f&uuml;r diesen Parameter die erste Zeile des zu durchsuchenden Bereichs angeben.<\/li>\n<li><b>StartColum<\/b>: R&uuml;ckgabeparameter, der die erste Spalte des Fundorts angibt. Gleichzeitig k&ouml;nnen Sie f&uuml;r diesen Parameter die erste Spalte des zu durchsuchenden Bereichs angeben.<\/li>\n<li><b>EndLine<\/b>: R&uuml;ckgabeparameter, der die letzte Zeile des Fundorts angibt. Gleichzeitig k&ouml;nnen Sie f&uuml;r diesen Parameter die letzte Zeile des zu durchsuchenden Bereichs angeben.<\/li>\n<li><b>EndColumn<\/b>: R&uuml;ckgabeparameter, der die letzte Spalte des Fundorts angibt. Gleichzeitig k&ouml;nne Sie f&uuml;r diesen Parameter die letzte Spalte des zu durchsuchenden Bereichs angeben.<\/li>\n<li><b>WholeWord<\/b>: Sucht nur nach ganzen W&ouml;rtern, was bedeutet, dass das gesuchte Wort nur gefunden wird, wenn es nicht in einen anderen Ausdruck mit Buchstaben oder Zahlen eingebettet ist. Die Suche nach dem Wort <b>Test <\/b>liefert dann ein Ergebnis, wenn die Zeile einen Ausdruck wie <b>&#8222;Artikel = &#8220;Test&#8220;&#8220; <\/b>enth&auml;lt, aber nicht bei <b>Dies ist ein Beispieltest<\/b>.<\/li>\n<li><b>MatchCase<\/b>: Legt fest, dass nach Gro&szlig;- und Kleinschreibung unterschieden werden soll.<\/li>\n<li><b>PatternSearch<\/b>: Legt fest, ob das Sternchen (*) und das Fragezeichen () als Platzhalter f&uuml;r beliebig viele beliebige Zeichen beziehungsweise ein beliebiges Zeichen verwendet werden d&uuml;rfen.<\/li>\n<\/ul>\n<p>Die Funktion gibt einen <b>Boolean<\/b>-Wert zur&uuml;ck, der angibt, ob die Suche erfolgreich war.<\/p>\n<p>Die Parameter <b>StartLine<\/b>, <b>StartColumn<\/b>, <b>EndLine <\/b>und <b>EndColumn <\/b>m&uuml;ssen wir zuvor deklarieren, dass es sich um R&uuml;ckgabeparameter handelt, die bei erfolgreicher Suche mit der Position des Fundorts gef&uuml;llt werden.<\/p>\n<p>Listing 2 zeigt ein Beispiel f&uuml;r die Verwendung der <b>Find<\/b>-Methode. Die Prozedur deklariert mit <b>lngStartLine<\/b>, <b>lngStartColumn<\/b>, <b>lngEndLine <\/b>und <b>lngEndColumn <\/b>die Variablen zum Erfassen der Position des Fundortes. Dann referenziert es unser Beispielmodul mit der Variablen <b>objCodeModule<\/b> und legt mit <b>strSuchbegriff <\/b>den Suchbegriff fest. Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob der Aufruf der <b>Find<\/b>-Methode den Wert <b>True <\/b>zur&uuml;ckgibt und gibt dann die in die <b>Long<\/b>-Variablen geschriebenen Werte im Direktbereich aus.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CodeSuchen()\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>strSuchbegriff<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngStartLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngStartColumn<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngEndLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngEndColumn<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = VBE.ActiveVBProject.VBComponents(\"mdlBeispielcode\").CodeModule\r\n     strSuchbegriff = \"Test\"\r\n     <span style=\"color:blue;\">If <\/span>objCodeModule.Find(strSuchbegriff, lngStartLine, lngStartColumn, lngEndLine, lngEndColumn) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> lngStartLine, lngStartColumn, lngEndLine, lngEndColumn\r\n    Else\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Nichts gefunden.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Finden eines Suchausdrucks im Modul<\/span><\/b><\/p>\n<p>Die <b>Find<\/b>-Methode f&uuml;llen wir mit den Pflichtparametern, also dem Suchbegriff und den vier Parametern zur Ermittlung der Position des gefundenen Suchbegriffs.<\/p>\n<p>Wenn die Suche nicht erfolgreich war, soll die Prozedur den Text <b>Nichts gefunden <\/b>im Direktbereich ausgeben.<\/p>\n<p>Wir k&ouml;nnen auch die komplette Zeile mit dem Fundort ausgeben und beispielsweise den gefundenen Ausdruck in Sternchen einfassen. Dazu ersetzen wir die <b>Debug.Print<\/b>-Anweisung wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> <span style=\"color:blue;\">Replace<\/span>(objCodeModule.Lines(lngStartLine, 1),  strSuchbegriff, \"*\" & strSuchbegriff & \"*\")<\/pre>\n<p>Hier gehen wir davon aus, dass sich das Suchergebnis innerhalb einer Zeile befindet und sich nicht &uuml;ber mehrere Zeilen erstreckt. Wir geben die komplette Zeile mit dem Fundort aus und fassen den Suchbegriff noch mit Sternchen ein, indem wir <b>strSuchbegriff <\/b>durch <b>&#8222;*&#8220; &#038; strSuchbegriff &#038; &#8222;*&#8220; <\/b>ersetzen.<\/p>\n<h2>Jedes Zeile mit dem Suchbegriff ausgeben<\/h2>\n<p>Wenn Sie alle Zeilen ausgeben wollen, die den Suchbegriff enthalten, verwenden Sie statt der <b>If&#8230;Then<\/b>-Bedingung eine <b>Do While<\/b>-Schleife. Diese verwendet die gleiche Bedingung wie die <b>If&#8230;Then<\/b>-Bedingung (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CodeSuchenMehrfach()\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>strSuchbegriff<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngStartLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngStartColumn<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngEndLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngEndColumn<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = VBE.ActiveVBProject.VBComponents(\"mdlBeispielcode\").CodeModule\r\n     strSuchbegriff = \"Test\"\r\n     <span style=\"color:blue;\">Do While<\/span> objCodeModule.Find(strSuchbegriff, lngStartLine, lngStartColumn, lngEndLine, lngEndColumn) = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> lngStartLine, <span style=\"color:blue;\">Replace<\/span>(objCodeModule.Lines(lngStartLine, 1), strSuchbegriff, \"*\" & strSuchbegriff & \"*\")\r\n         lngStartLine = lngStartLine + 1\r\n         lngStartColumn = 0\r\n         lngEndLine = 0\r\n         lngEndColumn = 0\r\n         DoEvents\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Suchen aller Zeilen mit dem angegebenen Suchbegriff<\/span><\/b><\/p>\n<p>Innerhalb der <b>Do While<\/b>-Schleife geben wir die gefundene Zeile auf die gleiche Weise aus wie im vorherigen Beispiel. Allerdings folgen danach einige neue Anweisungen. Hier nutzen wir die M&ouml;glichkeit, dass wir die Parameter <b>lngStartLine<\/b>, <b>lngStartColumn<\/b>, <b>lngEndLine <\/b>und <b>lngEndColumn <\/b>beim Aufruf der <b>Find<\/b>-Methode auch einstellen k&ouml;nnen, um den Suchbereich festzulegen.<\/p>\n<p>Dabei stellen wir <b>lngStartLine <\/b>jeweils auf die Zeile fest, die auf die Zeile mit dem letzten Suchtreffer folgt &#8211; durch Erh&ouml;hen des Wertes um <b>1<\/b>.<\/p>\n<p>Die Variablen f&uuml;r die &uuml;brigen Parameter setzen wir zur&uuml;ck auf den Standardwert <b>0<\/b>. Danach f&uuml;hrt die <b>Do While<\/b>-Schleife die Suche erneut durch, diesmal allerdings beginnend mit der Zeile, die auf die Zeile mit dem vorherigen Suchergebnis folgt.<\/p>\n<h2>Erstellen von Ereignisprozeduren<\/h2>\n<p>Interessanterweise bietet das <b>CodeModule<\/b>-Objekt eine Methode namens <b>CreateEventProc <\/b>zum Erstellen von Ereignisprozeduren an, aber keine zum Erstellen herk&ouml;mmlicher Prozeduren. Letztere k&ouml;nnen Sie beispielsweise per Code in einem String zusammenstellen und dann mit der <b>InsertLines<\/b>-Methode in das Modul einf&uuml;gen. Wenn Sie eine Ereignisprozedur erstellen wollen, ben&ouml;tigen Sie zuerst ein Klassenmodul, also eines, was Sie im Projektexplorer in einem der Ordner <b>Microsoft Access Klassenobjekte <\/b>oder <b>Klassenmodule <\/b>vorfinden.<\/p>\n<p>Wenn wir schon beim Programmieren sind, erstellen wir ein solches schnell selbst, und zwar mit der Methode <b>CreateForm<\/b> in der Prozedur EreignisprozedurErstellen (siehe Listing 4). Diese liefert den Verweis auf das neu erstellte Formular zur&uuml;ck, den wir in der <b>Form<\/b>-Variablen <b>frm <\/b>speichern.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EreignisprozedurErstellen()\r\n     <span style=\"color:blue;\">Dim <\/span>objCodeModule<span style=\"color:blue;\"> As <\/span>CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Set<\/span> frm = CreateForm\r\n     frm.HasModule = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCodeModule = VBE.ActiveVBProject.VBComponents(\"Form_\" & frm.Name).CodeModule\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objCodeModule.CreateEventProc(\"Load\", \"Form\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Erstellen einer Ereignisprozedur<\/span><\/b><\/p>\n<p>F&uuml;r dieses stellen wir dann den Wert der Eigenschaft <b>HasModule <\/b>auf den Wert <b>True <\/b>ein. Erst damit legen wir ein Klassenmodul f&uuml;r das Formular an. Nun referenzieren wir das Klassenmodul, dessen Bezeichnung immer aus dem Pr&auml;fix <b>Form_ <\/b>und dem Namen des Formulars besteht. Den Namen des Formulars ermitteln wir mit <b>frm.Name<\/b>.<\/p>\n<p>Schlie&szlig;lich geben wir im Direktbereich das Ergebnis der Methode <b>CreateEventProc <\/b>aus, dem wir zwei Parameter &uuml;bergeben:<\/p>\n<ul>\n<li><b>EventName<\/b>: Enth&auml;lt den Namen des Ereignisses wie er im rechten Kombinationsfeld des Codefensters zur Auswahl angezeigt wird. <\/li>\n<li><b>ObjectName<\/b>: Enth&auml;lt den Namen des Objekts, wie es im linken Kombinationsfeld im Codefenster zur Auswahl angeboten wird.<\/li>\n<\/ul>\n<p>Die Beispielprozedur verwendet als Objekt <b>Form <\/b>und als Ereignis <b>Load<\/b>. Die Methode <b>CreateEventProc <\/b>erstellt daraus die Ereignisprozedur aus Bild 9. Au&szlig;erdem gibt sie als Ergebnis die Nummer der Zeile zur&uuml;ck, in der die erste Zeile der Ereignisprozedur angelegt wurde.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_01\/pic_1353_009.png\" alt=\"Eine per Code erstellte Ereignisprozedur\" width=\"424,5589\" height=\"188,2321\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Eine per Code erstellte Ereignisprozedur<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag stellte die verschiedenen Methoden und Eigenschaften der <b>CodeModule<\/b>-Klasse vor. Damit k&ouml;nnen Sie komfortabel alle Aufgaben rund um die Programmierung des Inhalts von Modulen erledigen &#8211; einschlie&szlig;lich einer Suchfunktion.<\/p>\n<p>In einem weiteren Beitrag namens <b>Auf VBA-Code zugreifen mit der CodePane-Klasse <\/b>(<b>www.access-im-unternehmen.de\/1354<\/b>) zeigen wir noch, wie Sie den Container steuern, der das <b>CodeModule<\/b>-Objekt im <b>Window<\/b>-Objekt bereitstellt. Dieser Beitrag h&auml;lt noch die Funktionen bereit, mit denen Sie beispielsweise die aktuelle Markierung im VBA-Fenster abfragen k&ouml;nnen.<\/p>\n<p>In Kombination mit den Methoden, die Sie im vorliegenden Beitrag kennengelernt haben, k&ouml;nnen Sie dann beispielsweise den Benutzer einen bestimmten Bereich im Code selektieren lassen und dann etwa per Schaltfl&auml;che eine Funktion zur Verf&uuml;gung stellen, die innerhalb dieser Markierung bestimmte Ersetzungen vornimmt.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>VBAEditorProgrammieren.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/DADB0AFC-0362-453B-A3EB-C9C67680B04A\/aiu_1353.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie sich mit den anderen Beitr&auml;gen dieser Reihe bis zum VBComponent-Objekt eines Moduls vorgearbeitet haben, ist es nur noch ein Katzensprung bis zur CodeMod-ule-Klasse. Damit k&ouml;nnen Sie dann die Inhalte eines VBA-Moduls auslesen und bearbeiten. Dieser Beitrag zeigt, welche Methoden die CodeModule-Klasse bietet und wie Sie diese f&uuml;r die verschiedenen Anwendungszwecke 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,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012022,662022,44000025],"tags":[],"class_list":["post-55001353","post","type-post","status-publish","format-standard","hentry","category-66012022","category-662022","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>VBA-Code manipulieren mit der CodeModule-Klasse - 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\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VBA-Code manipulieren mit der CodeModule-Klasse\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie sich mit den anderen Beitr&auml;gen dieser Reihe bis zum VBComponent-Objekt eines Moduls vorgearbeitet haben, ist es nur noch ein Katzensprung bis zur CodeMod-ule-Klasse. Damit k&ouml;nnen Sie dann die Inhalte eines VBA-Moduls auslesen und bearbeiten. Dieser Beitrag zeigt, welche Methoden die CodeModule-Klasse bietet und wie Sie diese f&uuml;r die verschiedenen Anwendungszwecke einsetzen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-31T15:18:29+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/d9c9abc8585b4e01a1c12aa5f3927e18\" \/>\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\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"VBA-Code manipulieren mit der CodeModule-Klasse\",\"datePublished\":\"2022-01-31T15:18:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/\"},\"wordCount\":3603,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/d9c9abc8585b4e01a1c12aa5f3927e18\",\"articleSection\":[\"1\\\/2022\",\"2022\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/\",\"name\":\"VBA-Code manipulieren mit der CodeModule-Klasse - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/d9c9abc8585b4e01a1c12aa5f3927e18\",\"datePublished\":\"2022-01-31T15:18:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/d9c9abc8585b4e01a1c12aa5f3927e18\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/d9c9abc8585b4e01a1c12aa5f3927e18\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBACode_manipulieren_mit_der_CodeModuleKlasse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"VBA-Code manipulieren mit der CodeModule-Klasse\"}]},{\"@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":"VBA-Code manipulieren mit der CodeModule-Klasse - 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\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/","og_locale":"de_DE","og_type":"article","og_title":"VBA-Code manipulieren mit der CodeModule-Klasse","og_description":"Wenn Sie sich mit den anderen Beitr&auml;gen dieser Reihe bis zum VBComponent-Objekt eines Moduls vorgearbeitet haben, ist es nur noch ein Katzensprung bis zur CodeMod-ule-Klasse. Damit k&ouml;nnen Sie dann die Inhalte eines VBA-Moduls auslesen und bearbeiten. Dieser Beitrag zeigt, welche Methoden die CodeModule-Klasse bietet und wie Sie diese f&uuml;r die verschiedenen Anwendungszwecke einsetzen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-01-31T15:18:29+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/d9c9abc8585b4e01a1c12aa5f3927e18","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\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"VBA-Code manipulieren mit der CodeModule-Klasse","datePublished":"2022-01-31T15:18:29+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/"},"wordCount":3603,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/d9c9abc8585b4e01a1c12aa5f3927e18","articleSection":["1\/2022","2022","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/","url":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/","name":"VBA-Code manipulieren mit der CodeModule-Klasse - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/d9c9abc8585b4e01a1c12aa5f3927e18","datePublished":"2022-01-31T15:18:29+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/d9c9abc8585b4e01a1c12aa5f3927e18","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/d9c9abc8585b4e01a1c12aa5f3927e18"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/VBACode_manipulieren_mit_der_CodeModuleKlasse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"VBA-Code manipulieren mit der CodeModule-Klasse"}]},{"@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\/55001353","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=55001353"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001353\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}