Discussion:
VBA - Shell
(zu alt für eine Antwort)
Anton Haumer
2004-04-05 09:50:59 UTC
Permalink
Hallo Excel-VBA - Kenner,

ich habe eine Frage:

Mit Shell "Programm.exe" kann ich aus dem VBA-Code heraus ein
externes Programm starten; wie kann ich feststellen,
dass das externe Programm fertig (der prozess beendet) ist
bzw. wie kann ich meinen VBA-Code darauf warten lassen?
AppActivate funktioniert definitiv nicht.

Es handelt sich um XL2k und ein DOS-Programm.

Danke für Tips,

Toni Haumer
Michael Schwimmer
2004-04-05 10:07:16 UTC
Permalink
Post by Anton Haumer
Hallo Excel-VBA - Kenner,
Hallo Anton,
Post by Anton Haumer
Mit Shell "Programm.exe" kann ich aus dem VBA-Code heraus ein
externes Programm starten; wie kann ich feststellen,
dass das externe Programm fertig (der prozess beendet) ist
bzw. wie kann ich meinen VBA-Code darauf warten lassen?
AppActivate funktioniert definitiv nicht.
Es handelt sich um XL2k und ein DOS-Programm.
Option Explicit

Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STILL_ACTIVE = &H103

Private Declare Function GetExitCodeProcess Lib _
"kernel32" (ByVal hProcess As Long, _
lpExitCode As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long

Sub test()
Dim hwndShell As Long, hwndProzess As Long
Dim lngLäuft As Long
hwndShell = Shell(Environ("COMSPEC") & " /C c:\test.bat ", 0)
hwndProzess = OpenProcess(PROCESS_QUERY_INFORMATION, _
0&, hwndShell)
Do
GetExitCodeProcess hwndProzess, lngLäuft
'ev.
'DoEvents
Loop While lngLäuft = STILL_ACTIVE
MsgBox "Programm ausgeführt"
End Sub

MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home neu: http://michael-schwimmer.de
Anton Haumer
2004-04-05 10:41:50 UTC
Permalink
Post by Michael Schwimmer
Post by Anton Haumer
Hallo Excel-VBA - Kenner,
Hallo Anton,
Post by Anton Haumer
Mit Shell "Programm.exe" kann ich aus dem VBA-Code heraus ein
externes Programm starten; wie kann ich feststellen,
dass das externe Programm fertig (der prozess beendet) ist
bzw. wie kann ich meinen VBA-Code darauf warten lassen?
AppActivate funktioniert definitiv nicht.
Es handelt sich um XL2k und ein DOS-Programm.
Option Explicit
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STILL_ACTIVE = &H103
Private Declare Function GetExitCodeProcess Lib _
"kernel32" (ByVal hProcess As Long, _
lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Sub test()
Dim hwndShell As Long, hwndProzess As Long
Dim lngLäuft As Long
hwndShell = Shell(Environ("COMSPEC") & " /C c:\test.bat ", 0)
hwndProzess = OpenProcess(PROCESS_QUERY_INFORMATION, _
0&, hwndShell)
Do
GetExitCodeProcess hwndProzess, lngLäuft
'ev.
'DoEvents
Loop While lngLäuft = STILL_ACTIVE
MsgBox "Programm ausgeführt"
End Sub
MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home neu: http://michael-schwimmer.de
Hallo Michael,

many thanks, nach so etwas habe ich schon lang gesucht!
Du bist ja als API-Experte in dieser NG bekannt ;-)
Das probiere ich gleich aus.

Servus,
Toni
Anton Haumer
2004-04-05 15:39:17 UTC
Permalink
Nochmals Danke Michael,

gerade ausprobiert, kleine Anpassungen -
tut genau das was ich wollte!

Servus aus Wien,
Toni
Michael Schwimmer
2004-04-05 19:19:31 UTC
Permalink
Hallo Anton,
Post by Anton Haumer
gerade ausprobiert, kleine Anpassungen -
tut genau das was ich wollte!
freut mich, wenns klappert!
Man könnte als kleine Verbesserung in die Schleife noch einen Sleep
einfügen, dann legt sich Excel für diese Zeit (in Millisekunden)
schlafen und frisst nicht so viel Prozessorzeit.

Declare Sub Sleep Lib "kernel32" (ByVal _
dwMilliseconds As Long)

Do
GetExitCodeProcess hwndProzess, lngLäuft
Sleep 100 'ms
Loop While lngLäuft = STILL_ACTIVE

Und Danke für die Rückmeldung!

MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home neu: http://michael-schwimmer.de
Anton Haumer
2004-04-06 15:31:58 UTC
Permalink
Post by Michael Schwimmer
Hallo Anton,
Post by Anton Haumer
gerade ausprobiert, kleine Anpassungen -
tut genau das was ich wollte!
freut mich, wenns klappert!
Man könnte als kleine Verbesserung in die Schleife noch einen Sleep
einfügen, dann legt sich Excel für diese Zeit (in Millisekunden)
schlafen und frisst nicht so viel Prozessorzeit.
Declare Sub Sleep Lib "kernel32" (ByVal _
dwMilliseconds As Long)
Do
GetExitCodeProcess hwndProzess, lngLäuft
Sleep 100 'ms
Loop While lngLäuft = STILL_ACTIVE
Und Danke für die Rückmeldung!
MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home neu: http://michael-schwimmer.de
Na wenn Du mich schon mit weiterführenden Tips versorgst ;-)
darf ich Dich noch was fragen?

Unter welchen Umständen brauche ich das in der ersten Version
von Dir mit eventuell angegebene DoEvents?

Danke aus Wien,
Toni
Michael Schwimmer
2004-04-06 17:28:55 UTC
Permalink
Hallo Anton
Post by Anton Haumer
Na wenn Du mich schon mit weiterführenden Tips versorgst ;-)
darf ich Dich noch was fragen?
aber selbstverfreilich!
Post by Anton Haumer
Unter welchen Umständen brauche ich das in der ersten Version
von Dir mit eventuell angegebene DoEvents?
Ein DoEvents hat in dem Fall den Effekt, dass Excel nicht wie
eingefroren wirkt. Du kannst andere Zellen selektieren und Ereignisse
werden ausgelöst, während du dich noch in der Schleife befindest. Das
birgt aber auch Gefahren und sollte eigentlich recht sparsam benutzt
werden. Vielleicht in jedem 10. Durchlauf oder so.

Ein Sleep bewirkt, dass sofort die Zeitscheibe verlassen wird und ein
anderer Thread an die Reihe kommt. Das gibt anderen Anwendungen mehr
Zeit. Das funktioniert sogar bei einem Sleep 0 und je länger du Excel
schlafen legst, desto schneller läuft der Rest. Aber ob du unter
normalen Umständen den Unterschied merkst, sei dahingestellt.

MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home neu: http://michael-schwimmer.de
Anton Haumer
2004-04-06 19:08:47 UTC
Permalink
Post by Michael Schwimmer
Hallo Anton
Post by Anton Haumer
Na wenn Du mich schon mit weiterführenden Tips versorgst ;-)
darf ich Dich noch was fragen?
aber selbstverfreilich!
Post by Anton Haumer
Unter welchen Umständen brauche ich das in der ersten Version
von Dir mit eventuell angegebene DoEvents?
Ein DoEvents hat in dem Fall den Effekt, dass Excel nicht wie
eingefroren wirkt. Du kannst andere Zellen selektieren und Ereignisse
werden ausgelöst, während du dich noch in der Schleife befindest. Das
birgt aber auch Gefahren und sollte eigentlich recht sparsam benutzt
werden. Vielleicht in jedem 10. Durchlauf oder so.
Ein Sleep bewirkt, dass sofort die Zeitscheibe verlassen wird und ein
anderer Thread an die Reihe kommt. Das gibt anderen Anwendungen mehr
Zeit. Das funktioniert sogar bei einem Sleep 0 und je länger du Excel
schlafen legst, desto schneller läuft der Rest. Aber ob du unter
normalen Umständen den Unterschied merkst, sei dahingestellt.
MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home neu: http://michael-schwimmer.de
Danke - klingt logisch.
Eigentlich soll in meinem Fall der Benutzer gar nix tun
bis das externe Programm fertig ist,
nachher darf er sich die Ergebnisse wieder anschauen ;-)

Servus, Toni

Ralf Pfeifer
2004-04-05 16:35:32 UTC
Permalink
Post by Anton Haumer
Hallo Excel-VBA - Kenner,
Mit Shell "Programm.exe" kann ich aus dem VBA-Code heraus ein
externes Programm starten; wie kann ich feststellen,
dass das externe Programm fertig (der prozess beendet) ist
bzw. wie kann ich meinen VBA-Code darauf warten lassen?
AppActivate funktioniert definitiv nicht.
Probier's ganz einfach damit:


CreateObject("WScript.Shell").Run "Programm.exe", vbMinimized, True


Der zweite Parameter entspricht denen des Shell-Befehls und gibt
an, wie das Programm gestartet werden soll (mit/ohne Fokus, maximiert
oder versteckt ...) und das TRUE sorgt dafür, dass Dein VBA-Code
so lange wartet, bis das aufgerufene Programm beendet wird.

Im Gegensatz zu Shell kannst Du auch die Datei Direkt aufrufen,
wenn statt "Programm.exe" ein "index.html" da steht, öffnet Windows
die registrierte Anwendung für HTML-Seiten.

Gruß, Ralf.
--
www.ArsTechnica.de --- www.ArsMartialis.com
Lesen Sie weiter auf narkive:
Loading...