Die Windows-Registry mit VBA lesen und schreiben
Mit einem einzigen VBA-Modul liest und schreibt Ihre Access-Anwendung Werte in der Windows-Registry – ohne Verweis, in 32- und 64-Bit-Office. Der ideale Platz für alles, was zum Benutzer gehört und ein Frontend-Update überleben soll.
Warum ĂĽberhaupt die Registry?
Jede Access-Anwendung muss sich ein paar Dinge merken: wo das Backend liegt, in welcher Sprache die Oberfläche läuft, wie groß das Hauptfenster zuletzt war, ob der Diagnosemodus an ist. Die naheliegende Idee – eine Tabelle dafür – hat einen Haken: Eine Tabelle im Frontend ist beim nächsten Update weg, denn beim Update tauschen Sie die .accde komplett aus. Eine Tabelle im Backend teilen sich dagegen alle Benutzer, obwohl diese Einstellungen gerade pro Benutzer gelten sollen. Und eine INI-Datei neben dem Programm scheitert an den fehlenden Schreibrechten unter C:\Program Files.
Genau hier ist die Registry richtig. Der Bereich HKEY_CURRENT_USER\Software gehört dem angemeldeten Benutzer, braucht keine Adminrechte, bleibt bei einem Frontend-Update unangetastet und wandert in Firmennetzen mit dem Benutzerprofil mit. Typische Dinge, die dort gut aufgehoben sind:
- Der Pfad zum Backend – überlebt jedes Frontend-Update.
- Fensterposition, letzter Ordner, letzter Filter – pro Benutzer verschieden.
- Sprache und Farbschema – Benutzerwunsch, kein Datenbestand.
- Ein Diagnose-Schalter wie
LogLevel = 2– beim Kunden einschaltbar, ohne die .accde anzufassen. - Datum des ersten Starts und ein Startzähler – Grundlage für einen Demozeitraum.
Und natürlich lohnt auch das Lesen: In der Registry steht, ob Office 32- oder 64-Bit ist, ob die WebView2-Runtime installiert ist, welcher ODBC-Treiber bereit steht, wo der „Dokumente“-Ordner wirklich liegt (OneDrive verschiebt ihn gern) und ob Windows im Hell- oder Dunkelmodus läuft.
Der Registry Helper macht beides einfach – aus reinem VBA, ohne Verweis.
Was das Modul ist
Grundlage ist das Modul modRegistry. Es spricht die Windows-API direkt an, läuft in 32- und 64-Bit-Office und braucht keinen Verweis. Importieren Sie die Datei modRegistry.bas in Ihre Datenbank (im VBA-Editor: Datei → Datei importieren), und schon stehen Ihnen Funktionen zum Lesen, Schreiben, Auflisten und Löschen zur Verfügung.
Dazu gehört eine Demo-Datenbank, die 47 interessante Registry-Einträge in neun Gruppen anzeigt und – mit Warnungen und Sperren – ändern lässt.
| Punkt | Anforderung |
|---|---|
| Access | Access 2021 oder Microsoft 365, 32 oder 64 Bit |
| Windows | Windows 10 oder 11 |
| Verweise | keine (Late Binding, nur Windows-API) |
| Rechte | normale Benutzerrechte; Adminrechte nur zum Schreiben in HKLM |
Der Schnellstart
Pfade schreiben Sie so, wie regedit sie zeigt: StammschlĂĽssel, dann der Pfad. Erlaubt sind die Kurzformen HKCU, HKLM, HKCR, HKU, HKCC ebenso wie die langen Namen.
Const C_KEY As String = "HKCU\Software\MeineFirma\MeineApp"
' schreiben - der SchlĂĽssel wird bei Bedarf angelegt
RegWrite C_KEY, "BackendPath", "\\server\daten\backend.accdb"
RegWrite C_KEY, "StartCount", 1, C_REG_DWORD
' lesen - mit Standardwert, falls es den Wert noch nicht gibt
Debug.Print RegRead(C_KEY, "BackendPath", "")
Debug.Print RegRead(C_KEY, "StartCount", 0) RegWrite legt fehlende Schlüssel auf dem Weg selbst an. RegRead löst bei einem fehlenden Wert keinen Laufzeitfehler aus, sondern liefert den angegebenen Standardwert – gerade richtig für den allerersten Start, an dem noch nichts gespeichert ist.
Alle Werttypen, beide Ansichten, Unicode
RegWrite schreibt jeden Registry-Typ. Ohne Typangabe wird Text (REG_SZ) geschrieben:
Const C_KEY As String = "HKCU\Software\MeineFirma\MeineApp"
RegWrite C_KEY, "Name", "MĂĽller" ' REG_SZ
RegWrite C_KEY, "LogPath", "%TEMP%\meineapp.log", C_REG_EXPAND_SZ
RegWrite C_KEY, "StartCount", 42, C_REG_DWORD
RegWrite C_KEY, "Size", CDec("1099511627776"), C_REG_QWORD
RegWrite C_KEY, "Liste", Array("a", "b", "c"), C_REG_MULTI_SZ
RegWrite C_KEY, "Daten", RegHexToBytes("00FF7F10"), C_REG_BINARY Texte sind Unicode – Umlaute und Zeichen aus jeder Sprache bleiben erhalten.
Ein besonderes Thema auf 64-Bit-Windows ist die getrennte 32- und 64-Bit-Ansicht unter HKLM\SOFTWARE. Ein 32-Bit-Programm wird stillschweigend in die 32-Bit-Ansicht umgeleitet – derselbe Code liest also in 32-Bit-Office etwas anderes als in 64-Bit-Office. Manche Schlüssel gibt es sogar nur in einer der beiden Ansichten. modRegistry lässt Sie die Ansicht deshalb bei jedem Aufruf wählen:
Public Function ExampleOfficeBitness() As String
Const C_KEY As String = "HKLM\SOFTWARE\Microsoft\Office\ClickToRun\Configuration"
ExampleOfficeBitness = RegRead(C_KEY, "Platform", "", C_REG_VIEW_64)
End Function Mit C_REG_VIEW_AUTO, C_REG_VIEW_32 oder C_REG_VIEW_64 entscheiden Sie: die Ansicht des laufenden Office oder gezielt eine der beiden. FĂĽr ODBC-Treiber ist AUTO richtig (ein 64-Bit-Access kann nur 64-Bit-Treiber nutzen), fĂĽr einen SchlĂĽssel, den es nur in der 64-Bit-Ansicht gibt, erzwingen Sie C_REG_VIEW_64.
Ein praktisches Beispiel: Fensterposition merken
Klassischer Fall für den eigenen Bereich – im Form_Load wiederherstellen, im Form_Unload speichern:
Public Sub ExampleWindowSave(ByVal frm As Access.Form)
Dim sKey As String
sKey = C_APP_KEY & "\Forms\" & frm.Name
RegWrite sKey, "Left", frm.WindowLeft, C_REG_DWORD
RegWrite sKey, "Top", frm.WindowTop, C_REG_DWORD
RegWrite sKey, "Width", frm.WindowWidth, C_REG_DWORD
RegWrite sKey, "Height", frm.WindowHeight, C_REG_DWORD
End Sub
Public Sub ExampleWindowRestore(ByVal frm As Access.Form)
Dim sKey As String
sKey = C_APP_KEY & "\Forms\" & frm.Name
If Not RegValueExists(sKey, "Width") Then Exit Sub
frm.Move SignedLong(RegRead(sKey, "Left", 0)), _
SignedLong(RegRead(sKey, "Top", 0)), _
SignedLong(RegRead(sKey, "Width", frm.WindowWidth)), _
SignedLong(RegRead(sKey, "Height", frm.WindowHeight))
End Sub Der Umweg über SignedLong hat seinen Grund: REG_DWORD kennt kein Vorzeichen, eine Fensterposition links vom Hauptbildschirm wäre negativ. Für genau solche Kleinigkeiten liefert das Modul fertige Helfer mit.
Fehler lesen statt raten
Fehlt ein Wert, weil es ihn nicht gibt – oder weil das Recht fehlt? RegRead liefert in beiden Fällen den Standardwert, die Ursache verrät RegLastError:
If Not RegWrite("HKLM\SOFTWARE\MeineFirma", "Test", "x") Then
Select Case RegLastError()
Case C_REG_ERR_ACCESS_DENIED: MsgBox "DafĂĽr fehlen die Rechte."
Case C_REG_ERR_INVALID_DATA: MsgBox "Wert passt nicht zum Typ."
End Select
End If Neben Lesen und Schreiben kann das Modul Schlüssel und Werte auflisten (RegEnumKeys, RegEnumValues), prüfen (RegValueExists, RegKeyExists), löschen (RegDeleteValue, RegDeleteKey), %VARIABLEN% auflösen und jeden Rohwert in lesbaren Klartext übersetzen.
Wo die Grenzen liegen
Der Registry Helper verschweigt nicht, wo Schluss ist – und das ist eine Stärke:
- In
HKLMschreibt die Anwendung nicht. Access läuft auch beim Administrator ohne erhöhte Rechte; jeder Schreibversuch inHKLMendet mit „Zugriff verweigert“. Was für alle Benutzer gelten soll, ist Sache des Setups. - Keine Kennwörter im Klartext – jeder Benutzer kann seinen Teil der Registry lesen.
- Keine großen Datenmengen – ein paar Kilobyte je Wert sind die Obergrenze des Sinnvollen.
- Kein Kopierschutz. Ein Demozeitraum über die Registry zeigt das Prinzip; wer den Schlüssel löscht, setzt ihn zurück. Ernsthafter Schutz braucht mehr.
RegDeleteKeylöscht nie einen ganzen Zweig. Hat ein Schlüssel Unterschlüssel, verweigert die Funktion die Arbeit – damit ein falscher Pfad nie mehr mitnimmt als gemeint.
FĂĽr reine Benutzereinstellungen als Text reicht ĂĽbrigens auch das eingebaute SaveSetting. Sobald Sie aber Zahlen, einen eigenen Pfad, HKLM oder die 32/64-Bit-Ansicht brauchen, ist modRegistry der Weg.
Die Demo-Datenbank
Die mitgelieferte Datenbank öffnet das Formular frmRegistry. Links ein Katalog mit 47 Registry-Einträgen in neun Gruppen – Sicherheit, Einstellungen, Add-Ins, Umgebung, ODBC, Windows, Entwickler, Benutzer und der eigene Bereich. Rechts die Erklärung zum gewählten Eintrag und alle seine Werte, so wie sie auf diesem Rechner gerade in der Registry stehen. Die Spalte „Wert“ übersetzt dabei Rohwerte in Klartext: Zeitstempel in ein Datum, Twips in Zentimeter, eine Farbe in #RRGGBB.
Ändern lässt sich vieles – aber mit Netz: Jeder Eintrag hat eine Sperrstufe, ein Farbbalken zeigt sie an, und vor jeder Änderung steht eine Warnung mit altem und neuem Wert (bei der „Nein“ vorausgewählt ist). Geschrieben wird im Code grundsätzlich nur unter HKCU\Software, nie unter Policies oder Classes. Jede Änderung landet mit dem alten Wert in einem Protokoll; „Rückgängig“ stellt die letzte Aktion wieder her – sogar einen gelöschten Unterschlüssel mit allen seinen Werten.
So können Sie die Registry Ihres Rechners gefahrlos erkunden und zugleich sehen, wie das Modul in echtem Code eingesetzt wird.
Getestet
Dem Modul liegt ein Selbsttest bei. TEST_modRegistry arbeitet ausschließlich in einem eigenen Testschlüssel und entfernt ihn am Ende wieder. Er prüft alle Werttypen, Unicode, Zahlen ohne Vorzeichen, die Fehlercodes, das Auflisten, die Löschregeln und dass HKLM ohne Adminrechte verschlossen bleibt. Am besten lassen Sie ihn einmal in 32-Bit- und einmal in 64-Bit-Office laufen – dann sehen Sie zugleich, was jede Ansicht liefert.
Fazit
Der Registry Helper gibt Ihrer Access-Anwendung einen verlässlichen Ort für alles, was zum Benutzer gehört, aber nicht in die Datenbank passt – und der ein Update übersteht. Ein Modul, kein Verweis, 32- und 64-Bit, alle Werttypen, beide Ansichten, klare Fehlercodes und sichere Löschregeln. Lesend verschafft es Ihnen beim Start den nötigen Überblick über Office, Windows und die installierten Treiber; schreibend bleibt es diszipliniert im eigenen Bereich. Genau so, wie eine Anwendung mit der Registry umgehen sollte.
Download
Registry Helper ist ein VBA-Modul, das Werte aller Typen in der Windows-Registry liest, schreibt, auflistet und löscht – ohne Verweis, in 32- und 64-Bit-Office, mit Wahl zwischen 32- und 64-Bit-Ansicht.
Voraussetzungen: Ab Access 2021 und Microsoft 365, 32/64-bit
Dateigröße: 807 KB




