{"id":55000258,"date":"2015-04-01T00:00:00","date_gmt":"2020-01-24T15:59:16","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=258"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"RegistryZugriff_per_VBA","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html","title":{"rendered":"Registry-Zugriff per VBA"},"content":{"rendered":"<p class='introduction'>Die Windows Registrierungsdatenbank, kurz Registry, ist die zentrale Sammelstelle f&uuml;r Einstellungsdaten aller Art. Die Konfiguration des gesamten Systems und fast aller Anwendungen h&auml;ngt von ihr ab. Ob lesend oder schreibend, auch als Access-Entwickler h&auml;tte man gern eine Programmierschnittstelle f&uuml;r den Zugriff auf die Registry. Weil VBA hier nur eingeschr&auml;nkte M&ouml;glichkeiten bietet, ist dem Thema dieser Beitrag gewidmet. <\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1408_Registry.mdb<\/b>.<\/p>\n<h2>Eingebaute Zugriffsmethoden<\/h2>\n<p>Im Beitrag Anwendungseinstellungen abspeichern dieser Ausgabe wurde deutlich, dass die Werte von Eigenschaftsvariablen, die &uuml;ber die aktuelle Access-Sitzung hinaus Bestand haben sollen, au&szlig;erhalb der Datenbank selbst gespeichert werden m&uuml;ssen. Statt daf&uuml;r eine externe verkn&uuml;pfte Tabelle zu verwenden, k&ouml;nnte man ebenso Variablen in der Registry unterbringen.<\/p>\n<p>Genau dieser Zweck schwebte den VBA-Entwicklern wohl vor, als sie die vier Methoden zum Zugriff auf die Registry in die VBA-Bibliothek einbauten. Sie lauten<\/p>\n<pre>GetSettingGetAllSettingsSaveSettingDeleteSetting<\/pre>\n<p><b>GetSetting<\/b> liest einen Registry-Wert aus, <b>GetAllSettings<\/b> liest alle Werte eines Schl&uuml;ssels auf einmal, <b>SaveSetting<\/b> schreibt einen Wert in die Registry, und <b>DeleteSetting<\/b> l&ouml;scht einen solchen wieder. Der Haken an der Sache ist, dass all diese Methoden nur einen ganz kleinen reservierten Bereich der Registry ansprechen k&ouml;nnen, n&auml;mlich den Schl&uuml;ssel <\/p>\n<pre>HKEY_CURRENT_USER\\Software\\\r\n  VB and VBA Program Settings<\/pre>\n<p>Unterhalb dieses Schl&uuml;ssels kann man walten, wie man will, aber von allen anderen Bereichen der Registry ist man ausgesperrt. Dass dieser Schl&uuml;ssel unter <b>HKEY_CURRENT_USER<\/b> liegt, ist nicht verwunderlich, denn f&uuml;r alle anderen Root-Schl&uuml;ssel ben&ouml;tigt man schreibend Administratorrechte &#8211; und Access wird normalerweise nicht mit diesen Rechten gestartet.<\/p>\n<p>Die Schl&uuml;sselstruktur unterhalb dieses Hauptschl&uuml;ssels ist immer dieselbe. Sie wird in Bild 1 ersichtlich. Dort ist ein Zweig abgebildet, der &uuml;ber die Routinen der Beispieldatenbank erstellt wurde. <b>AB_Registry<\/b> als Unterschl&uuml;ssel ist quasi der Generalschl&uuml;ssel und Anwendungsname, und darunter kann ein oder k&ouml;nnen mehrere Bereichsschl&uuml;ssel liegen. Im Beispiel ist es nur einer mit dem Namen <b>General<\/b>. Werte k&ouml;nnen au&szlig;erdem nur im untersten Schl&uuml;ssel gespeichert werden, also nicht etwa unter <b>AB_Registry<\/b>. Sie k&ouml;nnen eine beliebige Anzahl von Werten unterbringen. Bei gr&ouml;&szlig;erem Umfang ist der &uuml;bersicht halber aber die Anlage mehrerer Unterschl&uuml;ssel &uuml;berlegenswert. Zum <b>General<\/b>-Schl&uuml;ssel k&ouml;nnte etwa noch ein <b>Printer<\/b>-Schl&uuml;ssel kommen, der Werte f&uuml;r die Steuerung von Druckern aufn&auml;hme.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/Registry_EditorVBA.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/Registry_EditorVBA.png\" alt=\"Der von VBA aus zug&auml;ngliche Bereich der Registry\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Der von VBA aus zug&auml;ngliche Bereich der Registry<\/p>\n<p>Wie kommt nun der Test-Eintrag zustande Die Syntax der Code-Zeile sieht so aus:<\/p>\n<pre>SaveSetting \"AB_Registry\", \"General\", \"Test0\", \"Sascha\"<\/pre>\n<p>Als Parameter werden also Hauptschl&uuml;ssel, Unterschl&uuml;ssel, Wertname und Wert &uuml;bergeben. Die Schl&uuml;ssel m&uuml;ssen zuvor nicht erst angelegt worden sein, wie das etwa bei Routinen, die das Windows-API benutzen, der Fall ist. Die <b>SaveSetting<\/b>-Anweisung macht alles auf einen Schlag: Hauptschl&uuml;ssel, Unterschl&uuml;ssel anlegen, Wert speichern. Als Wert k&ouml;nnen Sie einen beliebigen Variant-Typ &uuml;bergeben und das selbstredend auch &uuml;ber eine Variable. Erlaubt sind alle Standarddatentypen, nicht jedoch Arrays oder Objekte. Es spielt keine Rolle, welchen Datentyp Sie verwenden, denn alle werden automatisch in Strings verwandelt. In Bild 1 wird das aus der Typ-Spalte des Editors ersichtlich, wo alle Werte als <b>REG_SZ<\/b> aufgef&uuml;hrt sind, dem Pendant zu <b>vbString<\/b>. <\/p>\n<p>Mit <b>GetSetting<\/b> lesen Sie den Wert &uuml;ber diese Syntax aus:<\/p>\n<pre> GetSetting (\"AB_Registry\", \"General\", \"Test0\", \"nix\")<\/pre>\n<p>Die Parameter sind also Hauptschl&uuml;ssel, Unterschl&uuml;ssel, Wertname, und die R&uuml;ckgabe ist immer vom Typ <b>String<\/b>. Ganz hinten k&ouml;nnen Sie optional noch einen weiteren Parameter anschlie&szlig;en. Das ist ein Wert, der immer dann als Resultat der Funktion zur&uuml;ckgegeben wird, wenn entweder der Registry-Wert leer ist, der Wertname nicht existiert, oder es den Schl&uuml;ssel selbst nicht gibt. VBA l&ouml;st n&auml;mlich keine Fehler aus, wenn die Namensparameter ung&uuml;ltig sind!<\/p>\n<p>Im Modul <b>mdlRegistryBeispiele<\/b> der Beispieldatenbank finden Sie mehrere Prozeduren, die den Umgang mit den vier VBA-Methoden vereinfachen. Einen Ausschnitt daraus zeigt Listing 1. Statt etwa <b>GetSetting<\/b> immer mit allen f&uuml;nf Parametern best&uuml;cken zu m&uuml;ssen, nehmen Sie einfach die k&uuml;rzere Variante <b>SaveVarToRegistry<\/b>, welche nur einen Parameter erwartet: den Wertnamen.<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const cMainRegKey = \"AB_Registry\"\r\n<span style=\"color:blue;\">Public <\/span>Const cSubRegKey = \"General\"\r\n<span style=\"color:blue;\">Sub <\/span>SaveVarToRegistry(ByVal KeyName<span style=\"color:blue;\"> As String<\/span>, Value<span style=\"color:blue;\"> As Variant<\/span>)\r\n     SaveSetting cMainRegKey, cSubRegKey, KeyName, Value\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Function <\/span>GetVarFromRegistry(ByVal KeyName)<span style=\"color:blue;\"> As Variant<\/span>\r\n     GetVarFromRegistry = GetSetting(cMainRegKey, _\r\n         cSubRegKey, KeyName, \"LEER\")\r\n<span style=\"color:blue;\">End Function<\/span>\r\n<span style=\"color:blue;\">Sub <\/span>RemoveVarFromRegistry(ByVal KeyName<span style=\"color:blue;\"> As String<\/span>)\r\n     DeleteSetting cMainRegKey, cSubRegKey, KeyName\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Function <\/span>GetVarsFromRegistry()<span style=\"color:blue;\"> As Variant<\/span>\r\n     GetVarsFromRegistry = GetAllSettings(cMainRegKey, _\r\n         cSubRegKey)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p class='imagetext'>Listing 1: Ausschnitt aus dem Modul zum Bearbeiten von Registry-Werten<\/p>\n<p>Die Prozedur enth&auml;lt nur eine Zeile mit der <b>GetSetting<\/b>-Funktion, der ihrerseits als Parameter aber zwei Konstanten &uuml;bergeben werden, die oben im Kopf des Moduls global deklariert wurden: die Namen der Haupt- und Unterschl&uuml;ssel. Denn diese d&uuml;rften f&uuml;r die Datenbank konstant bleiben. Wenn Sie das Modul in eine andere Datenbank importieren, so &auml;ndern Sie dort nur diese zwei Konstanten. Das erspart Ihnen, &uuml;berall im Code die Schl&uuml;sselnamen neu manuell einzuf&uuml;gen.<\/p>\n<p>Die weiteren drei Prozeduren des Moduls arbeiten &auml;hnlich und sind wohl selbsterkl&auml;rend. Lediglich der <b>GetVarsFromRegistry<\/b> w&auml;re gesonderte Aufmerksamkeit zu schenken. Sie verwendet die <b>GetAllSettings<\/b>-Funktion von VBA. Die R&uuml;ckgabe ist ein Variant. Was sich hinter dieser R&uuml;ckgabe verbirgt, macht die Prozedur <b>TestGetAllVars <\/b>deutlich:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>TestGetAllVars()\r\n<span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>V<span style=\"color:blue;\"> As Variant<\/span>\r\nV = GetVarsFromRegistry\r\nFor i = 0 To <span style=\"color:blue;\">UBound<\/span>(V, 1)\r\n  <span style=\"color:blue;\">Debug.Print<\/span> _\r\n&nbsp;&nbsp;&nbsp;&nbsp;V(i, 0) & \" = \" & V(i, 1)\r\n<span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000258\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000258?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000258\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"22c77db969\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Windows Registrierungsdatenbank, kurz Registry, ist die zentrale Sammelstelle f&uuml;r Einstellungsdaten aller Art. Die Konfiguration des gesamten Systems und fast aller Anwendungen h&auml;ngt von ihr ab. Ob lesend oder schreibend, auch als Access-Entwickler h&auml;tte man gern eine Programmierschnittstelle f&uuml;r den Zugriff auf die Registry. Weil VBA hier nur eingeschr&auml;nkte M&ouml;glichkeiten bietet, ist dem Thema dieser Beitrag gewidmet. <\/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":[662014,66082014,44000011],"tags":[],"class_list":["post-55000258","post","type-post","status-publish","format-standard","hentry","category-662014","category-66082014","category-VBAGrundlagen"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Registry-Zugriff per VBA - Access [basics]<\/title>\n<meta name=\"description\" content=\"Die Windows Registrierungsdatenbank, kurz Registry, ist die zentrale Sammelstelle f\u00fcr Einstellungsdaten aller Art. Die Konfiguration des gesamten Systems und fast aller Anwendungen h\u00e4ngt von ihr ab. Ob lesend oder schreibend, auch als Access-Entwickler h\u00e4tte man gern eine Programmierschnittstelle f\u00fcr den Zugriff auf die Registry. Weil VBA hier nur eingeschr\u00e4nkte M\u00f6glichkeiten bietet, ist dem Thema dieser Beitrag gewidmet.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Registry-Zugriff per VBA - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Die Windows Registrierungsdatenbank, kurz Registry, ist die zentrale Sammelstelle f\u00fcr Einstellungsdaten aller Art. Die Konfiguration des gesamten Systems und fast aller Anwendungen h\u00e4ngt von ihr ab. Ob lesend oder schreibend, auch als Access-Entwickler h\u00e4tte man gern eine Programmierschnittstelle f\u00fcr den Zugriff auf die Registry. Weil VBA hier nur eingeschr\u00e4nkte M\u00f6glichkeiten bietet, ist dem Thema dieser Beitrag gewidmet.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/Registry_EditorVBA.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"13\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/Registry_EditorVBA.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html\",\"name\":\"Registry-Zugriff per VBA - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:16+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Die Windows Registrierungsdatenbank, kurz Registry, ist die zentrale Sammelstelle f\\u00fcr Einstellungsdaten aller Art. Die Konfiguration des gesamten Systems und fast aller Anwendungen h\\u00e4ngt von ihr ab. Ob lesend oder schreibend, auch als Access-Entwickler h\\u00e4tte man gern eine Programmierschnittstelle f\\u00fcr den Zugriff auf die Registry. Weil VBA hier nur eingeschr\\u00e4nkte M\\u00f6glichkeiten bietet, ist dem Thema dieser Beitrag gewidmet.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/RegistryZugriff_per_VBA.html\",\"name\":\"Registry-Zugriff per VBA\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000258"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000258\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}