Das Entwickeln von Access-Anwendungen ist das eine, der Umgang mit der Peripherie derselben das andere. So will Ihre Anwendung erst verteilt werden, oder Sie benötigen Systemaktionen, die sich unter Access nicht so ohne weiteres ausführen lassen. Dann könnten Ihnen möglicherweise extern gestartete Skripte weiterhelfen. Solche Skripte schauen wir uns in diesem Beitrag an.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1504_ScriptingDemo.zip und den enthaltenen Dateien.
Script-Sprachen
Wenn Sie sich nach Möglichkeiten umsehen, um abseits von Access- und VBA-Programmierung unter Windows Makros auszuführen, so bieten sich etwa Batch-Dateien mit der Endung bat oder cmd an, die Kommandozeilenaktionen starten. Viel Freude werden Sie dabei wahrscheinlich nicht haben, da der Sprachumfang reichlich beschränkt ist und zudem die Kenntnis zahlreicher Kommandozeilenparameter erfordert. Erheblich ausgefeilter kommt da die Windows-Powershell daher, über die sich fast alles realisieren lässt. Sie verlangt Ihnen jedoch noch mehr Einarbeitung ab, die zudem wegen des objektorientierten Ansatzes nicht gerade leicht fällt.
So bleibt als leistungsfähiger Ausweg das standardmäßig unter Windows installierte Visual Basic Scripting, kurz VBScript. Das Gute an der Sache: Wenn Sie sich halbwegs mit VBA-Programmierung auskennen, so wird ihnen das Erstellen von VBScripten leicht von der Hand gehen, denn Syntax und Sprachumfang sind nahezu identisch. Auf einige Unterschiede gehen wir noch ein.
VBScripte
VBScript-Dateien sind einfache Textdateien mit der Endung vbs, die VBA-Code enthalten und von der Windows-Scripting-Engine ausgeführt werden. Diese Dateiendung ist automatisch mit einem der beiden Script-Prozessoren wscript.exe oder cscript.exe verknüpft.
Doppelklicken Sie also auf eine vbs-Datei, so startet in der Regel die wscript.exe, welche die Anweisungen dann abarbeitet. Dabei nimmt sich die Engine den Code zunächst genau unter die Lupe und testet ihn auf Syntaxfehler. Im Fehlerfall wird eine entsprechende Meldung geöffnet. Danach kompiliert sie ihn und startet die Prozedur. Aber auch dann, wenn die Syntax stimmt, kann es zu Fehlern etwa infolge falscher Parameter oder inkorrekter Objektansprache kommen. Dann ereignet sich ebenfalls eine Fehlermeldung und das Script wird an dieser Stelle abgebrochen.
An dieser Stelle ein Hinweis: VBScript ist an sich noch kein Sicherheitsrisiko, arbeitet jedoch nicht in abgeschotteter Umgebung. Zwar können Windows-API-Funktionen nicht aufgerufen – hier ein Unterschied zu VBA -, dafür aber beliebige ActiveX-Komponenten erzeugt werden, die ihrerseits allerlei Unbill hervorzubringen imstande wären. Aus diesem Grund werden die Script-Engines von Administratoren zuweilen gesperrt und die Ausführung von vbs-Dateien verhindert. Inzwischen kommt das immer seltener vor, denn über VBA-Programmierung, die ja Bestandteil von beliebigen Access-, Word- oder Excel-Dateien sein kann, sind noch viel mehr unheilvolle Aktionen möglich. Und diese Dateien werden ja auch nicht gesperrt.
VBScripte erzeugen
Nicht einfacher, als das! Legen Sie eine neue Textdatei an und speichern sie unter der Endung vbs ab. Schreiben Sie nur diese eine Zeile in sie:
Msgbox "Hallo! Bin ein VBScript!"
Doppelklicken Sie auf die dergestalt modifizierte Datei, und schon werden Sie mit dem Meldungsfenster beglückt, wenn Scripting nicht auf Ihrem System deaktiviert ist.
Die Tatsache, dass es sich nur um Textdateien handelt, eröffnet die Möglichkeit, Scripte auch aus Access heraus zu erstellen. Dazu wird der Code in eine String-Variable geschrieben und diese in das Dateisystem abgespeichert, wie etwa in der Prozedur in Listing 1. Der Variablen sScript wird die Codezeile von oben zugewiesen und über die Open-Anweisung eine Datei mit dem Namen test.vbs angelegt, wobei als Pfad das Verzeichnis der Datenbank (CurrentProject.Path) verwendet wird. Anschließend wird die vbs-Datei über die Script-Engine (wscript.exe) und die Shell-Anweisung aufgerufen.
Sub CreateVBScript() Dim sScript As String Dim sVBSFile as string sVBSFile = CurrentProject.Path & "\test.vbs" sScript = "Msgbox ""Ich bin ein VBScript!""" Open sVBSFile For Binary As #1 Put #1, , sScript Close #1 DoEvents Shell "wscript.exe " & sVBSFile End Sub
Listing 1: Aus VBA heraus erzeugte VBS-Datei
Rufen Sie einfach die Prozedur CreateVBScript aus dem VBA-Direktfenster heraus auf und überzeugen Sie sich vom Erfolg der Routine.
Anwendungsfälle
Warum sollte man aus Access heraus ein VBScript aufrufen Schließlich lässt sich ja über VBA dasselbe erreichen, wie über ein externes Skript. Das stimmt jedoch nicht immer. Manche Aufgaben können nur über administrative Rechte erledigt werden – etwa das Setzen von bestimmten Registry-Schlüsseln. Und da Access nun Mal nur unter normalen Benutzerrechten ausgeführt wird, kann derlei nicht vollzogen werden. Von der Lösung, Access dennoch als Administrator auszuführen, sollten Sie besser die Finger lassen, weil dann die Add-Ins von Access und VBA durcheinander geraten können.
Hier hilft ein VBScript aus, das Aufgaben unter erhöhten Benutzerrechten ausführt. Den dafür benötigten Code schauen wir uns später an.
Oft gebraucht wird ein Skript, das Ihre Datenbank überhaupt erst installiert. Nehmen wir an, Sie hätten alle Teile Ihrer Anwendung in einer Zip-Datei untergebracht. Da wäre es schön, wenn ein Script auf einem Zielrechner etwa folgende Aufgaben erledigen würde:
Entpacken des Archivs; Anlegen von Zielverzeichnissen; Kopieren von Dateien in die Zielverzeichnisse; Setzen des Vertrauenswürdigen Orts für die Datenbank; Anlegen einer Verknüpfung auf dem Desktop; und eventuell noch das Registrieren benötigter ActiveX-Komponenten. Auch hierfür gibt es ein umfangreiches Beispiel-Skript, welches auf den folgenden Seiten erläutert wird.
VBScript vs. VBA
Unter VBScript brauchen Sie, wie wir weiter oben bereits gesehen haben, keine Prozedur zu deklarieren. Das Script selbst stellt schon eine Prozedur dar. Sie können gleich zu Beginn im Code mit der ersten Anweisung beginnen. Es ist Ihnen jedoch unbenommen, trotzdem Prozeduren auf die gleiche Weise anzulegen, wie unter VBA. Solche Sub– oder Function-Prozeduren sind dann sinnvoll, wenn sie als Unterroutinen im Code öfters aufgerufen werden.
Variablen müssen unter VBScript nicht deklariert werden. Dies kommt dem Verhalten von VBA gleich, wenn kein Option Explicit im Modulkopf steht. VBScript-Variablen sind immer vom Typ Variant, was aber nicht bedeutet, dass ihr Sub-Typ nicht von Belang wäre. Funktionen etwa, die einen String als Parameter erwarten, kann kein Long-Wert übergeben werden. So eine Konversion nimmt VBS nicht automatisch vor.
Wenn Sie es gewohnt sind, unter VBA in For..Next-Schleifen die Zählervariable namentlich einzusetzen, so müssen Sie unter VBScript davon Abstand nehmen.
For i = 0 To 10
...
Next i
führt zu einem VBScript-Syntaxfehler. Korrekt wäre
For i = 0 To 10
...
Next
Darüber hinaus unterstützt VBScript nicht die Deklaration von API-Funktionen. Windows- oder andere DLLs können damit nicht angesprochen werden.
Außerdem fehlt ausgerechnet eine ganze Reihe von Datei-Anweisungen, wie Dir, FileCopy, FileLen oder FileDateTime. Auch der Befehl Shell zum Ausführen anderer Anwendungen existiert nicht. Solche Operationen müssen durch COM-Objekte ersetzt werden, die sich per CreateObject erzeugen lassen. Die am häufigsten verwendeten Objekte sind das FileSystemObject, das Shell-Objekt aus shell32 und andere speziell für VBScript entwickelte Komponenten, wie der Windows Scripting Host (wshom.ocx). All diesen Objekten begegnen Sie noch bei der Besprechung des Installations-Skripts.
Zusammenfassend kann man feststellen, dass sich VBA-Code zu großen Teilen direkt in ein VBScript übernehmen lässt. Entwickeln und debuggen Sie ihren Code unter VBA und ändern Sie ihn nach übernahme in ein VBScript überall da, wo es notwendig ist.
VBScripte debuggen
Leider ist der Komfort, wie Sie ihn von VBA her kennen, beim Debuggen von VBScripten nicht vorhanden. Der Debugger zeigt lediglich eine Meldung an, wenn sich ein Fehler ereignet. Bild 1 ist ein Beispiel für einen Syntaxfehler, Bild 2 eines für einen Fehler bei der Ansprache eines Objekts. Der Debugger zeigt immerhin die Code-Zeile und die Spalte an, in der sich der Fehler zutrug. Was genau dort schiefging, bleibt aber weitgehend verborgen. Eine Inspektion von Variablen oder Haltepunkte bleibt außen vor. Meist streut man dann diverse Message-Boxen in den Code ein, die die Werte von Variablen anzeigen, um dem Fehler auf die Schliche zu kommen. Wer viel mit vbs-Dateien hantiert kann als Power User zu Visual Studio greifen, oder zu einem Tool, wie dem kostenpflichtigen VBSEdit (http://www.vbsedit.com). Eine freie Alternative stellt der freie Admin Script Editor (http://www.itninja.com/community/admin-script-editor ) dar. Diese können alle den Script-Code auf ähnliche Weise debuggen, wie VBA.
Bild 1: Fehlermeldung der Script-Engine bei einem Syntaxfehler
Bild 2: Fehlermeldung der Script-Engine bei einem Objektfehler
Hilfsbibliotheken für VBScript
Wo Funktionen für bestimmte Aufgaben im Sprachumfang von VBScript fehlen, greift man zu zusätzlichen Bibliotheken. Unter VBA tun Sie ja ähnliches, indem Sie zusätzliche Verweise in das VBA-Projekt einklinken. VBScript allerdings sieht das so nicht vor, kann aber fast alle Objekte erzeugen, die in der Registry unter dem Zweig HKEY_CLASSES_ROOT zu finden sind. Also jene, die eine ProgId aufweisen und durch einen mit Punkt getrennten Begriff gekennzeichnet sind, wie zum Beispiel Access.Application.
Die wichtigsten Aufgaben lassen sich mit zwei Bibliotheken erledigen, der Shell32-Bibliothek und dem Windows Scripting Host. Um sich über deren Inhalt zu informieren, laden Sie unter VBA Verweise auf die Bibliotheken Microsoft Shell Controls And Automation (Shell32) und Windows Script Host Object Model (IWshRuntimeLibrary) und inspizieren sie im VBA-Objektkatalog. Die Syntax für das Anlegen der wichtigsten Objekte unter VBA und VBScript finden Sie hier im Vergleich:
VBA: Set oShell = New Shell32.Shell Set oShell2 = New WshShell Set fso = New FileSystemObject VBScript: Set oShell = CreateObject _ ("Shell.Application) Set oShell2 = CreateObject _ ("WScript.Shell") Set fso = CreateObject _ ("Scripting.FileSystemObject")
über die so instanzierten Objekte lassen sich alle Aufgaben durchführen, die auch VBA ermöglicht. Das wären vor allem die Datei- und Verzeichnisoperationen über das FileSystemObject und das WshShell-Objekt. Aber auch die Registry lässt sich lesend und schreibend mit sehr einfachen Einzeilern ansprechen.
öffnen Sie die Beispieldatenbank, in der die erwähnten Verweise bereits gesetzt sind. Im Modul mdlScripting finden Sie verschiedene Prozeduren, die die Ansprache der Objekte verdeutlichen.
Script als Administrator starten
Kommen wir nach den theoretischen Ausführungen zu einem praktischen Beispiel. Für viele Dateioperationen ist es notwendig, dass das ablaufende Skript Administratorrechte besitzt. Sei es, um Dateien in geschützte Verzeichnisse zu kopieren oder darin zu löschen, oder, um Rechte auf Ordner zu setzen. Doppelklicken Sie jedoch auf eine vbs-Datei, so wird das Skript unter normalem Benutzerkontext gestartet. Im Prinzip müssten Sie die wscript.exe Als Administrator ausführen und ihr als Argument den Pfad der vbs-Datei mitteilen. Das ist etwas umständlich. Mit einem Trick lässt sich das aber auch innerhalb der vbs-Datei selbst bewerkstelligen. Nehmen Sie den Code des Beispielskripts setpermission.vbs in Listing 2.
Set oShell = CreateObject("Shell.Application") If (WScript.Arguments.Count = 1) Then ElevateUAC Sub ElevateUAC sCommand = WScript.Arguments(0) 'oShell.ShellExecute "c:\windows\syswow64\wscript.exe", _ ' WScript.ScriptFullName & " | " & sCommand, , "runas", 1 '-> unter Winx64 oShell.ShellExecute "c:\windows\system32\wscript.exe", _ WScript.ScriptFullName & " | " & sCommand, , "runas", 1 WScript.Quit End Sub sFolder = WScript.Arguments(1) Msgbox "Berechtigungen werden gesetzt auf " & sFolder oShell.ShellExecute "Icacls.exe ", sFolder & " /grant Jeder:F /T", , "open", 1
Listing 2: Das Skript startet als Adminstrator und setzt dann Berechtigungen
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: