Office Logo VBA  Zurück zur Hauptseite

VBA-Spezialthema "Windows Script Host (WSH)"

      Allgemeines über das Thema "Windows Script Host"

      Übersicht über das Windows Script Host-Objektmodell

         Windows Script Host Shell Object

         Windows Script Host Network Object

      Methoden und Eigenschaften der Windows Script Host-Objekte (WScript)

         Methoden

         Eigenschaften

      Behandlung von Laufzeitfehlern (Error Handling)

         Übersicht der Laufzeitfehler

      VBA-Codebeispiele

         Registry-Eintrag lesen

         Registry-Eintrag schreiben

         Registry-Eintrag löschen

         Verknüpfung anlegen (lnk-Datei)

         Temp-Verzeichnis abfragen

         Spezial-Ordner abfragen

         Neue Dateinamenerweiterung mit Dateitypzuordnung registrieren

         Installierte Drucker abfragen

         Meldungsdialog einblenden (mit Timeout)

         Meldungsdialog einblenden (systemmodal)

         Computer- und User-Informationen abfragen

         Programm ausführen

         Datei mit zugeordnetem Programm öffnen

 

      Zur Hauptseite

To Top

Diese Seite ist teilweise in Bearbeitung!

Allgemeines über das Thema "Windows Script Host"

Der Windows Script Host stellt eine ganze Reihe nützlicher Funktionalitäten bereit, die in VBA-Programmen (oder auch VB-Programmen) verwendet werden können. Insbesondere das Network- und das Shell-Objekt besitzen viele Eigenschaften und Methoden, die die Verwendung von speziellen Windows API-Funktionen hinfällig machen.

Interessant sind folgende Möglichkeiten:
» Einfacher Zugriff auf die Windows Registry
» Anlegen und Ändern von Verknüpfungen (lnk-Dateien)
» Spezial-Ordner von Windows abfragen (Desktop, Autostart, Favoriten etc.)
» Meldungsdialoge einblenden mit Timeout
» Installierte Drucker abfragen
» Netzlaufwerke abfragen
» Abfragen von Computer-, Domain- und Benutzername
» Registrierte Programme ausführen
» Programme ausführen und auf Beendigung warten

To Top

 


Übersicht über das Windows Script Host-Objektmodell

WSH - Windows Script Host

Library Name: "Windows Script Host Object Model (Ver 1.0)"
TypeLib File: "D:\WINNT\System32\wshom.ocx"
File Version: 5.1.0.4615
File Product Name: "Windows Script Host Runtime Library"

To Top


Windows Script Host Shell Object

Registry-Schlüssel

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WScript.Shell
CLSID: {F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}

Instanzierung mit VBA/VB (Late Binding)

Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")

Instanzierung mit VBA/VB (Early Binding)

Dim objWSHShell As New IWshRuntimeLibrary.IWshShell_Class

To Top


Windows Script Host Network Object

Registry-Schlüssel

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WScript.Network
CLSID: {F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}

Instanzierung mit VBA/VB (Late Binding)

Dim objWSHNetwork As Object
Set objWSHNetwork = CreateObject("WScript.Network")

Instanzierung mit VBA/VB (Early Binding)

Dim objWSHNetwork As New IWshRuntimeLibrary.IWshNetwork_Class

To Top

 


Methoden und Eigenschaften der Windows Script Host-Objekte (WScript)

Methoden

Methode Objekt Beschreibung
CreateShortcut IWshShell Erstellt eine Verknüpfung (lnk-Datei) zu einer Datei oder einem Ordner.
Popup IWshShell Blendet einen Meldungsdialog ein (ähnlich MsgBox von VBA).
RegDelete IWshShell Löscht einen Registry-Eintrag.
RegRead IWshShell Liest einen Registry-Eintrag.
RegWrite IWshShell Schreibt einen Registry-Eintrag.
Run IWshShell Führt eine Programmdatei aus (exe-Datei).
Save IWshShortcutClass Speichert eine Verknüpfungsdatei.

To Top


Eigenschaften

Eigenschaft Beschreibung
Environment Enthält die Umgebungsvariablen.
SpecialFolders Enthält eine Auflistung der Spezialordner.

To Top

 


Behandlung von Laufzeitfehlern (Error Handling)

Übersicht der Laufzeitfehler

Diese Tabelle zeigt eine Liste der Fehlercodes, die unbedingt in einer Fehlerbehandlungsroutine im Programmcode abgefangen und behandelt werden müssen.

Fehler (Hex) Fehler (Dec) Fehlermeldung Beschreibung
- 429 ActiveX component can't create object.
Objekterstellung durch ActiveX-Komponente nicht möglich.
Die Objekterstellung ist fehlgeschlagen.

Meistens ist die angegebene Komponente (z.B. die Shell-Klasse) nicht oder nur unvollständig registriert.

&H80070002 -2147024894 Registrierungsschlüssel "<Key>" kann nicht zum Lesen geöffnet werden. Der angegebene Registrierungsschlüssel existiert nicht.
&H80070002 -2147024894 Ungültige Wurzel in Registrierungsschlüssel "<Key>". Die Wurzel ist ungültig, weil der angegebene Registrierungsschlüssel nicht existiert.

Bitte beachten Sie, dass der Laufzeitfehler -2147024894 zwei verschiedene Meldungstexte besitzt. Zudem ist der Standard-Meldungstext von Windows für diesen Fehler "Das System kann die angegebene Datei nicht finden".

To Top

 


VBA-Beispiele

Registry-Eintrag lesen

Anhand der RegRead-Methode kann man sehr einfach auf einen beliebigen Registry-Eintrag zugreifen und seinen Inhalt auslesen.

 

Zeichenfolge lesen

Dieses Beispiel zeigt, wie der Registry-Eintrag von Microsoft Excel, in welchem die Position und Grösse des Anwendungsfensters abgelegt ist, ausgelesen und anschliessend mit MsgBox angezeigt wird.

Sub ReadRegistry()
  Dim strRC As String
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  strRC = objWSHShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\Pos")
  MsgBox strRC
  Set objWSHShell = Nothing
End Sub

 

Wurzel-Wert (Standard) lesen

Dieses Beispiel liest den Wert der so genannten Wurzel des Zweiges ".xls" aus. Der Wurzel-Eintrag besitzt immer den Namen "(Standard)".

Sub ReadRegistryStandardKey()
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  MsgBox objWSHShell.RegRead("HKEY_CLASSES_ROOT\.xls\")
  Set objWSHShell = Nothing
End Sub

 

DWORD-Wert lesen

varValue ist eine Ganzzahl vom Typ Long.

Sub ReadRegistryDWORDValue()
  Dim varValue As Variant

  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  varValue = objWSHShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Control\StatusBar\ClrForeColor")

  MsgBox varValue
  Set objWSHShell = Nothing
End Sub

 

Binärwert lesen

varValue ist ein Array vom Typ Variant.

Sub ReadRegistryBinaryValue()
  Dim varValue As Variant

  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  varValue = objWSHShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Microsoft Office\95\FileGroups\mdn;mdz;")

  MsgBox varValue(1)
  Set objWSHShell = Nothing
End Sub

To Top


Registry-Eintrag schreiben

Das Schreiben eines Registry-Eintrages ist ebenfalls sehr einfach und wird mit der RegWrite-Methode vorgenommen.

 

Zeichenfolge schreiben

Mit dieser Beispielprozedur werden die Werte des Registry-Eintrages von Microsoft Excel, in welchem die Position und Grösse des Anwendungsfensters gespeichert ist, durch geänderte Werte angepasst.

Sub WriteRegistry()
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  objWSHShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\Pos", "20,20,500,250"
  Set objWSHShell = Nothing
End Sub

 

Wurzel-Wert (Standard) schreiben

Dieses Beispiel erstellt einen Registry-Zweig ".aaa" und schreibt den Wert "aaafile" in den Eintrag "(Standard)".

Sub WriteRegistryStandardKey()
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  objWSHShell.RegWrite "HKEY_CLASSES_ROOT\.aaa\", "aaafile"
  Set objWSHShell = Nothing
End Sub

 

DWORD-Wert schreiben

Dieses Beispiel schreibt den DWORD-Wert 1 in den Eintrag "bbb".

Sub WriteRegistryDWORDValue()
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  objWSHShell.RegWrite "HKEY_CLASSES_ROOT\.aaa\bbb", 1, "REG_DWORD"
  Set objWSHShell = Nothing
End Sub

 

Binärwert schreiben

Dieses Beispiel schreibt den Binärwert 2 in den Eintrag "bbb".

Sub WriteRegistryBinaryValue()
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  objWSHShell.RegWrite "HKEY_CLASSES_ROOT\.aaa\bbb", 2, "REG_BINARY"
  Set objWSHShell = Nothing
End Sub

To Top


Registry-Eintrag löschen

Ein Registry-Schlüssel oder -Eintrag wird mit der RegDelete-Methode gelöscht.

 

Eintrag löschen

Sub DeleteRegistryEntry()
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  objWSHShell.RegDelete "HKEY_CLASSES_ROOT\.aaa\bbb"
  Set objWSHShell = Nothing
End Sub

 

Schlüssel löschen

Sub DeleteRegistryKey()
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  objWSHShell.RegDelete "HKEY_CLASSES_ROOT\.aaa"
  Set objWSHShell = Nothing
End Sub

To Top


Verknüpfung anlegen (lnk-Datei)

- Datei-Verknüpfung
- Ordner-Verknüpfung
- Internet-Verknüpfung
- E-Mail-Verknüpfung

 

Verknüpfungen (Dateien mit der Dateinamenerweiterung 'lnk') können ganz einfach erstellt werden.

So wird im Verzeichnis "C:\Programme" eine Verknüpfung mit dem Ordner "C:\Daten" angelegt:

Sub CreateFolderShortcut()
  'Early Binding:
  'Dim objWSHShell As New IWshRuntimeLibrary.IWshShell_Class
  'Dim objWSHShortcut As IWshRuntimeLibrary.IWshShortcut_Class

  'Late Binding:
  Dim objWSHShell As Object
  Dim objWSHShortcut As Object
  Set objWSHShell = CreateObject("WScript.Shell")

  Set objWSHShortcut = objWSHShell.CreateShortcut("C:\Programme\FolderLink.lnk")
  With objWSHShortcut

    .TargetPath = "C:\Daten"
    .Description = "Dies ist eine Ordner-Verknüpfung"
    .WorkingDirectory = ""
    .WindowStyle = 1    '1 = normale Fenstergrösse
    .Save

  End With

  Set objWSHShortcut = Nothing
  Set objWSHShell = Nothing
End Sub

To Top


Temp-Verzeichnis abfragen

Es gibt viele verschiedene Möglichkeiten, wie das Temp-Verzeichnis von Windows ermittelt werden kann. Auch die Windows Script Host-Bibliothek kennt eine solche. Hier der entsprechende Programmcode:

Sub GetEnvironmentTempDir()
  Dim wshShell As Object
  Dim strEnv As Variant
  Set wshShell = CreateObject("WScript.Shell")
  For Each strEnv In wshShell.Environment("PROCESS")
    If UCase(Left$(strEnv, 5)) = "TEMP=" Then
      MsgBox Mid$(strEnv, 6)
      Exit For
    End If
  Next
  Set wshShell = Nothing
End Sub

Weitere Informationen

VBA-Codebeispiele: Temp-Verzeichnis von Windows ermitteln

To Top


Spezial-Ordner abfragen

Beschreibung folgt...

Sub GetSpecialFolders1()
  Dim intCounter As Integer
  Dim objFolders As Object
  Set objFolders = CreateObject("WScript.Shell").SpecialFolders
  For intCounter = 0 To objFolders.Count - 1
    MsgBox objFolders(intCounter)
  Next intCounter
  Set objFolders = Nothing
End Sub

Sub GetSpecialFolders2()
  Dim objFolders As Object
  Set objFolders = CreateObject("WScript.Shell").SpecialFolders
  MsgBox objFolders("sendto")
  MsgBox objFolders("startmenu")
  MsgBox objFolders("recent")
  MsgBox objFolders("favorites")
  MsgBox objFolders("desktop")
  MsgBox objFolders("allusersdesktop")

  'Weitere MsgBox-Anweisungen mit den restlichen Bezeichnern
  Set objFolders = Nothing
End Sub

Sub GetSpecialFolders3()
  MsgBox CreateObject("WScript.Shell").SpecialFolders("desktop")
End Sub

To Top


Neue Dateinamenerweiterung mit Dateitypzuordnung registrieren

Dieses praxisnahe Codebeispiel zeigt, wie man einen neuen Dateityp in Windows registrieren kann. Im Beispiel wird die Dateinamenerweiterung "bwd" als Dateityp "BIFF-Workbench Dump" registriert und mit der Programmdatei BIFF-Workbench.exe verbunden. Nach Ausführen des Programmcodes führt ein Doppelklick auf eine bwd-Datei die Anwendung BIFF-Workbench aus und öffnet die Datei.

Die Variable strAppPath enthält das Programmverzeichnis der Anwendung BIFF-Workbench, z.B. "C:\Programme\BIFF-Workbench".

Sub CreateFileAssociation()
  Dim objShell As Object
  Set objShell = CreateObject("WScript.Shell")
  With objShell
    .RegWrite "HKEY_CLASSES_ROOT\.bwd\", "bwdfile"
    .RegWrite "HKEY_CLASSES_ROOT\bwdfile\", "BIFF-Workbench Dump"
    .RegWrite "HKEY_CLASSES_ROOT\bwdfile\Shell\", ""
    .RegWrite "HKEY_CLASSES_ROOT\bwdfile\Shell\open\command\", Chr$(34) & strAppPath & "\BIFF-Workbench.exe" & Chr$(34) & " %1"
  End With
  Set objShell = Nothing
End Sub

To Top


Installierte Drucker abfragen

Mit dieser kleinen Prozedur werden nacheinander alle installierten Drucker ausgegeben. Beachten Sie insbesondere den Inhalt des objWSHCollection-Objektes, das auf IWshCollection_Class basiert. Das Objekt enthält eine Auflistung (nullbasierter Index) aller Anschlüsse und Druckernamen, wobei immer zwei aufeinanderfolgende Elemente ein Paar bilden: Zuerst kommt der Anschluss und dann der Druckername.

Sub ShowPrinterConnections()
  Dim lngItems As Long
  Dim objWSHNetwork As New IWshRuntimeLibrary.IWshNetwork_Class
  Dim objWSHCollection As IWshRuntimeLibrary.IWshCollection_Class
  Set objWSHCollection = objWSHNetwork.EnumPrinterConnections
  For lngItems = 0 To objWSHCollection.Count - 1 Step 2
    MsgBox "Printer " & CStr(lngItems / 2 + 1) & ": " & objWSHCollection(lngItems) & " " & objWSHCollection(lngItems + 1)
  Next lngItems
  Set objWSHCollection = Nothing
  Set objWSHNetwork = Nothing
End Sub

To Top


Meldungsdialog einblenden (mit Timeout)

Anhand der Popup-Methode lässt sich eine Meldung einblenden (analog MsgBox). Wahlweise kann ein Timeout angegeben werden (Ganzzahl für Sekunden). Im folgenden Beispiel wird die Meldungsdialog nach 5 Sekunden automatisch geschlossen (siehe Zahl 5 als zweiter Methoden-Parameter).

Sub ShowMessageSystemModal()
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  objWSHShell.Popup "Meldung für 5 Sekunden...", 5, "Meldung", vbOKOnly
  Set objWSHShell = Nothing
End Sub

To Top


Meldungsdialog einblenden (systemmodal)

Zwischen einem mit MsgBox und einem mit Popup angezeigten systemmodalen Meldungsdialog gibt es einen Unterschied. Während die mit MsgBox erzeugte Meldung sowohl das Anwendungsfenster von Excel als auch den VBA-Editor sperrt, wird bei Popup nur die aufrufende Anwendung gesperrt. Wenn man die Prozedur mit der Popup-Codezeile aus dem VBA-Editor heraus startet (z.B. mit F5), so wird der VBA-Editor gesperrt, nicht aber das Anwendungsfenster von Excel. Startet man die Prozedur dagegen in Excel über den Menübefehl Extras/Makro/Makros, so wird Excel gesperrt, und der VBA-Editor hingegen nicht.

Sub ShowMessageSystemModal()
  Dim objWSHShell As Object
  Set objWSHShell = CreateObject("WScript.Shell")
  objWSHShell.Popup "Systemmodale Message Box mit Popup.", 0, "Meldung", vbSystemModal
  Set objWSHShell = Nothing
  MsgBox "Systemmodale Message Box mit MsgBox.", vbSystemModal, "Meldung"
End Sub

To Top


Computer- und User-Informationen abfragen

Über das Network-Objekt erhält man Zugriff auf verschiedene Informationen zu Computer und Benutzer. Dieses Beispiel zeigt, wie man Computername, Domänenname und Benutzername abfragen kann.

Sub GetMiscInformation()
  MsgBox CreateObject("WScript.Network").ComputerName
  MsgBox CreateObject("WScript.Network").UserDomain
  MsgBox CreateObject("WScript.Network").UserName
End Sub

To Top


Programm ausführen

Folgt in Kürze...

Sub ExecuteProgram()

End Sub

To Top


Datei mit zugeordnetem Programm öffnen

Folgt in Kürze...

Sub OpenFileWithProgram()

End Sub

To Top

Haben Sie Fragen, Anregungen oder Hinweise?
Mail senden an: philipp_von_wartburg@yahoo.de

Zuletzt aktualisiert am 14.01.2006 / 21:00 Uhr
© 2002-2006 by Philipp von Wartburg, CH-8916 Jonen
Alle Rechte vorbehalten