{"id":55000277,"date":"2005-06-01T00:00:00","date_gmt":"2023-05-31T17:54:51","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=277"},"modified":"2024-02-19T08:20:17","modified_gmt":"2024-02-19T08:20:17","slug":"vbacode_bearbeiten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/","title":{"rendered":"VBA-Code bearbeiten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/716ea3a05e204f37b0be5296013ac7eb\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Andr&eacute; Minhorst, Duisburg<\/b><\/p>\n<p><b>VBA-Code ist die Quelle des Lebens in einer Access-Datenbankanwendung. Ohne VBA-Code gibt es keine professionelle Anwendung. Diese Meinung ist g&auml;ngig. VBA-Code gibt man selbst ein; eventuell kopiert man die eine oder andere Routine und verwertet sie weiter. Auch diese Meinung kann man als landl&auml;ufig bezeichnen. Es verh&auml;lt sich aber ganz anders. Mit dem VBE-Objektmodell k&ouml;nnen Sie Code auch generieren, lesen oder anpassen lassen &#8211; mit ein wenig Fantasie sparen Sie sich so viel Arbeit. Mit dem vorliegenden Beitrag steigen Sie in die Programmierung der VBA-Entwicklungsumgebung ein und lernen die wichtigsten Grundlagen kennen.<\/b><\/p>\n<h3>Hinweis<\/h3>\n<p>Die Beispieldatenbank zu diesem Beitrag hei&szlig;t VBESamples00.mdb f&uuml;r Access 2000 und h&ouml;her. Sie finden die Datenbank auf der Heft-CD oder im Internet unter http:\/\/www.access-im-unternehmen.de unter dem Shortlink 277. Beispiele f&uuml;r den Einsatz der hier vorgestellten Technik finden Sie im Beitrag Erweitern des VBA-Editors: CodeHistory, Shortlink 278 und Erweitern der VBA-Entwicklungsumgebung, Shortlink 237. <\/p>\n<p>Die Entwicklung von Anwendungen unter Verwendung von VBA-Code d&uuml;rfte den meisten von Ihnen bekannt sein &#8211; zumindest, wenn Sie schon die eine oder andere Ausgabe dieses Magazins gelesen oder anderweitig Erfahrungen gesammelt haben. Die Eingabe des Codes ist dabei eine sehr individuelle T&auml;tigkeit; jede Prozedur ist anders und au&szlig;erdem hat jeder seinen eigenen Programmierstil. Aber ist das wirklich so &uuml;berlegen Sie einmal, wie viele Male Sie Code aus anderen Anwendungen und Modulen herauskopiert haben, um ihn an anderer Stelle wiederzuverwenden &#8211; und die innerhalb von Prozeduren zu findenden Strukturen wiederholen sich auch immer wieder. Warum also nicht die Entwicklungsumgebung um ein paar Funktionen erweitern, die automatisch VBA-Code f&uuml;r Sie erstellen Vielleicht enthalten die folgenden Vorschl&auml;ge einen Anreiz f&uuml;r Sie, sich mit dieser Technik auseinander zu setzen:<\/p>\n<li>Speichern bestehender Prozeduren oder Codeschnipsel in eine Datenbank f&uuml;r st&auml;ndige Verf&uuml;gbarkeit des Codes &#8211; Sie m&uuml;ssen nicht mehr die letzten zehn Projekte nach dem Code durchsuchen, den Sie garantiert dort irgendwo integriert haben &#8230;<\/li>\n<li>Automatisches Erstellen von Property Set\/Let\/Get-Prozeduren nach Vorgabe weniger Parameter<\/li>\n<li>Erstellen von Code-Konstrukten wie If&#8230;Then-, Select Case-, Do&#8230;While- und anderen Statements nach bestimmten, leicht einzugebenden Vorgaben<\/li>\n<li>Hilfe bei der Erstellung von Funktionen wie MsgBox, InputBox, DLookup, DCount und anderen Dom&auml;nenfunktionen<\/li>\n<h3>Einsatz der VBE-Helferlein<\/h3>\n<p>Die oben genannten L&ouml;sungen lassen sich in einer Access-Datenbank unterbringen und von dort verwenden. Sie k&ouml;nnen auch von anderen Access-Anwendungen auf diese Datenbank verweisen und deren Funktionalit&auml;t damit einbinden; es sind allerdings einige weitere Schritte mit dem Einsatz der Erweiterung verbunden.<\/p>\n<p>Die zweite, wesentlich effizientere Methode ist, die Funktionen f&uuml;r die Manipulation in einer .dll-Datei unterzubringen. Es gibt dort spezielle Elemente, die das direkte Einbinden in die VBA-Entwicklungsumgebung wesentlich erleichtern &#8211; weitere Informationen dazu finden Sie in den Beitr&auml;gen Erweitern der VBA-Entwicklungsumgebung in Ausgabe 5\/2004 und Erweitern des VBA-Editors: CodeHistory in der vorliegenden Ausgabe. Wer jedoch nicht &uuml;ber Microsoft Visual Studio verf&uuml;gt, kann die hier verwendeten COM-Add-Ins nicht erstellen und muss auf das etwas weniger komfortable Access-Pendant zur&uuml;ckgreifen. Dazu finden Sie allerdings nachfolgend jede Menge Know-how und Beispiele.<\/p>\n<p>F&uuml;r die folgenden Beispiele stellen Sie in der VBA-Entwicklungsumgebung zwei Verweise auf die folgenden Bibliotheken ein (s. Abb. 1):<\/p>\n<li>Microsoft Visual Basic for Applications Extensibility 5.3: Stellt das VBE-Objektmodell zur Verf&uuml;gung.<\/li>\n<li>Microsoft Office x.y Object Library: Erm&ouml;glicht den Zugriff auf die Men&uuml;leisten von Access und der VBA-Entwicklungsumgebung und deren Erweiterung.<\/li>\n<p><IMG height=\"365\" src=\"..\/fileadmin\/_temp_\/{FC9D6EE0-BE85-4514-83D6-D79F36AEDC64}\/pic001.png\" width=\"467\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 1: Verweise f&uuml;r die Programmierung der VBE<\/b><\/p>\n<p>Bevor Sie sich an das Manipulieren des Codes begeben, lernen Sie die Objekte kennen, &uuml;ber die Sie auf den Code zugreifen k&ouml;nnen. Das Wurzelobjekt der VBE-Bibliothek ist das VBE-Objekt. Auf dieses m&uuml;ssen Sie zun&auml;chst einen Verweis erstellen &#8211; nat&uuml;rlich nicht, ohne vorher eine entsprechende Objektvariable zu deklarieren. Das Ger&uuml;st f&uuml;r die folgenden Beispielprozeduren sieht dementsprechend so aus:<\/p>\n<pre>Public Function VBEInitialisieren()\n    Dim objVBE As VBE\n    Set objVBE = Application.VBE\n    ''VBE-Aktionen\n    Set objVBE = Nothing\nEnd Function<\/pre>\n<p>Die Eingabe der Objektbezeichnung objVBE gefolgt von einem Punkt (.) l&auml;sst IntelliSense alle Elemente des Objektmodells anzeigen. F&uuml;r einen detaillierten &uuml;berblick schauen Sie sich das Ganze im Objektkatalog an (s. Abb. 2).<\/p>\n<p><IMG height=\"498\" src=\"..\/fileadmin\/_temp_\/{FC9D6EE0-BE85-4514-83D6-D79F36AEDC64}\/pic002.png\" width=\"455\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 2: Elemente des VBE-Objektmodells<\/b><\/p>\n<h3>Fenster auflisten<\/h3>\n<p>Die Windows-Auflistung enth&auml;lt alle in der VBA-Entwicklungsumgebung eingebauten Fenster, die sich &uuml;ber das Ansicht-Men&uuml; aktivieren lassen, und alle sonstigen Fenster wie die Code-Fenster der jeweiligen Module. Die folgende Prozedur listet die Titel aller Fenster auf:<\/p>\n<pre>Public Function Fenster()\n    Dim objWindow As Window\n    For Each objWindow In VBE.Windows\n        Debug.Print objWindow.Caption\n    Next objWindow\nEnd Function<\/pre>\n<p>Der Titel von Fenstern, die Code enthalten, besteht aus dem Modulnamen und dem angeh&auml;ngten Ausdruck (Code).<\/p>\n<p>Nat&uuml;rlich lassen sich &uuml;ber diese Auflistung noch weitere Fenstereigenschaften ermitteln; au&szlig;erdem stehen zwei Methoden zur Verf&uuml;gung, mit denen Sie ein Fenster schlie&szlig;en (Close) und den Fokus darauf setzen k&ouml;nnen (SetFocus).<\/p>\n<h3>Codepanes<\/h3>\n<p>Die Fenster, die den Code eines Klassen- oder Standardmoduls enthalten, hei&szlig;en Codepane. Die Titel aller Codepanes k&ouml;nnen Sie mit folgender Prozedur ausgeben:<\/p>\n<pre>Public Function CodepanesZeigen()\n    Dim objCodepane As CodePane\n    For Each objCodepane In VBE.CodePanes\n        Debug.Print _            objCodepane.Window.Caption\n    Next objCodepane\nEnd Function<\/pre>\n<p>Dabei greifen Sie &uuml;ber die Windows-Eigenschaft auf das zugrunde liegende Fenster-Element zu und geben dessen Titel aus. Der Zugriff auf ein CodePane &uuml;ber die CodePanes-Auslistung ist nur sinnvoll, wenn Sie den Index des ben&ouml;tigten CodePane kennen oder wenn Sie eine Aktion mit allen CodePanes durchf&uuml;hren m&ouml;chten.<\/p>\n<p>Oft m&ouml;chte man direkt auf das aktuell aktive CodePane zugreifen. Dazu kann man folgenden Verweis verwenden:<\/p>\n<pre>VBE.ActiveCodePane<\/pre>\n<p>Um damit den Titel des CodePane zu ermitteln, verwenden Sie folgende Erweiterung:<\/p>\n<pre>VBE.ActiveCodePane.Window.Caption<\/pre>\n<p>Das CodePane-Objekt enth&auml;lt noch weitere interessante Methoden und Eigenschaften, die sp&auml;ter in einem anderen Zusammenhang vorgestellt werden.<\/p>\n<h3>CodeModules<\/h3>\n<p>Das f&uuml;r die nachfolgenden Beispiele wichtigste Element ist das CodeModule. Das CodeModule enth&auml;lt den eigentlichen Code des durch das CodePane repr&auml;sentierten Moduls. Auf den Inhalt eines CodeModule-Objekts k&ouml;nnen Sie auf unterschiedliche Weise zugreifen. Am einfachsten ist der Zugriff auf das CodeModule des aktuellen CodePanes:<\/p>\n<pre>Public Function CodeModulesAnzeigen()\n    Dim objCodeModule As CodeModule\n    Set objCodeModule = _        VBE.ActiveCodePane.CodeModule\n    With objCodeModule\n        .CountOfLines\n    End With\n    Set objCodeModule = Nothing\nEnd Function<\/pre>\n<p>Wenn Sie auf das CodeModule eines bestimmten Moduls zugreifen m&ouml;chten und dieses namentlich kennen, verwenden Sie die folgende Anweisung (ohne Zeilenumbruch):<\/p>\n<pre> VBE.ActiveVBProject.VBComponents(\"mdlVBE\").CodeModule.CountOfLines<\/pre>\n<p>Damit haben Sie noch ein weiteres Element des VBE-Objektmodells kennen gelernt: ActiveVBProject gibt einen Verweis auf das aktuell in der VBA-Entwicklungsumgebung verwendete Projekt an.<\/p>\n<h3>Einbinden weiterer VBA-Projekte<\/h3>\n<p>M&ouml;glicherweise fragen Sie sich, wie man mehr als ein VBA-Projekt gleichzeitig in der VBA-Entwicklungsumgebung verwenden kann. Das geht ganz einfach: &ouml;ffnen Sie einfach den Verweise-Dialog &uuml;ber den Men&uuml;punkt Extras\/Verweise und klicken Sie dort auf die Schaltfl&auml;che Durchsuchen. Stellen Sie im nun erscheinenden Dialog den Dateityp Microsoft Office Access-Datenbanken (*.mdb) ein und w&auml;hlen Sie eine andere Datenbank als die aktuelle aus.<\/p>\n<pre>Public Function CreateModule(strModulename As String, lngModuletype As Modultype)\n    Dim objVBComponent As VBComponent\n    Set objVBComponent = VBE.ActiveVBProject.VBComponents.Add(lngModuletype)\n    objVBComponent.Name = strModulename\n    DoCmd.Save acModule, strModulename\n    Set objVBComponent = Nothing\nEnd Function<\/pre>\n<p><b>Quellcode 1<\/b><\/p>\n<p><IMG height=\"312\" src=\"..\/fileadmin\/_temp_\/{FC9D6EE0-BE85-4514-83D6-D79F36AEDC64}\/pic003.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 3: Bearbeiten eines VBA-Projekts einer anderen Datenbank<\/b><\/p>\n<p>Der Projekt-Explorer zeigt das aktuelle und zus&auml;tzlich das per Verweis verf&uuml;gbar gemachte VBA-Projekt an. Sie k&ouml;nnen auf die Module dieses Projekts zugreifen und sogar neue Module anlegen und bearbeiten (s. Abb. 3).<\/p>\n<p>Wenn Sie mehrere VBA-Projekte gleichzeitig in der VBA-Entwicklungsumgebung anzeigen, empfiehlt sich der explizite Zugriff auf eines der Projekte statt der Verwendung der Funktion ActiveVBProject:<\/p>\n<pre>VBE.VBProjects(\"VBESample\").VBComponents(\"mdlVBE\").CodeModule<\/pre>\n<p>Die Arbeit mit dem in den Modulen enthaltenen VBA-Code schlie&szlig;t auch das Anlegen, L&ouml;schen und Bearbeiten der Module ein.<\/p>\n<h2>Erstellen eines Moduls<\/h2>\n<p>Das Erstellen eines Moduls l&auml;uft in mehreren Schritten ab. &uuml;ber die Add-Methode der Auflistung VBComponents legen Sie ein neues Modul an. Um seinen Namen einzustellen, verweisen Sie direkt per entsprechender Objektvariable auf das neue Objekt. Schlie&szlig;lich m&uuml;ssen Sie das Modul noch speichern; dazu verwenden Sie die herk&ouml;mmliche DoCmd.Save-Methode. Die folgende Prozedur legt ein neues Modul mit dem gew&uuml;nschten Namen und Typ an. Es gibt drei Typen: Standardmodule, Klassenmodule und Formular- oder Berichtsmodule. F&uuml;r das Festlegen des Typs verwendet die Prozedur eine Enum-Auflistung. Diese dient lediglich der besseren Lesbarkeit der Konstanten, die Werte selbst stimmen mit den Originalkonstanten &uuml;berein:<\/p>\n<pre>Public Enum Modultype\n    Classmodule = 2\n    FormReportModul = 100\n    Standardmodule = 1\nEnd Enum<\/pre>\n<p>Die Prozedur sieht schlie&szlig;lich wie in Quellcode 1 aus. Mit dem Aufruf aus Abb. 4 legen Sie beispielsweise ein Klassenmodul namens clsTest an.<\/p>\n<pre>Public Function DeleteModule(strModulename As String)\n    Dim objVBComponent As VBComponent\n    Set objVBComponent = VBE.ActiveVBProject.VBComponents(strModulename)\n    VBE.ActiveVBProject.VBComponents.Remove objVBComponent\n    Set objVBComponent = Nothing\nEnd Function<\/pre>\n<p><b>Quellcode 2<\/b><\/p>\n<pre>Public Function ListModules()\n    Dim objVBComponent As VBComponent\n    For Each objVBComponent In VBE.ActiveVBProject.VBComponents\n        Debug.Print objVBComponent.Name\n    Next objVBComponent\nEnd Function<\/pre>\n<p><b>Quellcode 3<\/b><\/p>\n<p><IMG height=\"167\" src=\"..\/fileadmin\/_temp_\/{FC9D6EE0-BE85-4514-83D6-D79F36AEDC64}\/pic004.png\" width=\"423\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 4: Anlegen eines neuen Klassenmoduls<\/b><\/p>\n<h3>Hinweis<\/h3>\n<p>Diese und die folgenden Beispielprozeduren enthalten aus Platzgr&uuml;nden keine Fehlerbehandlung. Im vorliegenden Fall m&uuml;ssten Sie beispielsweise noch Vorkehrungen f&uuml;r den Fall treffen, dass das anzulegende Klassenmodul bereits vorhanden ist. <\/p>\n<h2>L&ouml;schen eines Moduls<\/h2>\n<p>F&uuml;r das L&ouml;schen eines Moduls erstellen Sie zun&auml;chst eine Objektvariable, die auf das Modul verweist. Anschlie&szlig;end verwenden Sie die Remove-Methode der VBComponents-Auflistung.<\/p>\n<p>Die Funktion aus Quellcode 2 kapselt diese Funktionalit&auml;t und erwartet lediglich den Namen des Moduls als Parameter.<\/p>\n<h2>Auflisten der bestehenden Module<\/h2>\n<p>Auf einzelne Module k&ouml;nnen Sie &uuml;ber die VBComponents-Auflistung zugreifen, wie Sie in den beiden vorhergehenden Beispielen sehen konnten.<\/p>\n<p>Das Auflisten aller Module des aktuellen Projekts erfolgt ebenfalls &uuml;ber diese Auflistung, wie Quellcode 3 zeigt.<\/p>\n<p>Nachdem Sie erfahren haben, wie Sie auf verschiedene Art und Weise auf die Code-Module zugreifen k&ouml;nnen, schauen Sie sich nun die Funktionen an, um auf die Eigenschaften der Module und des enthaltenen Codes zuzugreifen.<\/p>\n<p>Die Eigenschaften und Methoden sind auf zwei Objekte aufgeteilt: auf das CodePane-Objekt und das darin enthaltene CodeModule-Objekt.<\/p>\n<h2>Eigenschaften und Methoden des CodePane-Objekts<\/h2>\n<p>Die im CodePane-Objekt enthaltenen Elemente beziehen sich eher auf die sichtbaren Eigenschaften des im Code-Fenster angezeigten Codes.<\/p>\n<h3>Oberste Zeile<\/h3>\n<p>Die Eigenschaft TopLine gibt die Nummer der Zeile zur&uuml;ck, die ganz oben im Fenster angezeigt wird. Nach dem &ouml;ffnen eines Code-Fensters ist dies typischerweise die 1:<\/p>\n<pre> VBE.ActiveCodePane.TopLine\n 1 <\/pre>\n<p>Scrollen Sie ein wenig herunter und lassen Sie sich den Eigenschaftswert erneut ausgeben, um die Ver&auml;nderung zu beobachten.<\/p>\n<pre>Public Function Markierungskoordinaten()\n    Dim objCodePane As CodePane\n    Dim lngStartLine As Long\n    Dim lngStartColumn As Long\n    Dim lngEndLine As Long\n    Dim lngEndColumn As Long\n    Set objCodePane = VBE.ActiveCodePane\n    With objCodePane\n        .GetSelection lngStartLine, lngStartColumn, lngEndLine, lngEndColumn\n        MsgBox \"Die Koordinaten lauten:\" & vbCrLf _\n            & \"Erste Zeile: \" & lngStartLine & vbCrLf _\n            & \"Erste Spalte: \" & lngStartColumn & vbCrLf _\n            & \"Letzte Zeile: \" & lngEndLine & vbCrLf _\n            & \"Letzte Spalte: \" & lngEndColumn & vbCrLf\n    End With\n    Set objCodePane = Nothing\nEnd Function<\/pre>\n<p><b>Quellcode 3<\/b><\/p>\n<pre>Public Function MarkierungSetzen()\n    Dim objCodePane As CodePane\n    Dim lngStartLine As Long\n    Dim lngStartColumn As Long\n    Dim lngEndLine As Long\n    Dim lngEndColumn As Long\n    Set objCodePane = VBE.ActiveCodePane\n    lngStartLine = 1\n    lngStartColumn = 1\n    lngEndLine = 2\n    lngEndColumn = 2\n    With objCodePane\n        .SetSelection lngStartLine, lngStartColumn, lngEndLine, lngEndColumn\n    End With\n    Set objCodePane = Nothing\nEnd Function<\/pre>\n<p><b>Quellcode 4<\/b><\/p>\n<h3>Koordinaten der aktuellen Markierung<\/h3>\n<p>F&uuml;r viele Funktionen ist die Kenntnis der aktuellen Markierung interessant. Die VBA-Entwicklungsumgebung erlaubt keinen Blockauswahl-Modus wie etwa Textpad. Die vier von der Funktion GetSelection gef&uuml;llten Parameter geben daher an, in welcher Zeile und Spalte das erste Zeichen und wo das letzte Zeichen der Markierung liegt. Das bedeutet, dass der Wert f&uuml;r die erste Spalte durchaus gr&ouml;&szlig;er als der Wert f&uuml;r die letzte Spalte sein kann.<\/p>\n<p>Allgemein ist zu dieser Funktion Folgendes zu bemerken: Die vier Parameter sind keine Eingangs-, sondern Ausgangsparameter, die erst bei Ausf&uuml;hrung der Funktion gef&uuml;llt werden. Das bringt mit sich, dass Sie statt konkreter Werte Variablen f&uuml;r diese Parameter angeben m&uuml;ssen, die Sie vorher deklarieren.<\/p>\n<p>Im Detail sieht das wie in der Prozedur aus Quellcode 3 aus.<\/p>\n<h3>Markierung setzen<\/h3>\n<p>Das Pendant f&uuml;r die Funktion GetSelection hei&szlig;t SetSelection. Damit k&ouml;nnen Sie einen vorgegebenen Bereich im aktuellen CodePane markieren. Die Routine aus Quellcode 4 zeigt, wie es funktioniert.<\/p>\n<p>Wenn Sie diese Prozedur vom Direktfenster aus aufrufen, werden Sie die Wirkung m&ouml;glicherweise nicht erkennen k&ouml;nnen. Das liegt daran, dass der Fokus weiterhin auf dem Direktfenster liegt.<\/p>\n<p>Sie k&ouml;nnen dies umgehen, indem Sie die Prozedur von einem Formular aus aufrufen. Legen Sie dazu eine einfache Schaltfl&auml;che an und f&uuml;gen Sie der Ereignisprozedur, die beim Klicken ausgel&ouml;st wird, den Prozeduraufruf Markierung setzen hinzu.<\/p>\n<p>Wenn Sie die Prozedur auf diesem Wege aufgerufen haben und dann zur VBA-Entwicklungsumgebung wechseln, ist der gew&uuml;nschte Code markiert.<\/p>\n<p>Mit den Methoden und Eigenschaften des CodeModule-Objekts stellt das VBE-Objektmodell Werkzeuge zum Lesen, Bearbeiten und Erstellen von Code bereit.<\/p>\n<p>Nachfolgend erfahren Sie zun&auml;chst, wie Sie lesend auf den Code zugreifen; anschlie&szlig;end geht es um das Bearbeiten, Hinzuf&uuml;gen und L&ouml;schen von Code.<\/p>\n<h3>Hinweis<\/h3>\n<p>Wenn nachfolgend von Prozedur die Rede ist, sind verallgemeinert Sub-, Function und Property Let\/Set\/Get-Prozeduren gemeint. <\/p>\n<h2>Lesender Zugriff auf Quellcode<\/h2>\n<p>Das VBE-Objektmodell stellt die folgenden Eigenschaften und Methoden f&uuml;r den lesenden Zugriff zur Verf&uuml;gung:<\/p>\n<li>CountOfDeclarationLines: Gibt die Anzahl der Zeilen des Deklarationsbereichs der Prozedur zur&uuml;ck. Das sind alle Zeilen von der ersten Zeile des Moduls bis zur letzten Zeile vor der ersten Prozedur. Dabei geh&ouml;ren alle Leerzeilen, die sich unmittelbar vor der Prozedur befinden, zu dieser Prozedur.<\/li>\n<li>CountOfLines: Gibt die Gesamtanzahl der Zeilen des Moduls inklusive Deklarationsbereich zur&uuml;ck.<\/li>\n<li>Find: Dient der Suche nach einem bestimmten Ausdruck. Liefert die Koordinaten der Fundstelle zur&uuml;ck.<\/li>\n<li>Lines: Gibt eine bestimmte Anzahl Zeilen von einer festgelegten Startzeile an zur&uuml;ck.<\/li>\n<li>ProcBodyLine: Gibt die Zeilennummer der Deklarationszeile einer Prozedur zur&uuml;ck.<\/li>\n<li>ProcCountLines: Gibt die Anzahl der Zeilen einer Prozedur zur&uuml;ck.<\/li>\n<li>ProcOfLine: Gibt den Namen der Prozedur in einer angegebenen Zeile zur&uuml;ck und einen Leerstring, wenn die angegebene Zeile im Deklarationsbereich liegt.<\/li>\n<li>ProcStartLine: Gibt die erste Zeile der angegebenen Prozedur zur&uuml;ck. Wenn sich unmittelbar vor der ersten Zeile Leerzeilen befinden, wird die Zeilennummer der ersten dieser Zeilen zur&uuml;ckgegeben.<\/li>\n<h3>Analysieren eines Moduls<\/h3>\n<p>Leider bietet das CodeModule-Objekt keine M&ouml;glichkeit, per Auflistung auf die einzelnen Prozeduren zuzugreifen. Das ist allerdings eine passende Gelegenheit, die soeben beschriebenen Eigenschaften und Methoden an einem handfesten Beispiel zu demonstrieren.<\/p>\n<p>Die Prozedur aus Quellcode 5 zeigt die Anwendung aller Elemente au&szlig;er der Find-Methode.<\/p>\n<p>Die Prozedur verwendet eine Objektvariable namens objCodeModule f&uuml;r den Zugriff auf das aktuelle CodeModule-Objekt. Ein Modul kann mehrere Prozeduren, aber nur einen Deklarationsbereich enthalten, und dieser liegt immer am Anfang des Moduls. Die Prozedur ermittelt zun&auml;chst die Anzahl der Zeilen dieses Bereichs mit der CountOfDeclarationLines-Eigenschaft und gibt sie im Direktfenster aus.<\/p>\n<p>Anschlie&szlig;end durchl&auml;uft die Prozedur alle &uuml;brigen Zeilen des Moduls beginnend mit der ersten Zeile nach dem Deklarationsbereich, sofern noch weitere Zeilen vorhanden sind. Das &uuml;berpr&uuml;ft die Do&#8230;While-Schleife, bevor sie mit der Analyse der ersten Prozedur beginnt, indem sie die Nummer der aktuellen Zeile mit derjenigen der letzten Zeile vergleicht. F&uuml;r das Ermitteln der Nummer der letzten Zeile ist dabei die CountOfLines-Eigenschaft verantwortlich.<\/p>\n<p>Die erste Zeile nach dem Deklarationsbereich enth&auml;lt &#8211; sofern &uuml;berhaupt eine Prozedur vorhanden ist &#8211; deren erste Zeile. Mit der ProcOfLine-Eigenschaft, die als Parameter die zu untersuchende Zeile und eine Variable zur R&uuml;ckgabe des Prozedurtyps erwartet, ermittelt man den Namen der Prozedur, zu der diese Zeile geh&ouml;rt.<\/p>\n<p>Die Prozedur Modulanalyse soll hilfreiche Informationen &uuml;ber das Modul ausgeben, daher gibt sie sich nicht mit der Ausgabe des Prozedurtyps in Form des entsprechenden konstanten Zahlenwerts zufrieden, sondern pr&auml;sentiert einen entsprechenden Ausdruck wie Sub-Prozedur, Function-Prozedur, Property Get-Prozedur, Property Let-Prozedur oder Property Set-Prozedur.<\/p>\n<p>Die von der Funktion ProcOfLine gef&uuml;llte Variable enth&auml;lt Werte von 0 bis 3, wobei die Zahlen den Konstanten aus Tab. 1 entsprechen.<\/p>\n<p>Wie Sie der Tabelle entnehmen k&ouml;nnen, teilen sich Sub- und Function-Prozeduren eine Konstante. Um detailliertere Informationen zum Typ auszugeben, m&uuml;ssen Sie die Prozedur also genauer untersuchen. Nun ist bekannt, dass die Deklarationszeile von Sub- oder Function-Prozeduren irgendwo in der Deklarationszeile entweder das Schl&uuml;sselwort Sub oder Function enth&auml;lt. Dummerweise k&ouml;nnen diese Schl&uuml;sselw&ouml;rter aber auch beispielsweise im Prozedurnamen vorkommen und die Position der Schl&uuml;sselw&ouml;rter ist auch nicht konstant: Manchmal beginnt die Deklaration der Prozedur mit einem der Schl&uuml;sselw&ouml;rter, mal beginnt sie mit Public oder Private.<\/p>\n<table border=1>\n<tr>\n<td>\n<p><b>Zahlenwert<\/b><\/p>\n<\/td>\n<td>\n<p><b>Konstante (Bedeutung)<\/b><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>0<\/p>\n<\/td>\n<td>\n<p>vbext_pk_Proc (Sub- oder Function-Prozedur)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>1<\/p>\n<\/td>\n<td>\n<p>vbext_pk_Let (Property Let-Prozedur)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>2<\/p>\n<\/td>\n<td>\n<p>vbext_pk_Set (Property Set-Prozedur)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>3<\/p>\n<\/td>\n<td>\n<p>vbext_pk_Get (Property Get-Prozedur)<\/p>\n<\/td>\n<\/tr>\n<\/table>\n<p><b>Tab. 1: Konstanten des Parameters ProcKind<\/b><\/p>\n<p>Die Prozedur Modulanalyse umschifft dieses Problem, indem sie einfach die letzte Zeile der Prozedur untersucht &#8211; und die hei&szlig;t immer End Sub oder End Function. Dazu l&auml;sst sich auch gut die Funktionsweise der Eigenschaften ProcStartLine und ProcCountLines demonstrieren, denn die um eins geminderte Summe dieser beiden Werte entspricht der Nummer der letzten Zeile der Prozedur. Und die enth&auml;lt die gesuchten Schl&uuml;sselw&ouml;rter, mit denen sich die genaue Art der Prozedur ermitteln l&auml;sst.<\/p>\n<p>Der Rest ist Flei&szlig;arbeit: Die Eigenschaften ProcCountLines, ProcStartLine und ProcBodyLine geben die jeweiligen Werte aus. Dabei ist eines zu beachten: Alle drei enthalten ebenfalls den weiter oben beschriebenen Parameter ProcKind. W&auml;hrend die Funktion ProcOfLine diesen Wert f&uuml;llt, m&uuml;ssen Sie ihn bei den &uuml;brigen Eigenschaften angeben.<\/p>\n<p>Solange Sie daf&uuml;r eine Variable deklarieren und die Funktion ProcOfLine vor den anderen Funktionen aufrufen, treten keine Probleme auf &#8211; sofern Sie die gleiche, nun gef&uuml;llte Variable auch als Parameter dieser Funktionen angeben.<\/p>\n<pre>Public Sub Modulanalyse()\n    Dim objCodeModule As CodeModule\n    Dim lngLine As Long\n    Dim lngProcKind As Long\n    Dim strProcName As String\n    Dim strProcKind As String\n    Dim lngProcStartLine As Long\n    Dim strLine As String\n    Dim lngProcCountLines As Long\n    Set objCodeModule = VBE.ActiveCodePane.CodeModule\n    With objCodeModule\n        lngLine = .CountOfDeclarationLines\n        Debug.Print \"Deklarationsbereich: \" & lngLine & \" Zeile(n)\"\n        lngLine = lngLine + 1\n        Do While lngLine &lt;= .CountOfLines\n            strProcName = .ProcOfLine(lngLine, lngProcKind)\n            Select Case lngProcKind\n                Case vbext_pk_Proc\n                    lngProcStartLine = .ProcStartLine(strProcName, lngProcKind)\n                    lngProcCountLines = .ProcCountLines(strProcName, lngProcKind)\n                    strLine = .Lines(lngProcStartLine + lngProcCountLines - 1, 1)\n                    If strLine = \"End Sub\" Then\n                        strProcKind = \"Sub-Prozedur\"\n                    Else\n                        strProcKind = \"Function-Prozedur\"\n                    End If\n                Case vbext_pk_Let\n                    strProcKind = \"Property Let-Prozedur\"\n                Case vbext_pk_Set\n                    strProcKind = \"Property Set-Prozedur\"\n                Case vbext_pk_Get\n                    strProcKind = \"Property Get-Prozedur\"\n            End Select\n            Debug.Print vbCrLf\n            Debug.Print \"Prozedurname:      \" & strProcName\n            Debug.Print \"=============================\"\n            Debug.Print \"Anzahl Zeilen:     \" & .ProcCountLines(strProcName, _                lngProcKind)\n            Debug.Print \"Startzeile:        \" & .ProcStartLine(strProcName, _                lngProcKind)\n            Debug.Print \"Deklarationszeile: \" & .ProcBodyLine(strProcName, _                lngProcKind)\n            Debug.Print \"Prozedurtyp:       \" & strProcKind\n            lngLine = lngLine + .ProcCountLines(strProcName, lngProcKind)\n        Loop\n    End With\n    Set objCodeModule = Nothing\nEnd Sub<\/pre>\n<p><b>Quellcode 5<\/b><\/p>\n<p>Nach der Ausgabe der Informationen einer Prozedur erh&ouml;ht eine entsprechende Anweisung den Z&auml;hler lngLine so, dass er auf der ersten Zeile der folgenden Prozedur steht und die Do&#8230;While-Schleife den n&auml;chsten Kandidaten untersucht oder die letzte Zeile erreicht ist und die Prozedur beendet wird.<\/p>\n<h3>Suchen mit der Find-Methode<\/h3>\n<p>Die Find-Methode arbeitet wie die Methoden GetSelection und SetSelection mit vier Parametern, die zur R&uuml;ckgabe der Koordinaten des gesuchten Ausdrucks dienen. Zus&auml;tzlich enth&auml;lt sie einen weiteren Parameter, der zur Angabe des gesuchten Ausdrucks dient.<\/p>\n<p>Die Methode hat weitere drei Parameter:<\/p>\n<li>WholeWord: Sucht nur nach kompletten W&ouml;rtern.<\/li>\n<li>MatchCase: Beachtet Gro&szlig;- und Kleinschreibung.<\/li>\n<li>PatternSearch: L&auml;sst Verwendung von Platzhaltern wie Sternchen (*) und Fragezeichen () zu.<\/li>\n<p>Ein Beispiel f&uuml;r den Einsatz dieser Methode finden Sie weiter unten in Quellcode 6.<\/p>\n<h2>Bearbeiten des Quellcodes<\/h2>\n<p>Zum Bearbeiten des Quellcodes stehen die folgenden Methoden zur Verf&uuml;gung:<\/p>\n<li>AddFromFile: F&uuml;gt den Inhalt der angegebenen Textdatei am Anfang des Moduls ein.<\/li>\n<li>AddFromString: F&uuml;gt den im Parameter angegebenen Text am Anfang des Moduls ein.<\/li>\n<li>CreateEventProc: Erzeugt eine Ereignisprozedur. Erwartet den Namen des Ereignisses (zum Beispiel OnClick) und den Namen des Objekts (zum Beispiel cmdButton) als Parameter und funktioniert nur, wenn das Objekt existiert und dieses das Ereignis unterst&uuml;tzt.<\/li>\n<li>InsertLines: F&uuml;gt den angegebenen Text inklusive Zeilenumbruch in die gew&uuml;nschte Zeile ein.<\/li>\n<li>DeleteLines: L&ouml;scht die angegebene Zeilenanzahl von der gew&uuml;nschten Zeile an.<\/li>\n<li>ReplaceLine: Ersetzt den Inhalt einer Zeile durch den angegebenen Inhalt.<\/li>\n<h3>Einfaches Hinzuf&uuml;gen von Code<\/h3>\n<p>Die beiden Methoden AddFromFile und AddFromText sind die einfachste M&ouml;glichkeit, Code zu einer bestehenden Prozedur hinzuzuf&uuml;gen.<\/p>\n<p>Da sie den Code jedoch direkt am Anfang des Moduls einf&uuml;gen, sind sie praktisch nur direkt nach dem Anlegen eines Moduls und zum Hinzuf&uuml;gen kompletter Modulinhalte zu verwenden &#8211; beispielsweise, um den Inhalt eines kompletten Moduls zu kopieren.<\/p>\n<h3>Anlegen einer Ereignisprozedur<\/h3>\n<p>Die Methode CreateEventProc ist besonders dann interessant, wenn Steuerelemente und deren Elemente automatisch und in gro&szlig;en Mengen angelegt werden sollen.<\/p>\n<p>Die Methode erwartet den englischen Namen des Ereignisses und den Namen des Objekts &#8211; dabei kann es sich um ein Formular, einen Bericht oder ein darin enthaltenes Steuerelement sowie um sonstige Objekte handeln.<\/p>\n<p>Fehler treten dann auf, wenn es entweder das Objekt nicht gibt oder dieses das angegebene Ereignis nicht unterst&uuml;tzt beziehungsweise dieses gar nicht existiert.<\/p>\n<p>Ein Beispielaufruf f&uuml;r die Beim Klicken-Prozedur einer Schaltfl&auml;che namens cmdKlick sieht folgenderma&szlig;en aus (in einer Zeile):<\/p>\n<pre>VBE.ActiveCodePane.CodeModule.CreateEventProc \"Click\", \"cmdKlick\"<\/pre>\n<p>Der Aufruf erzeugt folgenden Prozedurrumpf:<\/p>\n<pre>Private Sub cmdKlick_Click()\nEnd Sub\nPublic Function FillEvent(strEvent As String, strObject As String, strText As String)\n    Dim objCodeModule As CodeModule\n    Dim lngStartLine As Long\n    Dim lngStartColumn As Long\n    Dim lngEndLine As Long\n    Dim lngEndColumn As Long\n    Dim bolResult As Boolean\n    Set objCodeModule = VBE.ActiveCodePane.CodeModule\n    bolResult = objCodeModule.Find(strObject & \"_\" _        & strEvent, lngStartLine, lngStartColumn, _        lngEndLine, lngEndColumn)\n    If bolResult = True Then\n        objCodeModule.InsertLines lngStartLine + 1, _        strText\n    Else\n        MsgBox \"Die angegebene Prozedur konnte \" _\n            & \"nicht gefunden werden.\"\n    End If\n    Set objCodeModule = Nothing\nEnd Function<\/pre>\n<p><b>Quellcode 6<\/b><\/p>\n<h3>Zeilen einf&uuml;gen<\/h3>\n<p>Etwas flexibler als die Methoden AddFromFile und AddFromText ist die Methode InsertLines. Die Methode erwartet die Eingabe der Zeile, in die der Text eingef&uuml;gt werden soll, und den einzuf&uuml;genden Text.<\/p>\n<p>Wenn Sie der soeben erstellten Prozedur eine Zeile hinzuf&uuml;gen m&ouml;chten, verwenden Sie eine Prozedur wie aus Quellcode 4. Die Prozedur erwartet die englische Bezeichnung des Ereignisses, den Namen des Objekts sowie den f&uuml;r die Prozedur einzuf&uuml;genden Text. Sie sucht mit der Find-Methode nach der Zeile, in der sich der Prozedurkopf befindet, und speichert deren Nummer in der Variablen lngStartline (die anderen Koordinaten werden nat&uuml;rlich auch gespeichert, aber nicht ben&ouml;tigt).<\/p>\n<p>Wenn die Find-Methode erfolgreich war und den Wert True zur&uuml;ckgibt, f&uuml;gt die Prozedur die angegebene Zeile mit der InsertLines-Methode in die erste Zeile nach der Prozedurdeklaration ein; falls nicht, erscheint eine entsprechende Meldung. Der folgende Aufruf der Prozedur f&uuml;gt beispielsweise eine MsgBox-Anweisung zur Ereignisprozedur  cmdKlick_Click hinzu:<\/p>\n<pre>FillEvent \"Click\", \"cmdKlick\", \"    MsgBox \"\"Hallo!\"\"\"<\/pre>\n<h3>Zeilen ersetzen<\/h3>\n<p>Die Prozedur aus Quellcode 6 hat noch einen Haken: Die leere Zeile im Prozedurrumpf wird nicht &uuml;berschrieben, sondern einfach nach unten verschoben. Das schreit nach dem Einsatz der ReplaceLines-Methode. Nach einer &uuml;berpr&uuml;fung, ob die erste Zeile hinter der Prozedurdeklaration leer ist, kann man diese durch die neue Zeile ersetzen. L&ouml;schen Sie einfach die Zeile<\/p>\n<pre>objCodeModule.InsertLines lngStartLine + 1, strText<\/pre>\n<p>und ersetzen Sie diese durch das folgende If&#8230;Then-Konstrukt:<\/p>\n<pre>If Trim(objCodeModule.Lines( _    lngStartLine + 1, 1)) = \"\" Then\n    objCodeModule.ReplaceLine _        lngStartLine + 1, strText\nElse\n    objCodeModule.InsertLines _        lngStartLine + 1, strText\nEnd If<\/pre>\n<h3>Zeilen l&ouml;schen<\/h3>\n<p>Das L&ouml;schen von Zeilen erfolgt mit der Methode DeleteLines. Die Methode erwartet lediglich die Nummer der ersten zu l&ouml;schenden Zeile und deren Gesamtanzahl.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>VBESamples00.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/E7AAFC90-FA2F-4BFD-B6A9-6ADAFA0E8F77\/aiu_277.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>VBA-Code ist die Quelle des Lebens in einer Access-Datenbankanwendung. Ohne VBA-Code gibt es keine professionelle Anwendung. Diese Meinung ist g&auml;ngig. VBA-Code gibt man selbst ein; eventuell kopiert man die eine oder andere Routine und verwertet sie weiter. Auch diese Meinung kann man als landl&auml;ufig bezeichnen. Es verh&auml;lt sich aber ganz anders. Mit dem VBE-Objektmodell k&ouml;nnen Sie Code auch generieren, lesen oder anpassen lassen &#8211; mit ein wenig Fantasie sparen Sie sich so viel Arbeit. Mit dem vorliegenden Beitrag steigen Sie in die Programmierung der VBA-Entwicklungsumgebung ein und lernen die wichtigsten Grundlagen kennen.<\/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":[662005,66032005,44000023],"tags":[],"class_list":["post-55000277","post","type-post","status-publish","format-standard","hentry","category-662005","category-66032005","category-Mit_Formularen_arbeiten"],"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 bearbeiten - 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_bearbeiten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VBA-Code bearbeiten\" \/>\n<meta property=\"og:description\" content=\"VBA-Code ist die Quelle des Lebens in einer Access-Datenbankanwendung. Ohne VBA-Code gibt es keine professionelle Anwendung. Diese Meinung ist g&auml;ngig. VBA-Code gibt man selbst ein; eventuell kopiert man die eine oder andere Routine und verwertet sie weiter. Auch diese Meinung kann man als landl&auml;ufig bezeichnen. Es verh&auml;lt sich aber ganz anders. Mit dem VBE-Objektmodell k&ouml;nnen Sie Code auch generieren, lesen oder anpassen lassen - mit ein wenig Fantasie sparen Sie sich so viel Arbeit. Mit dem vorliegenden Beitrag steigen Sie in die Programmierung der VBA-Entwicklungsumgebung ein und lernen die wichtigsten Grundlagen kennen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-31T17:54:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-19T08:20:17+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/716ea3a05e204f37b0be5296013ac7eb\" \/>\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=\"18\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_bearbeiten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"VBA-Code bearbeiten\",\"datePublished\":\"2023-05-31T17:54:51+00:00\",\"dateModified\":\"2024-02-19T08:20:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/\"},\"wordCount\":3468,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/716ea3a05e204f37b0be5296013ac7eb\",\"articleSection\":[\"2005\",\"3\\\/2005\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/\",\"name\":\"VBA-Code bearbeiten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/716ea3a05e204f37b0be5296013ac7eb\",\"datePublished\":\"2023-05-31T17:54:51+00:00\",\"dateModified\":\"2024-02-19T08:20:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/716ea3a05e204f37b0be5296013ac7eb\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/716ea3a05e204f37b0be5296013ac7eb\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/vbacode_bearbeiten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"VBA-Code bearbeiten\"}]},{\"@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 bearbeiten - 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_bearbeiten\/","og_locale":"de_DE","og_type":"article","og_title":"VBA-Code bearbeiten","og_description":"VBA-Code ist die Quelle des Lebens in einer Access-Datenbankanwendung. Ohne VBA-Code gibt es keine professionelle Anwendung. Diese Meinung ist g&auml;ngig. VBA-Code gibt man selbst ein; eventuell kopiert man die eine oder andere Routine und verwertet sie weiter. Auch diese Meinung kann man als landl&auml;ufig bezeichnen. Es verh&auml;lt sich aber ganz anders. Mit dem VBE-Objektmodell k&ouml;nnen Sie Code auch generieren, lesen oder anpassen lassen - mit ein wenig Fantasie sparen Sie sich so viel Arbeit. Mit dem vorliegenden Beitrag steigen Sie in die Programmierung der VBA-Entwicklungsumgebung ein und lernen die wichtigsten Grundlagen kennen.","og_url":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-05-31T17:54:51+00:00","article_modified_time":"2024-02-19T08:20:17+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/716ea3a05e204f37b0be5296013ac7eb","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"VBA-Code bearbeiten","datePublished":"2023-05-31T17:54:51+00:00","dateModified":"2024-02-19T08:20:17+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/"},"wordCount":3468,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/716ea3a05e204f37b0be5296013ac7eb","articleSection":["2005","3\/2005","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/","url":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/","name":"VBA-Code bearbeiten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/716ea3a05e204f37b0be5296013ac7eb","datePublished":"2023-05-31T17:54:51+00:00","dateModified":"2024-02-19T08:20:17+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/716ea3a05e204f37b0be5296013ac7eb","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/716ea3a05e204f37b0be5296013ac7eb"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/vbacode_bearbeiten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"VBA-Code bearbeiten"}]},{"@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\/55000277","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=55000277"}],"version-history":[{"count":1,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000277\/revisions"}],"predecessor-version":[{"id":88075297,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000277\/revisions\/88075297"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}