WSHShell Objekt in Excel VBA korrekt schließen
Schritt-für-Schritt-Anleitung
Um das WSHShell-Objekt in Excel VBA zu verwenden und ein unerwünschtes Windows Explorer-Fenster zu schließen, kannst du die folgenden Schritte ausführen:
-
Erstelle ein neues VBA-Modul in deiner Excel-Arbeitsmappe.
-
Füge den folgenden Code ein, um das WSHShell-Objekt zu erstellen und die EXE auszuführen:
Dim wshshell As Object
Set wshshell = CreateObject("WScript.Shell")
wshshell.Run """\\Pfadxy\Export.exe""", 1, True
-
Schließe das Explorer-Fenster, indem du den AppActivate-Befehl und SendKeys nutzt, um Alt+F4 zu senden:
AppActivate "Windows-Explorer"
SendKeys "%{F4}"
Mit diesem Ansatz kannst du das geöffnete Fenster schließen, nachdem die EXE ausgeführt wurde.
Häufige Fehler und Lösungen
-
Fehler bei der Ausführung: Wenn das Explorer-Fenster nicht geschlossen wird, stelle sicher, dass der Name des Fensters genau übereinstimmt. Du kannst den Titel des Fensters anpassen.
-
EXE startet nicht: Überprüfe den Pfad zur EXE-Datei. Achte darauf, dass die Anführungszeichen korrekt gesetzt sind.
-
Task nicht gefunden: Wenn du taskkill verwendest, stelle sicher, dass der Prozessname korrekt ist und die EXE tatsächlich noch läuft.
Alternative Methoden
Falls das Schließen des Explorer-Fensters über SendKeys nicht zuverlässig funktioniert, kannst du die Windows API verwenden, um das Fenster zu schließen:
-
Deklariere die benötigten API-Funktionen:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
-
Verwende die API, um das Fenster zu finden und zu schließen:
Dim hwnd As LongPtr
hwnd = FindWindow("CabinetWClass", vbNullString) ' Für Windows Explorer
If hwnd <> 0 Then
SendMessage hwnd, &H10, 0, 0 ' WM_CLOSE
End If
Praktische Beispiele
Ein einfaches Beispiel für das Schließen eines Windows Explorer-Fensters könnte so aussehen:
Sub CloseExplorer()
Dim wshshell As Object
Set wshshell = CreateObject("WScript.Shell")
wshshell.Run """\\Pfadxy\Export.exe""", 1, True
Dim hwnd As LongPtr
hwnd = FindWindow("CabinetWClass", vbNullString)
If hwnd <> 0 Then
SendMessage hwnd, &H10, 0, 0 ' WM_CLOSE
End If
End Sub
Hier wird die EXE ausgeführt und anschließend das Explorer-Fenster geschlossen, falls es offen ist.
Tipps für Profis
-
Fehlerbehandlung: Füge Fehlerbehandlung in deinen Code ein, um sicherzustellen, dass dein Skript nicht abstürzt, wenn das Fenster nicht gefunden wird.
-
Verwende Shell anstelle von Run: In einigen Fällen kann der Shell-Befehl schneller sein und ermöglicht eine bessere Kontrolle über die gestarteten Prozesse.
-
Vermeide das unnötige Öffnen von Fenstern: Optimiere die EXE, wenn möglich, um zu verhindern, dass das Explorer-Fenster initialisiert wird.
FAQ: Häufige Fragen
1. Kann ich die EXE ohne die Verwendung von WSHShell ausführen?
Ja, du kannst die EXE auch direkt mit dem Shell-Befehl starten.
2. Was ist der Unterschied zwischen CreateObject und New?
CreateObject wird verwendet, um eine Instanz eines Objekts zu erstellen, während New für Klassen in VBA verwendet wird.
3. Funktioniert dieser Code auch in Excel 2010?
Ja, dieser Code sollte in Excel VBA 2010 und höheren Versionen funktionieren, solange die richtigen Bibliotheken referenziert sind.