Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: wshshell Objekt wieder schließen

wshshell Objekt wieder schließen
13.07.2020 08:55:51
Mike
Hallo zusammen,
Der Code öffnet eine EXE welche Daten aus einer Datenbank sammelt und für die weitere Verarbeitung zur Verfügung stellt.Das funktioniert auch alles aber es wird eben auch ein Explorer Fenster geöffnet das gar nicht benötigt wird und ich gerne nach Ausführung der EXE wieder schließen möchte.
Kann jemand dabei helfen.
Dim wshshell As Object
Set wshshell = CreateObject("WScript.Shell")
wshshell.Run """\\Pfadxy\Export.exe""", 1, True

Gruß
Mike
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: wshshell Objekt wieder schließen
13.07.2020 09:07:01
Martin
Hallo Mike,
teste mal, ob es hiermit klappt:
wshShell.Run "taskkill /f /im Export.exe", , True
VG Martin
AW: wshshell Objekt wieder schließen
13.07.2020 12:12:07
Mike
Hallo Martin,
das funktioniert so nicht. So wie ich das versetehe bezieht sich dein Vorschlag auch auf den Task der EXE. Diese ist ja nicht das Problem da sie sich nach Ausführung ja selbsständig beendet und somit ist der Task ja nicht mehr vorhanden.
Ich muss hier also irgendwie das geöffnete Explorer Fenster ansprechen und das ist in deinem Beispiel nicht der Fall.
Noch einen anderen Vorschlag?
Gruß
Mike
Anzeige
AW: wshshell Objekt wieder schließen
14.07.2020 09:26:35
Mike
Hallo Chris,
nein es geht nur um das schließen eines Windows Explorer Fensters.
Gruß
Mike
AW: wshshell Objekt wieder schließen
14.07.2020 09:46:37
ChrisL
Hi Mike
Wenn die (H)EXE unnötigerweise den Explorer öffnet, dann müsste man die EXE ändern.
Man kann den Explorer zwar schon irgendwie "abschiessen" (google z.B.: VBA quit all file explorer windows). Die Herausforderung besteht darin, das richtige Fenster zu schliessen, wenn du mehrere geöffnet hast. Darum wäre es sinnvoller, wenn sich der Explorer gar nicht erst öffnet oder wenn man sich im Moment vom Öffnen die Instanz merken könnte.
cu
Chris
Anzeige
Nicht nachvollziehbar
14.07.2020 10:04:52
Martin
Hallo Mike,
es ist für uns schwer nachvollziehbar weshalb sich ein Explorer-Fenster bei dem von dir geposteten Code öffnen soll, denn der Explorer wird überhaupt nicht angesprochen. Aber wenn ein unbekanntes Explorer-Fenster geschlossen werden soll, dann gibt es zwei Möglichkeiten:
1. Wechsle mit "AppActivate" auf das Explorer Fenster und schiebe per "SendKeys" die Tastenkombination Alt+F4 hinterher.
2. Suche per API "FindWindow" die HandleID des Explorer Fensters und schließe es ebenfalls per API "SendMessage". Das ist etwas mehr Code, aber die zuverlässigere Variante:
https://www.ozgrid.com/forum/index.php?thread/122581-using-windows-apis-to-close-a-window
VG Martin
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

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:

  1. Erstelle ein neues VBA-Modul in deiner Excel-Arbeitsmappe.

  2. 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
  3. 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:

  1. 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
  2. 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.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige