{"id":55000398,"date":"2006-10-01T00:00:00","date_gmt":"2021-02-11T21:06:09","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=398"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Makros_im_Griff_per_VBA","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/","title":{"rendered":"Makros im Griff per VBA"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg04.met.vgwort.de\/na\/3ca6b9e15c984d7fa058b6196a9b5f31\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<h3>Zusammenfassung<\/h3>\n<p>Erfahren Sie, wie Sie per VBA auf Makros zugreifen, um diese etwa zu dokumentieren, zu erstellen oder anzupassen.<\/p>\n<h3>Techniken<\/h3>\n<p>Makros, VBA<\/p>\n<h3>Voraussetzungen<\/h3>\n<p>Access 2000 und h&ouml;her<\/p>\n<h3>Beispieldatenbank<\/h3>\n<p>Macroworks00.mdb<\/p>\n<h3><\/h3>\n<p><b>Sascha Trowitzsch, Berlin<\/b><\/p>\n<p><b>Wenn Sie Datenbanken von anderen Entwicklern oder aus fr&uuml;heren Schaffensperioden warten oder &uuml;berarbeiten m&ouml;chten, sto&szlig;en Sie m&ouml;glicherweise auf Makros. Diese wollen dokumentiert und gegebenenfalls nachbearbeitet werden. Das eine lie&szlig;e sich mit dem Datenbank-Dokumentierer von Access erledigen, dessen Ausgabe sich aber leider nur auf einen generierten Bericht beschr&auml;nkt, das andere mit dem Makro-Editor, der sich bisweilen aber als wenig komfortabel erweist. Sollten Sie nun auf die Idee kommen, selbst Routinen zur Dokumentation oder Bearbeitung von Makros zu programmieren, finden Sie hier das richtige Know-how. <\/b><\/p>\n<p>Gehen wir von der Annahme aus, dass Sie einen Datenbank-Dokumentierer programmieren m&ouml;chten, wie ihn Access im Prinzip bereits mitbringt (Extras\/Analyse\/Dokumentierer). Die Dokumentation wird von ihm als Access-Bericht erstellt, wobei die Darstellung deutlich zu w&uuml;nschen &uuml;brig l&auml;sst. Sch&ouml;ner w&auml;re es, wenn man eine Ausgabe der Dokumentation zum Beispiel in ein Word-Dokument erhielte, um sie anschlie&szlig;end formatieren zu k&ouml;nnen.<\/p>\n<h3>Datenbankobjekte auslesen<\/h3>\n<p>Die Technik zum Auslesen aller Datenbank-Objekte ist immer &auml;hnlich: Dies l&auml;sst sich &uuml;ber die Containers- und Documents-Auflistung des Database-Objects von Access realisieren. Zu jeder Objektart gibt es einen Container. F&uuml;r Formulare etwa w&auml;re das die Auflistung Database.Containers(&#8222;Forms&#8220;).Documents. F&uuml;r Makros lautet die Auflistung Database.Containers(&#8222;Scripts&#8220;).Documents.<\/p>\n<p>Mit der For Each-Schleife aus Quellcode 1 erhalten Sie die Objektenamen der Elemente dieser Auflistung.<\/p>\n<p>Kennt man einmal die Namen der Objekte, dann kann man im n&auml;chsten Schritt auch  deren einzelne Eigenschaften ermitteln. Formulare beispielsweise lassen sich VBA im Entwurf &ouml;ffnen; anschlie&szlig;end stehen die Eigenschaften zum Auslesen bereit. Daneben bietet das Access-Objektmodell zu jeder Objektart auch eine Auflistung: F&uuml;r Formulare die Forms-Auflistung, f&uuml;r Berichte die Reports-Auflistung, f&uuml;r Tabellen die TableDefs, f&uuml;r Abfragen die QueryDefs, und so weiter. <\/p>\n<p><IMG height=\"253\" src=\"..\/fileadmin\/_temp_\/{F01B281B-3EF8-48A8-A1DE-B4FE508FDE44}\/pic001.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1:   Formular Makroassinent der Beispieldatenbank<\/span><\/b><\/p>\n<p><b>Quellcode 1: Documents-Auflistung f&uuml;r den Datenbank-Container Forms durchlaufen<\/b><\/p>\n<pre>Sub ShowFormNames()\r\n    Dim dbs As Database\r\n    Dim oDoc As DAO.Document\r\n    Set dbs = CurrentDb\r\n    For Each oDoc In _        dbs.Containers(\"Forms\").Documents\r\n        Debug.Print oDoc.Name\r\n    Next oDoc\r\nEnd Sub<\/pre>\n<p>Nur eine Auflistung f&uuml;r Makros sucht man vergeblich. Es gibt leider keine und es gibt folglich auch kein Macro-Objekt. Es sieht danach aus, als k&ouml;nne man Makros nicht per VBA dokumentieren.<\/p>\n<p>Da Microsoft es jedoch mit dem eingebauten Dokumentierer vormacht, muss es doch eine M&ouml;glichkeit geben &#8211; schlie&szlig;lich sind alle Assistenten und eingebauten Tools von Access selbst in Access und VBA programmiert. (Diese befinden sich unter anderem in der eingeklinkten Addin-Datenbank acwztool.mde im Office-Verzeichnis.)  <\/p>\n<p>Nachforschungen, wie an die Makros per VBA heranzukommen w&auml;re, f&uuml;hren zur versteckten WizHook-Klasse von Access.<\/p>\n<p>Zun&auml;chst stellen wir jedoch den in der Beispieldatenbank enthaltenen Makroassistent (frmMakroassistent) vor, der die nachfolgend betrachteten Routinen zur Dokumentation und Bearbeitung von Makros implementiert.<\/p>\n<p>Mit dem Makroassistent aus Bild 1 lassen sich die Makros einer Datenbank auslesen, bearbeiten und neu erstellen.<\/p>\n<p><b>Grundlegende Funktionen<\/b><\/p>\n<p>Ein Kombinationsfeld im Formularkopf listet alle Makros der Datenbank auf. Bild 1 zeigt beispielsweise AutoKeys-Makro an. Nach der Auswahl findet man im Detailbereich je eine der im Makro enthaltenen Anweisungen. Der Assistent zeigt diese also nicht in einer Liste an. Mit den Navigations-Buttons links unten kann man in den enthaltenen Makro-Anweisungen bl&auml;ttern.<\/p>\n<p>Die Schaltfl&auml;che L&ouml;schen dient zum Entfernen eines Makros aus der Datenbank &#8211; nat&uuml;rlich nicht, ohne zuvor eine L&ouml;schbest&auml;tigung einzuholen. <\/p>\n<p>Ein Klick auf Neu&#8230; f&ouml;rdert ein Eingabefenster zutage, in das man den Name eines neu anzulegenden Makros eingeben kann. Das Makros wird dann in der Datenbank erstellt und im Datenbankfenster markiert. Danach kann man unmittelbar mit der Eingabe der Aktionen f&uuml;r dieses Makro im Detailbereich beginnen. Gleichzeitig wird die Schaltfl&auml;che Speichern aktiv. Wird sie bet&auml;tigt, schreibt der Assistent alle im Detailbereich angegebenen Aktionen in das neue Makro. (Ein Klick auf den &#8222;OK&#8220;-Button schlie&szlig;t das Formular lediglich, speichert das Makro aber nicht!)<\/p>\n<p>Auf diese Weise lassen sich auch vorhandene Makros bearbeiten. Sie k&ouml;nnen also Anweisungen und Argumente &uuml;berschreiben oder neue mit &uuml;ber die Schaltfl&auml;che Neue Aktion hinzugef&uuml;gen. Der Assistent bietet den Vorteil, dass man mehrere Makros hintereinander bearbeiten oder anlegen kann, ohne diesen zu verlassen, wie es beim eingebauten Access-Makro-Editor der Fall ist.<\/p>\n<p>Die Schaltfl&auml;che Doku-Text erzeugt eine Dokumentation des gerade aktiven oder aller in der Datenbank enthaltenen Makros (siehe Bild 2).<\/p>\n<p><IMG height=\"119\" src=\"..\/fileadmin\/_temp_\/{F01B281B-3EF8-48A8-A1DE-B4FE508FDE44}\/pic002.png\" width=\"299\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2:  Einzelnes oder alle Makros mit dem Assitenten dokumentieren<\/span><\/b><\/p>\n<p>Diese Dokumentation wird als Datei macrodoc.txt im Anwendungsverzeichnis ausgegeben und anschlie&szlig;end automatisch in Notepad angezeigt. Die Schaltfl&auml;che ruft dazu die Prozedur DocumentMacros() im Modul mdlMacros auf.<\/p>\n<p>Das ist wohl auch jene Prozedur, die Sie am meisten interessieren d&uuml;rfte, falls Sie einen eigenen Dokumentierer realisieren m&ouml;chten. Die Prozedur erwartet den Namen des zu analysierenden Makros. Bei einem Aufruf ohne diesen Parameter dokumentiert diese Funktion alle Makros der Datenbank.<\/p>\n<p><b>Makroargumente bearbeiten<\/b><\/p>\n<p>Das Bearbeiten der Makroargumente erfolgt im Detailbereich des Formulars. Auf der linken Seite kann man in einem Kombinationsfeld die Anweisung f&uuml;r die Aktion ausw&auml;hlen. (Die Datenquelle f&uuml;r dieses Kombinationsfeld ist die Tabelle tblMacroActions.)<\/p>\n<p>Weiterhin kann man Angaben zu Kommentar, Bedingung und Makrogruppe der Aktion machen. Die hier m&ouml;glichen Angaben entsprechen exakt denen, die Sie auch im Makro-Editor von Access vornehmen w&uuml;rden (siehe Bild 3).<\/p>\n<p><IMG height=\"131\" src=\"..\/fileadmin\/_temp_\/{F01B281B-3EF8-48A8-A1DE-B4FE508FDE44}\/pic003.png\" width=\"282\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3:  Angaben zur Makro-Aktion<\/span><\/b><\/p>\n<p>Sobald im Kombinationsfeld eine Anweisung ausgew&auml;hlt wird, &auml;ndert sich die rechte Seite des Detailbereichs, der die Argumente der Aktion anzeigt. Abh&auml;ngig von der vorgesehenen Anzahl von Argumenten werden entsprechende Textfelder und\/oder Kombinationsfelder sichtbar (siehe Bild 4).<\/p>\n<p><IMG height=\"160\" src=\"..\/fileadmin\/_temp_\/{F01B281B-3EF8-48A8-A1DE-B4FE508FDE44}\/pic004.png\" width=\"426\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4:  Argumente der Makro-Aktion<\/span><\/b><\/p>\n<p>Wie das funktioniert, wird beim Betrachten der Ereignisprozedur Nach Aktualisierung des Kombinationsfelds Aktion deutlich (cbAction_AfterUpdate).<\/p>\n<p>Dort wird die Sichtbarkeit von bereits im Formular anlegten Text- und Kombinationsfeldern in Abh&auml;ngigkeit von der Anweisung (ActionID) gesteuert, wobei die Informationen dar&uuml;ber aus der Tabelle tblMacroArguments stammen. Im Entwurf des Formulars sind zun&auml;chst keine Textfelder in diesem Bereich sichbar. Das liegt daran, dass die Kombinationsfelder und Textfelder &uuml;bereinander liegen (siehe Bild 5).<\/p>\n<p><IMG height=\"64\" src=\"..\/fileadmin\/_temp_\/{F01B281B-3EF8-48A8-A1DE-B4FE508FDE44}\/pic005.png\" width=\"431\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5:  &uuml;bereinander gestapelte Kombinations- und Textfelder in frmMakroassitsent<\/span><\/b><\/p>\n<p>In der Prozedur wird zudem die Datenherkunft der Kombinationsfelder f&uuml;r die Argumente eingestellt. Es f&uuml;hrt an dieser Stelle zu weit, die Funktionsweise genauer zu beschreiben. (Das gilt auch f&uuml;r weiteren Code der Beispieldatenbank. Wollte man alle der nicht ganz trivialen Prozeduren und die Interna von Access-Makros genau erl&auml;utern, so lie&szlig;e sich damit gut und gerne ein komplettes Heft f&uuml;llen. Wer also die Prozeduren f&uuml;r eigene Zwecke verwenden m&ouml;chte, der kommt um ein Studium des Codes, der allerdings hinreichend kommentiert ist, nicht herum.)<\/p>\n<p>Nachdem Sie die notwendigen Argumente f&uuml;r eine Makroanweisung eingegeben haben, k&ouml;nnen Sie &uuml;ber die Schaltfl&auml;che Neue Aktion die n&auml;chste Anweisung anlegen, oder, so vorhanden, mit der rechten Navigationsschaltfl&auml;che zur n&auml;chsten  springen. Zum Schluss bet&auml;tigen Sie die Speichern-Schaltfl&auml;che. Das ist wichtig, denn falls Sie im Makro-Kombinationsfeld im Kopfbereich ein neues Makro ausw&auml;hlen, gehen sonst s&auml;mliche Einstellungen des aktuellen Makros verloren.<\/p>\n<p>Eine Aktion innerhalb eines Makro l&auml;sst sich &uuml;brigens einfach l&ouml;schen, indem sie Sie auf den Datensatzmarkierer klicken und die Taste ENTF bet&auml;tigen.<\/p>\n<p>Sie k&ouml;nnen diesen Assistenten nun einfach benutzen oder ihn als Grundlage f&uuml;r eigene Entwicklungen verwenden. In diesem Fall, oder wenn Sie verstehen m&ouml;chten, was sich hinter ihm verbirgt, sollten Sie sich die folgenden Abs&auml;tze zu Gem&uuml;te f&uuml;hren, die die Funktionsweise verdeutlichen. <\/p>\n<p>Makros haben die folgenden Eigenschaften:<\/p>\n<li>Ein Makro hat einen Namen, der in der Documents-Auflistung des Datenbank-Containers Scripts enthalten ist.<\/li>\n<li>Es enth&auml;lt eine Folge von Anweisungen, die genau den DoCmd-Methoden von Access entsprechen. Bei Makros hei&szlig;en diese Anweisungen Aktionen (actions).<\/li>\n<li>Eine Anweisung kann einen Gruppennamen zugewiesen bekommen. Wird dieser Gruppenname zus&auml;tzlich zum Makronamen, zum Beispiel in einem Ereignis, angegeben, dann werden alle Anweisungen nur dieser Gruppe ausgef&uuml;hrt (MakroXY.Gruppe1).<\/li>\n<li>Eine Anweisung kann einen Kommentar enthalten. Einer Anweisung kann eine Bedingung vorgegeben werden. Nur wenn diese erf&uuml;llt ist, wird die Anweisung ausgef&uuml;hrt.<\/li>\n<li>Eine Anweisung kann einen variablen Satz von (optionalen) Parametern enthalten, der auch aus der Syntax der analogen Docmd-Methode hervorgeht. Bei Makros werden diese nicht als Parameter, sondern als Argumente bezeichnet.<\/li>\n<li>Ein Argument kann intern ein String sein oder eine Zahl, die als ID einen Eintrag aus einer vorgegebenen Parameterliste identifiziert. Letztere wird im Makro-Editor als Kombinationsfeld angezeigt. (Zu sehen ist in diesen Kombinationsfeldern jeweils nur der Texteintrag. Die dahinter liegende Zahl, das eigentliche Argument, bleibt verborgen.)<\/li>\n<p><!--30percent--><\/p>\n<p>Dieser Aufbau spiegelt sich in zwei Tabellen der Beispieldatenbank Macrowork00.mdb wieder.<\/p>\n<p>Die Tabelle tblMacroActions enth&auml;lt alle m&ouml;glichen Anweisungen. Das Feld ActionName zeigt die eingedeutschten Namen der Anweisungen. Die Spalte ActionID ist kein Autowert, sondern ein internes Token, das die Anweisung f&uuml;r Access identifiziert. Diese Action-IDs sind zentral und es wird in den Modulen der Datenbank viel damit hantiert. Die letzte Spalte CountOfArguments gibt an, wie viele Parameter die Anweisung erwartet. Die meisten dieser Argumente sind allerdings optional.<\/p>\n<p>Die Tabelle tblMacroArguments ist eine Detailtabelle, die die Argumente zu den einzelnen Anweisungen der Tabelle tblMacroActions auflistet. Die beiden sind wie in Bild 6 miteinander verkn&uuml;pft.<\/p>\n<p><IMG height=\"136\" src=\"..\/fileadmin\/_temp_\/{F01B281B-3EF8-48A8-A1DE-B4FE508FDE44}\/pic006.png\" width=\"294\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6:  Tabellen und Beziehungen des Makroassistenten<\/span><\/b><\/p>\n<p>In der Tabelle tblMacroArguments bezeichnet das Feld Argument den Namen eines Parameters. ColID ist die Nummer der Parameterzeile in der Reihenfolge, wie sie auch im Makro-Editor erscheint. ComboType gibt an, um welche Art von Parameter es sich handelt. Eine 0 entspricht dabei einen String. Eine 1 oder eine 8  entspricht hier, dass es sich um eine Auswahl (Kombinationsfeld) handelt.<\/p>\n<p>In diesem Fall stehen in der Spalte ComboString die zur Auswahl stehenden Argumente als semikolonseparierter String. Ein Spezialfall ist der ComboType 9, der nur bei der Anweisung Ausf&uuml;hrenBefehl (RunCommand) vorkommt.<\/p>\n<p>Eine Liste aller m&ouml;glichen RunCommand-Konstanten und deren Namen findet sich in der Hilfstabelle tblRunCommands12. Neben dem Konstantenwert ID steht in deren Feld Command der Name der Konstante neben der Access-Version, in der sie verf&uuml;gbar ist.<\/p>\n<p>Ich habe bisher noch keine M&ouml;glichkeit gefunden, diese Konstanten per Code in die deutschen Pendants zu &uuml;bersetzen. (Beispiel: acCmdAppMaximize w&auml;re AnwendungMaximieren)<\/p>\n<p>Die beiden Tabellen tblMacroActions und tblMacroArguments werden &uuml;brigens mit der Prozedur CreateActionTables im Modul mdlMacros automatisch gef&uuml;llt. Das ist erforderlich, weil jede Access-Version einen anderen Satz von Makroanweisungen mitbringt.<\/p>\n<p>Diese Tabellen werden nun als Hilfstabellen im  Makroassistenten eingesetzt.<\/p>\n<p>Der Beitrag WizHook &#8211; versteckte Features in Access (Shortlink 358) stellt einige Funktionen der Wizhook-Klasse vor. <\/p>\n<p>Zu vielen findet sich bisher keine Beschreibung im Internet. Stellenweise dokumentiert ist aber die Funktion OpenScript (siehe Bild 7).<\/p>\n<p>Sie bringen diese Methode im Objektkatalog zur Anzeige, indem sie an beliebiger Stelle einen Rechtsklick ausf&uuml;hren und den Kontextmen&uuml;eintrag Verborgene Elemente anzeigen aktivieren.<\/p>\n<p>Im Listenfeld links w&auml;hlen sie dann die ausgegraute Klasse WizHook aus.<\/p>\n<p><IMG height=\"221\" src=\"..\/fileadmin\/_temp_\/{F01B281B-3EF8-48A8-A1DE-B4FE508FDE44}\/pic007.png\" width=\"418\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7:  Die Methode OpenScript der WizHook-Klasse im Objektkatalog<\/span><\/b><\/p>\n<p>Diese Methode ist der Startpunkt f&uuml;r die Arbeit mit Makros ist (ausf&uuml;hrliche Informationen zur WizHook-Klasse unter http:\/\/www.team-moeller.de\/access\/tiptrick\/wizhook.html).<\/p>\n<p>Microsoft hat keine der Funktionen der WizHook-Klasse dokumentiert. Was &uuml;ber sie bekannt ist, das ist ausschlie&szlig;lich das Ergebnis von experimentellen Forschungen verschiedener Access-Spezialisten.<\/p>\n<p>Auch zahlreiche Routinen der Beispieldatenbank zu diesem Beitrag sind Eigenentwicklungen auf der Basis von eingehenden Untersuchungen und Tests. Das bedeutet: Es steht ein gewisser Vorbehalt in Bezug auf die G&uuml;ltigkeit der Routinen und Funktionsbeschreibungen im Raum.<\/p>\n<p>Um es kurz zu machen: Es gibt nur eine Handvoll von Methoden in der WizHook-Klasse, die mit Makros in Verbindung stehen. Neben der erw&auml;hnten Methode OpenScript sind dies die folgenden:<\/p>\n<li>GetScriptString<\/li>\n<li>SaveScriptString<\/li>\n<li>NameFromActID<\/li>\n<li>ArgsOfActID<\/li>\n<p>Dass diese f&uuml;nf Methoden reichen sollten, um ein Makro vollst&auml;ndig per VBA zu beschreiben, verwundert.<\/p>\n<p>Tats&auml;chlich sind sie nur eine kleine Auswahl der ben&ouml;tigten Funktionen &#8211; und woher die anderen kommen, zeigt das folgenden Kapitel.<\/p>\n<p>Die Datei msaccess.exe legt viele Funktionen (etwa 100) nach au&szlig;en offen, die sich &uuml;ber API-Aufrufe in VBA verwenden lassen. Die Syntax und Deklarationen solcher API-Funktionen lassen sich indessen mit keinerlei Tools ermitteln, wenn man lediglich den API-Funktionsnamen kennt. Es ist beispielsweise offen, wie viele Parameter eine solche Funktion erwartet.<\/p>\n<p>Nun hat sich Microsoft vor einigen Jahren dazu entschlossen, den Quellcode der in Access 97 eingebauten Assistenten offen zu legen. Er ist nach wie vor unter ftp:\/\/ftp.microsoft.com\/Softlib\/MSLFILES erh&auml;ltlich  (WZMAIN80.exe, WZTOOL80.exe, WZLIB80.exe, WZFUNC97.exe.) Deren Module enthalten auch die gefragten API-Deklarationen. Etwa 15 davon sind f&uuml;r die Arbeit mit Makros relevant. Ein Beispiel:<\/p>\n<pre>Declare Sub CloseHscr Lib \"msaccess.exe\" Alias \"#20\" (ByVal hscr As Long)<\/pre>\n<p>Diese Funktion schlie&szlig;t ein per WizHook.OpenScript ge&ouml;ffnetes Makro. OpenScript gibt n&auml;mlich ein so genanntes Handle zu einem Makro zur&uuml;ck. Dieses Verfahren ist in der Win32-API-Welt weit verbreitet. Das &ouml;ffnen eines Objekts liefert ein Handle zur&uuml;ck, das es eindeutig identifiziert. Normalerweise muss das ge&ouml;ffnete Objekt dann auch wieder freigegeben werden, indem man das Handle einer Schlie&szlig;funktion &uuml;bergibt. Genau das tut die Funktion CloseHscr mit dem Long-Parameter hscr, der das Handle darstellt. <\/p>\n<p>Vielleicht noch ein Wort zur nicht so gel&auml;ufigen Deklaration der API-Funktion: Es taucht darin der Alias &#8222;#20&#8220; auf. Das bedeutet, dass diese Funktion der msaccess.exe nicht &uuml;ber den Funktionsausdruck CloseHscr  angesprochen wird &#8211; der eigentlich &uuml;blichen Syntax -, sondern &uuml;ber die Nummer 20 im Katalog der exportierten Funktionen. Das ist immer dann notwendig, wenn entweder gar kein Funktionsname von einer Exe oder DLL exportiert wird, oder der Funktionsname aufgrund von Sonderzeichen nicht korrekt von VBA &uuml;bergeben werden kann. Das ist im vorliegenden Beispiel der Fall. <\/p>\n<p>Beim Laden des Formulars wird zun&auml;chst ermittelt, ob die erw&auml;hnten Makrotabellen mit der gestarteten Version von Access &uuml;bereinstimmen. In die Datenbank wurde dazu ein benutzerdefiniertes Property accver aufgenommen. Der Inhalt wird mit der aktuell gestarteten Access-Version verglichen (SysCmd(acSysCmdAccessVer)) und bei Abweichung werden die Tabellen mit der Prozedur CreateActionTables neu erstellt.<\/p>\n<p>Danach wird das Auswahlfeld f&uuml;r die Makronamen in der Prozedur FillMacroCombo gef&uuml;llt. Dies geschieht, wie bereits in Quellcode 1 dargestellt, mit einem Durchlaufen der Documents-Ausflistung des Datenbank-Containers Scripts. Die Prozedur zeigt &uuml;brigens sch&ouml;n, wie sich die WizHook-Methode SortStringArray zum Sortieren eines auf einer Werteliste basierenden Kombinationsfelds verwenden l&auml;sst.<\/p>\n<p>Die Auswahl eines Makros im Kombinationsfeld l&ouml;st das Ereignis cbMacros_AfterUpdate auf, die ihrerseits die Prozedur ScanMacro ausruft. Diese Prozedur ist das Herzst&uuml;ck des Formularcodes. Sie bef&uuml;llt die Tabelle tblMakros mit den Anweisungen und Argumenten des Makros. Gleichzeitig ist diese Tabelle die Datenherkunft des Formulars selbst. Wie ScanMacro im Groben funktioniert wird, weiter unten in der Beschreibung des Moduls mdlMacros erkl&auml;rt.<\/p>\n<p>Ein Klick auf die mit Neu&#8230; beschriftete Schaltfl&auml;che cmdNew startet die Prozedur cmdNew_Click. Diese ruft wiederum die Prozedur CreateMacro im Modul mdlMacros auf. Um ein Makro in einer Datenbank neu zu erzeugen bedient man sich der folgenden Anweisung:<\/p>\n<pre>RunCommand acCmdNewObjectMacro<\/pre>\n<p>Das &ouml;ffnet automatisch den Makro-Editor, der mit DoCmd.Close wieder geschlossen wird; gleichzeitig wird dem neuen Makro ein Name zugewiesen (s. Quellcode 2). Wie die Sichtbarkeit der Text- und Kombinationsfelder f&uuml;r die Makroargumente im Detailbereich nach Auswahl einer Anweisung gesteuert wird, das wurde bereits in Kapitel 2 behandelt.<\/p>\n<p><b>Quellcode 2: Neues Makro erzeugen und benennen<\/b><\/p>\n<pre>RunCommand acCmdNewObjectMacro\r\nsTmpName = CurrentObjectName\r\nDoCmd.Save acMacro, sTmpName\r\nDoCmd.Close acMacro, sTmpName, acSaveYes\r\nDoCmd.Rename MacroName, acMacro, sTmpName<\/pre>\n<p>Interessant ist noch die Ereignisprozedur cmdStore_Click f&uuml;r das Abspeichern der Makroeinstellungen. Hier wird das Formular-Recordset, sprich der Inhalt der Tabelle tblMakros, durchlaufen und die Datens&auml;tze jeweils in einem benutzerdefinierten Typ TMakro zwischengespeichert:<\/p>\n<pre>Public Type TMacro\r\n    sGroup As String\r\n    sComment As String\r\n    sCondition As String\r\n    lCommand As Long\r\n    bHasArgs As Boolean\r\n    sArguments() As String\r\nEnd Type<\/pre>\n<p>Die Argumente (Parameter) einer Makroanweisung sind in diesem Typ einfach im String-Array sArguments untergebracht. Da mehrere Anweisungen pro Makro gespeichert werden sollen, wird ein Array des Typs TMakro erstellt. Es wird schlussendlich der Prozedur WriteMacro des Moduls mdlMacros unter Angabe des Namens des Makros &uuml;bergeben. Diese Prozedur ist &#8211; im Gegensatz zu der zum Auslesen von Makros (ScanMacro beziehungsweise DocumentMacros) &#8211; erfreulich knapp geraten.<\/p>\n<p>Nachdem nun bereits mehrmals auf Prozeduren des Moduls mdlMacros der Datenbank verwiesen wurde, sollen abschlie&szlig;end einzelne Elemente der enthaltenen Prozeduren etwas n&auml;her beleuchtet werden.<\/p>\n<p>Das Modul mdlMacros l&auml;sst sich ohne weiteres in andere Datenbanken &uuml;bertragen und kann dort seinen Dienst verrichten. Es enth&auml;lt grundlegende Funktionen wie die Prozedur DocumentMacros.<\/p>\n<p>(Allerdings m&uuml;ssen dann auch die ben&ouml;tigten Tabellen tblRunCommands12, tblMacroActions und tblMacroArguments mitimportiert werden.) <\/p>\n<p>Die im Folgenden beschriebenen Vorg&auml;nge lassen sich in den beiden Prozeduren DocumentMacros und WriteMacroSample am Besten nachvollziehen. Vielleicht noch der Hinweis, dass f&uuml;r die zum Einsatz kommenden WizHook-Methoden die Klasse wie immer zu Anfang jeder Prozedur freigeschaltet werden muss:<\/p>\n<pre>WizHook.Key = 51488399<\/pre>\n<p><b>Makro &ouml;ffnen<\/b><\/p>\n<p>Um Zugriff auf ein Makro zu erhalten, damit es bearbeitet oder ausgelesen werden kann, kommt die WizHook-Methode OpenScript zur Anwendung:<\/p>\n<pre>hMacro = WizHook.OpenScript(sName, sLabel, lOpenMode, lExtra, lVersion)<\/pre>\n<p>Von den Parametern f&uuml;r diese Methode sind nur zwei von Interesse: sName ist der Name des Makros, das bearbeitet werden soll und lOpenMode ist der Zugriffsmodus.<\/p>\n<p>Wird f&uuml;r lOpenMode eine 0 &uuml;bergeben, dann wird das Makro f&uuml;r Lesezugriff ge&ouml;ffnet, mit einer 2 f&uuml;r den Schreibzugriff. Im Erfolgsfall gibt die Funktion einen Wert ungleich 0 zur&uuml;ck.<\/p>\n<p>In hMacro steht dann der Long-Wert des Zugriffs-Handles, das  f&uuml;r die weitere Bearbeitung ben&ouml;tigt wird. Am Ende der Prozedur muss dann der Zugriff wieder freigegeben werden:<\/p>\n<pre>CloseHscr hMacro<\/pre>\n<p>Der API-Anweisung CloseHscr wird das beim &ouml;ffnen erhaltene Handle &uuml;bergeben. Es ist wichtig, dass dieser Parameter korrekt ist. Ein falsches Handle oder eine 0 an dieser Stelle f&uuml;hren meist zum Absturz von Access!<\/p>\n<p><b>Zeilenweiterschaltung<\/b><\/p>\n<p>Um den Inhalt einer Makroanweisung auslesen oder bearbeiten zu k&ouml;nnen muss zuerst eine Art Zeiger auf die betreffende Anweisungszeile gesetzt werden. Man kann sich die Anweisungen eines Makros wie ein Recordset vorstellen, dessen Datens&auml;tze jeweils die Befehle enthalten. Nach dem &ouml;ffnen des Makros steht der Zeiger noch vor der ersten Anweisung, weist also ins Leere. Wie bei einem Recordset mit der Methode MoveNext kann man im Makroobjekt mit der API-Funktion hscrNextRow zur n&auml;chsten Zeile navigieren:<\/p>\n<pre>Call hScrNextRow(hMacro, False, False)<\/pre>\n<p>Der Parameter hMacro ist das beim &ouml;ffnen erhaltene Zugriffs-Handle. Die beiden anderen sind unwesentlich. Wird diese Funktion nach dem &ouml;ffnen des Makros ausgef&uuml;hrt, dann befindet man sich in der ersten Anweisungszeile und kann nun deren Inhalt auslesen &#8211; oder beschreiben. Um zu den n&auml;chsten Zeilen zu schalten ruft man die Funktion wiederholt auf.<\/p>\n<p><b>Anweisung auslesen<\/b><\/p>\n<p>Auch dazu gibt es keine WizHook-Methode, sondern eine API-Funktion:<\/p>\n<pre>lActID = hScrGetActID(hMacro)<\/pre>\n<p>Nachdem man mit hScrNextRow zu einer g&uuml;ltigen Zeile geschaltet hat bekommt man mit dieser Funktion eine ID, die mit einer bestimmten Aktion korreliert. Diese ID, hier in der Variablen lActID gespeichert,  ist gewisserma&szlig;en ein Platzhalter f&uuml;r eine der DoCmd-Methoden von Access. Mit dieser ID kann man zun&auml;chst wenig anfangen. Um die Bezeichnung der Aktion zu ermitteln verwendet man eine WizHook-Methode:<\/p>\n<pre>sAktion = WizHook.NameFromActid(lActID)<\/pre>\n<p>Der Funktion wird die zuvor ermittelte Actions-ID &uuml;bergeben. Man bekommt von ihr die englische Bezeichnung f&uuml;r die Anweisung zur&uuml;ck. F&uuml;r die ID mit der Nummer 23 etwa ist das OpenForm.  Soll die lokalisierte Bezeichnung, also die deutsche, erhalten werden, dann muss man einen anderen Weg beschreiten: Access kennt eine versteckte Methode AppLoadString, die alle lokalisierten Bezeichnungen und S&auml;tze, die in Oberfl&auml;che oder Meldungen von Access auftreten k&ouml;nnen, zur&uuml;ckgibt, wenn man ihr eine Nummer &uuml;bergibt:<\/p>\n<pre>sBezeichnung = AppLoadString (Nr)<\/pre>\n<p>Wer Interesse daran hat, wie die R&uuml;ckgaben dieser Funktion aussehen, der kann eine Prozedur mit einer Schleife schreiben, die die Nummer von 0 bis ca. 10.000.000 erh&ouml;ht. F&uuml;r die meisten Nummern wird ein Leer-String zur&uuml;ckgegeben werden. Wer sich die Ergebnisse genau ansieht wird feststellen, dass ab einer gewissen Nummer die Bezeichnungen f&uuml;r die Makroanweisungen auftauchen. Das kann man sich zunutze machen, um die deutsche Bezeichnung zu ermitteln. (Erschwerend kommt hier allerdings hinzu, dass der Startwert der Nr f&uuml;r die Makrobezeichnungen in allen Access-Versionen unterschiedlich ist. In der Prozedur DocumentMacros ist das genaue Vorgehen detaillierter kommentiert.)<\/p>\n<p>Zur&uuml;ck zur Funktion hscrHetActID: Falls sie den Wert -1 zur&uuml;ckgibt, was keine g&uuml;ltige Action-ID darstellt, dann bedeutet das, dass man sich am Ende der Anweisungszeilen des Makros befindet. Das entspr&auml;che in einem Recordset dem Wert Recordset.EOF = True. Das ist also der Indikator daf&uuml;r, dass man alle Makrozeilen durchlaufen hat.  Ein Wert von 0 bedeutet dagegen &#8222;Leerzeile&#8220;. (Man kann im Makro-Editor zwischen den einzelnen Anweisungszeilen Leerzeilen einf&uuml;gen, ohne dass sich Access daran st&ouml;rt.)<\/p>\n<p>Nun m&ouml;chten wir noch wissen, welches die Attribute der Makrozeile sind. Mit der WizHook-Methode GetScriptString kommt man hier weiter:<\/p>\n<pre>WizHook.GetScriptString(hMacro, AttributNr, sAttribut)<\/pre>\n<p>Die Methode ist keine Funktion, sondern liefert das Ergebnis in der String-Variablen sAttribut zur&uuml;ck. &uuml;bergeben wird neben dem Makro-Handle die AttributNr. Dabei gibt es die folgende Zuordnung zwischen AttributNr und Anweisungsattribut:<\/p>\n<li>0: Makrogruppenname<\/li>\n<li>1: Kommentar der Makrozeile<\/li>\n<li>2: Bedingung der Makrozeile<\/li>\n<li>3 bis max. 12: Argumente der Makrozeile<\/li>\n<p><b>Argumente auslesen<\/b><\/p>\n<p>Wird also GetScriptString eine AttributNr von 3 bis 12 &uuml;bergeben, dann erh&auml;lt man die Argumente der Anweisung. Nun ist die Zahl der Parameter, die eine Makroanweisung ben&ouml;tigt, nicht immer gleich. Manche Anweisungen erfordern gar keine. Es ist deshalb zuerst zu ermitteln, wie viele Argumente ausgelesen werden k&ouml;nnen:<\/p>\n<pre>nArgumente = WizHook.ArgsOfActid(lActID)<\/pre>\n<p>Diese WizHook-Funktion liefert diese Anzahl von Argumenten, wenn ihr eine Action-ID &uuml;bergeben wird. Anschlie&szlig;end kann die Variable nArgumente f&uuml;r den Z&auml;hler einer Schleife verwendet werden, in der die einzelnen Argumente mit GetScriptString gelesen werden.<\/p>\n<p>Damit hat man zwar die einzelnen Argumentwerte, aber noch nicht die Bezeichnungen derselben. Um diese zu ermitteln existiert im Modul mdlMacros eine Hilfsfunktion, der die Action-ID sowie die AttributNr &uuml;bergeben wird:<\/p>\n<pre>Argumentbezeichnung = NameOfActionIDsArg (lActID, AttributNr +3)<\/pre>\n<p>Die Hilfsfunktion bedient sich dabei wieder eines API-Aufrufs sowie der erw&auml;hnten Access-Methode AppLoadString.<\/p>\n<p><b>Anweisung schreiben<\/b><\/p>\n<p>Als Pendant zur Funktion hscrGetActID, die eine Action-ID ausliest, kann man mit der API-Anweisung SaveActidHscr eine Action-ID in ein im Schreibmodus ge&ouml;ffnetes Makro schreiben:<\/p>\n<pre>SaveActidHscr hMacro, lActID<\/pre>\n<p>lActID ist die Action-ID. Die Zuordnung zwischen Action-ID und der Anweisungsbezeichnung kann &uuml;brigens in der Beispieldatenbank auch aus der Tabelle tblMakroActions ersehen werden.<\/p>\n<p>Das Vorgehen, um dem Makro die Attribute und Argumente beizubringen, ist analog zu dem beim Auslesen. Es kommt die WizHook-Methode SaveScriptString zum Einsatz:<\/p>\n<pre>WizHook.SaveScriptString hMacro, AttributNr, sArgument<\/pre>\n<p>Die zu &uuml;bergebenden Attribut-Nummern entsprechenden weiter oben aufgef&uuml;hrten. Der Argumentwert wird in sArgument immer als String &uuml;bertragen. Gespeichert werden die Makroeinstellungen erst, wenn das Makro-Handle mit der API-Funktion CloseHscr wieder freigegeben wurde.<\/p>\n<p>Mit dem hier Beschriebenen und der begleitenden Beispieldatenbank Macrowork00.mdb erhalten Sie das R&uuml;stzeug f&uuml;r das Bearbeiten von Makros in Access. Mit dem Makroassistenten haben Sie eine Alternative zum Bearbeiten von Makros mit dem Access-eigenen Editor und zum Dokumentierer. Sie k&ouml;nnen Makros aus VBA heraus dokumentieren.<\/p>\n<p>In dieser Ausf&uuml;hrlichkeit sind nach meiner Kenntnis noch keine Informationen &uuml;ber die Programmierung von Makros im Internet zu finden. Es sollte aber nicht verschwiegen werden, dass die Routinen m&ouml;glicherweise noch die eine oder andere Unzul&auml;nglichkeit aufweisen und kleinere Fehler auftreten k&ouml;nnen.<\/p>\n<p>F&uuml;r Tester der Beta-Version von Access 2007 noch ein Hinweis: Das Auslesen von Makros gelingt zwar mit den beschriebenen Prozeduren, nicht jedoch das Schreiben, weil in Access 2007 Beta die M&ouml;glichkeiten rund um Makros von Microsoft deutlich ausgeweitet und &uuml;berarbeitet wurden.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>macrowork00.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/C28B666B-2131-4B3C-B73C-3415BEEEA32E\/aiu_398.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie Datenbanken von anderen Entwicklern oder aus fr&uuml;heren Schaffensperioden warten oder &uuml;berarbeiten m&ouml;chten, sto&szlig;en Sie m&ouml;glicherweise auf Makros. Diese wollen dokumentiert und gegebenenfalls nachbearbeitet werden. Das eine lie&szlig;e sich mit dem Datenbank-Dokumentierer von Access erledigen, dessen Ausgabe sich aber leider nur auf einen generierten Bericht beschr&auml;nkt, das andere mit dem Makro-Editor, der sich bisweilen aber als wenig komfortabel erweist. Sollten Sie nun auf die Idee kommen, selbst Routinen zur Dokumentation oder Bearbeitung von Makros zu programmieren, finden Sie hier das richtige Know-how.<\/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":[662006,66052006,44000025],"tags":[],"class_list":["post-55000398","post","type-post","status-publish","format-standard","hentry","category-662006","category-66052006","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Makros im Griff per VBA - 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\/Makros_im_Griff_per_VBA\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Makros im Griff per VBA\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie Datenbanken von anderen Entwicklern oder aus fr&uuml;heren Schaffensperioden warten oder &uuml;berarbeiten m&ouml;chten, sto&szlig;en Sie m&ouml;glicherweise auf Makros. Diese wollen dokumentiert und gegebenenfalls nachbearbeitet werden. Das eine lie&szlig;e sich mit dem Datenbank-Dokumentierer von Access erledigen, dessen Ausgabe sich aber leider nur auf einen generierten Bericht beschr&auml;nkt, das andere mit dem Makro-Editor, der sich bisweilen aber als wenig komfortabel erweist. Sollten Sie nun auf die Idee kommen, selbst Routinen zur Dokumentation oder Bearbeitung von Makros zu programmieren, finden Sie hier das richtige Know-how.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-11T21:06:09+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg04.met.vgwort.de\/na\/3ca6b9e15c984d7fa058b6196a9b5f31\" \/>\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\\\/Makros_im_Griff_per_VBA\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Makros im Griff per VBA\",\"datePublished\":\"2021-02-11T21:06:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/\"},\"wordCount\":3984,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg04.met.vgwort.de\\\/na\\\/3ca6b9e15c984d7fa058b6196a9b5f31\",\"articleSection\":[\"2006\",\"5\\\/2006\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/\",\"name\":\"Makros im Griff per VBA - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg04.met.vgwort.de\\\/na\\\/3ca6b9e15c984d7fa058b6196a9b5f31\",\"datePublished\":\"2021-02-11T21:06:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg04.met.vgwort.de\\\/na\\\/3ca6b9e15c984d7fa058b6196a9b5f31\",\"contentUrl\":\"http:\\\/\\\/vg04.met.vgwort.de\\\/na\\\/3ca6b9e15c984d7fa058b6196a9b5f31\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Makros_im_Griff_per_VBA\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Makros im Griff per VBA\"}]},{\"@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":"Makros im Griff per VBA - 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\/Makros_im_Griff_per_VBA\/","og_locale":"de_DE","og_type":"article","og_title":"Makros im Griff per VBA","og_description":"Wenn Sie Datenbanken von anderen Entwicklern oder aus fr&uuml;heren Schaffensperioden warten oder &uuml;berarbeiten m&ouml;chten, sto&szlig;en Sie m&ouml;glicherweise auf Makros. Diese wollen dokumentiert und gegebenenfalls nachbearbeitet werden. Das eine lie&szlig;e sich mit dem Datenbank-Dokumentierer von Access erledigen, dessen Ausgabe sich aber leider nur auf einen generierten Bericht beschr&auml;nkt, das andere mit dem Makro-Editor, der sich bisweilen aber als wenig komfortabel erweist. Sollten Sie nun auf die Idee kommen, selbst Routinen zur Dokumentation oder Bearbeitung von Makros zu programmieren, finden Sie hier das richtige Know-how.","og_url":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-11T21:06:09+00:00","og_image":[{"url":"http:\/\/vg04.met.vgwort.de\/na\/3ca6b9e15c984d7fa058b6196a9b5f31","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\/Makros_im_Griff_per_VBA\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Makros im Griff per VBA","datePublished":"2021-02-11T21:06:09+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/"},"wordCount":3984,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/#primaryimage"},"thumbnailUrl":"http:\/\/vg04.met.vgwort.de\/na\/3ca6b9e15c984d7fa058b6196a9b5f31","articleSection":["2006","5\/2006","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/","url":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/","name":"Makros im Griff per VBA - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/#primaryimage"},"thumbnailUrl":"http:\/\/vg04.met.vgwort.de\/na\/3ca6b9e15c984d7fa058b6196a9b5f31","datePublished":"2021-02-11T21:06:09+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/#primaryimage","url":"http:\/\/vg04.met.vgwort.de\/na\/3ca6b9e15c984d7fa058b6196a9b5f31","contentUrl":"http:\/\/vg04.met.vgwort.de\/na\/3ca6b9e15c984d7fa058b6196a9b5f31"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Makros_im_Griff_per_VBA\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Makros im Griff per VBA"}]},{"@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\/55000398","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=55000398"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000398\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}