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

Forumthread: Wscript.Shell

Wscript.Shell
14.02.2020 20:24:02
cryser88
Hallo,
ich möchte gerne mit der Shell ein Programm starten, das funktioniert auch ohne Probleme. Jedoch würde ich gerne die Position des Programmes (Top,Left) auf dem Bildschirm festlegen.
hier mein Code:
Dim WshShell, objNotepad As Object
Set WshShell = CreateObject("Wscript.Shell")
Set objNotepad = WshShell.Run("C:\Windows\notepad.exe", 1, False)
With objNotepad
.Top = 100
.Left = 100
End With
Bei Set objNotepad kommt die Fehlermeldung Objekt erforderlich.
Vielleicht gibt es ja auch eine ganz andere Möglichkeit.
Ich Sag dann jetzt schonmal Danke für eure Hilfe.
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wscript.Shell
14.02.2020 21:10:29
Luschi
Hallo cryser88,
laut https://www.vbsedit.com/html/6f28899c-d653-4555-8a59-49640b0e32ea.asp gibt Run einen Integer-Wert zurück und kann nicht einer Objektvariablen zugewiesen werden.
Aber auch die API-Funktion 'ShellExecute' gibt einen Long-Wert zurück.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Wscript.Shell
14.02.2020 21:24:12
Cryser88
Hallo,
Ja sowas hab ich mir schon gedacht.
Kennt Jemand vielleicht eine andere Lösung?
AW: Wscript.Shell
15.02.2020 00:55:11
volti
Hallo cryser88,
m.E. gibt die Run-Funktion weder Handle noch Objekt zurück, sondern den Error-Code. 0 ist hierbei die fehlerfreie Ausführung des Befehls.
Ich gehe davon aus, dass Du das Script unter Excel-VBA einsetzt und nicht in einer Script-Datei.
Hier eine Möglichkeit, wie Du Dein Ziel erreichen kannst. Hierbei unterstelle ich, dass der Fenstertext "Unbenannt -Editor" ist…
Option Explicit
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
        ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As LongPtr, _
        ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, _
        ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
       
Sub Test()
 Dim WshShell, lNotepad As Long
 Set WshShell = CreateObject("Wscript.Shell")
 lNotepad = WshShell.Run("C:\Windows\notepad.exe", 1, False)
 Sleep 100
 SetWindowPos FindWindow(vbNullString, "Unbenannt - Editor"), _
              0&, 100, 100, 0, 0, SWP_NOSIZE
End Sub
viele Grüße
Karl-Heinz

Anzeige
AW: Wscript.Shell
15.02.2020 10:40:21
cryser88
Hallo,
Super vielen Dank. Klappt hervorragend. Ich setzte es zwar nicht in Excel-VBA ein sondern bei einer Industrie HMI Software, die sind sich aber sehr ähnlich.
;
Anzeige

Infobox / Tutorial

Wscript.Shell in Excel VBA effektiv nutzen


Schritt-für-Schritt-Anleitung

Um mit Wscript.Shell in Excel VBA ein Programm zu starten, kannst du folgende Schritte befolgen:

  1. Öffne den VBA-Editor in Excel (ALT + F11).

  2. Füge ein neues Modul hinzu (Rechtsklick auf "VBAProject" > Einfügen > Modul).

  3. Kopiere und füge den folgenden Code in das Modul ein:

    Sub StartNotepad()
        Dim WshShell As Object
        Set WshShell = CreateObject("Wscript.Shell")
        WshShell.Run "C:\Windows\notepad.exe"
    End Sub
  4. Schließe den VBA-Editor und führe das Makro aus (ALT + F8, dann "StartNotepad").


Häufige Fehler und Lösungen

  • Fehler: Objekt erforderlich
    Wenn du versuchst, das Ergebnis von WshShell.Run einer Objektvariablen zuzuweisen, erhalte die Fehlermeldung „Objekt erforderlich“. Das liegt daran, dass Run keinen Objektwert zurückgibt, sondern einen Fehlercode. Um das zu umgehen, kannst du einfach den Rückgabewert ignorieren.

  • Fehler: Programm startet nicht
    Stelle sicher, dass der Pfad zum Programm korrekt ist. Du kannst auch versuchen, den Pfad in Anführungszeichen zu setzen, wenn er Leerzeichen enthält (z.B. "C:\Program Files\Notepad++\notepad++.exe").


Alternative Methoden

Wenn du die Position des gestarteten Fensters auf dem Bildschirm festlegen möchtest, kannst du die Windows-API SetWindowPos verwenden. Hier ist ein Beispiel:

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long

Const SWP_NOSIZE = &H1

Sub StartNotepadAndSetPosition()
    Dim WshShell As Object
    Dim hWnd As LongPtr
    Set WshShell = CreateObject("Wscript.Shell")
    WshShell.Run "notepad.exe"
    Application.Wait Now + TimeValue("00:00:02") ' Wartezeit, bis das Programm gestartet ist
    hWnd = FindWindow(vbNullString, "Unbenannt - Editor")
    SetWindowPos hWnd, 0, 100, 100, 0, 0, SWP_NOSIZE
End Sub

Praktische Beispiele

Hier sind einige praktische Anwendungen des Wscript.Shell:

  1. Öffnen eines Webseiten-URLs:

    Sub OpenWebsite()
        Dim WshShell As Object
        Set WshShell = CreateObject("Wscript.Shell")
        WshShell.Run "https://www.example.com"
    End Sub
  2. Starten eines Batch-Skripts:

    Sub RunBatchFile()
        Dim WshShell As Object
        Set WshShell = CreateObject("Wscript.Shell")
        WshShell.Run "C:\path\to\your\script.bat"
    End Sub

Tipps für Profis

  • Vergewissere dich, dass du die richtigen Berechtigungen hast, um Programme über Wscript.Shell zu starten.
  • Nutze WshShell.Exec anstelle von WshShell.Run, wenn du die Ausgaben des gestarteten Programms in VBA weiterverarbeiten möchtest.
  • Halte deinen Code organisiert und dokumentiere, was jeder Teil des Codes bewirken soll, um die Wartbarkeit zu erhöhen.

FAQ: Häufige Fragen

1. Wie kann ich das Wscript.Shell-Objekt in Excel VBA verwenden?
Du kannst das Wscript.Shell-Objekt erstellen, indem du Set WshShell = CreateObject("Wscript.Shell") verwendest.

2. Was ist der Unterschied zwischen WshShell.Run und WshShell.Exec?
WshShell.Run startet ein Programm und gibt sofort die Kontrolle zurück, während WshShell.Exec ein Programm startet und ein Objekt zurückgibt, mit dem du den Status und die Ausgaben des Programms abfragen kannst.

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