Excel VBA ("WScript.Shell").Run und Hidden

gehtnetgibtsnet

Cadet 4th Year
Registriert
März 2019
Beiträge
103
Hallo VBA-Spezialisten,

in einem VBA-Code führe ich (erfolgreich) folgenden Befehl aus:

X = Split(CreateObject("WSCript.Shell").Exec("cmd /c ipconfig").stdout.readall, vbCrLf)

Was mich dabei stört ist die Tatsache, dass für einen kurzen Moment ein Windows-Fenster erscheint.

Bei meiner Suche im Internet habe ich auch einen Lösungsansatz gefunden:

CreateObject("WScript.Shell").Run "cmd /c ipconfig | clip", 0, True

Danach muss ich den Clipboard auslesen.

Dim strOutput
strOutput = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")

Mir ist aber meine alte Lösung lieber, aber bitte hidden.

Meine Frage: wie muss ich meinen oben genannten Befehl ändern, damit das Fenster "hidden" ist?

Mir ist bewusst, dass hier zwei verschiedene Schnittstellen aufgerufen werden: .EXEC und .RUN.
 
Und warum stört dich das? Wenn es nur kurz offen ist, ist es doch bumms. Solange der Code tut was er soll. Du könntest btw. auch den Code formatieren...macht willigen Helfern das Lesen leichter:

Code:
X = Split(CreateObject("WSCript.Shell").Exec("cmd /c ipconfig").stdout.readall, vbCrLf)

Code:
Dim strOutput
strOutput = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")

greetz
hroessler
 
Hallo hroessler,

ich weiß nicht, was ich mit Deiner Antwort anfangen soll. Alles was Du geschrieben hast, steht in meiner Frage schon drin. Und eine Lösung des von mir genannten Problems ist auch nicht erkennbar.
 
Ich hab mich jetzt schon lange nicht mehr damit beschaeftigt, aber mein Makro ist wie folgt aufgebaut:
Code:
befehl = "cmd /k ..."
x = Shell(befehl, vbHide)
 
Du kannst den Parameter /Q beim Aufruf der CMD nutzen:


X = Split(CreateObject("WSCript.Shell").Exec("cmd /Q /c ipconfig").stdout.readall, vbCrLf)
 
Hallo Scientist, hallo Gameforce,

Danke für Eure Antworten.

@Scientist

Leider reichen meine VBA-Kenntnisse nicht aus, den Output mit dem von Dir empfohlenen Command zu sichern, so wie das in meinem Beispiel der Fall war.

@Gameforce

Ich habe den Code bei mir entsprechend geändert, es hatte allerdings keine Auswirkung. Nun habe ich nachgeforscht, welche Bedeutung /q hat. Außerdem habe ich nach /c gesucht, was ich ohne weiter Überprüfung aus einem empfohlenen Code übernommen habe. Hier mein Suchergebnis:

/c Führt den durch die Zeichenfolge angegebenen Befehl aus und wird dann beendet.
/k Führt den durch die Zeichenfolge angegebenen Befehl aus und wird fortgesetzt.
/s Ändert die Behandlung der Zeichenfolge nach /c oder /k.
/q Schaltet das Echo ein.
/d Deaktiviert die Ausführung von Autorun-Befehlen.

Nachzulesen unter: https://docs.microsoft.com/de-de/windows-server/administration/windows-commands/cmd
 
Mit "Exec" laesst sich das Fenster wohl nicht verhindern.

Bei meiner Variante koennte man das Ergebnis des cmd-Befehls in eine Datei leiten ("> c:/pfad/datei.txt") und die Datei dann auslesen und verarbeiten.
Die Datei kann anschließend mit "kill" wieder geloescht werden.

Ansonsten sieht das hier viel versprechend aus: https://stackoverflow.com/
 
Hallo Scientist,

den von Dir genannten Link kannte ich schon. Da steht auch der Satz drin: Now the window only shows up for a split second. But I don't want it to show up at all.

Ich werde mich irgendwann damit beschäftigen, auf .Run und Clip umzustellen.

Für mich ich das Thema damit erledigt. Vielen Dank.
 
Zurück
Oben