Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
916to920
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
916to920
916to920
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

externes programm schließen

externes programm schließen
20.10.2007 22:12:45
Jo
Hallo,
ich hab gestern schonmal gepostet, komm aber mit dem Link nicht ganz klar, da ich ein ziemlicher VBA Anfänger bin.
Folgendes Problem. Wie kann ich eine externe Anwendung (Simulationsprogramm) wieder schließen, die zuvor mit der shell Funktion gestartet habe? Es ist jedoch wichtig, dass die Anwendung vor dem schließen vollständig ausgeführt wurde. Am Ende des Simulationslauf erscheint neben dem DOS Fenster immer noch die Meldung "Programm Terminated with exid code 0 - Exit Window? Ja/Nein.
Da ich etliche tausend Läufe habe, muss ich das Fenster auf jedenfall schließen können!
Wer hat mir einen Tipp bzw. den passenden Code, da ich leider mit ein paar Stichwörtern wahrscheinlich nicht so viel anfangen werde! Am besten Programm öffnen (ausführen), überprüfen ob fertig und dann schließen.
Hier mein bisheriger Code:
Option Explicit
Private Declare

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

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

Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long


Sub Test1()
Dim hProcess As Long
Dim ProcessId As Long
Dim exitCode As Long
ProcessId = shell("C:\SUNDI\SUNDIMK1", vbNormal)
hProcess = OpenProcess(&H400, False, ProcessId)
Do
Call GetExitCodeProcess(hProcess, exitCode)
DoEvents
Loop While exitCode = &H103&
Call CloseHandle(hProcess)
End Sub


Es fehlt doch jetzt nur noch der Befehl, das Programm zu schließen?
Vielen Dank im Voraus!
MFG Jo

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: externes programm schließen
21.10.2007 07:53:00
Luschi
Hallo Jo,
schau mal hier: http://www.office-loesung.de/ftopic160505_0_0_asc.php
Gleich im 1 Beispiel wird Dein Problemfall behandelt: Schließen eines Programmes, das mit der Shell-Funktion geöffnen wurde.
Gruß von Luschi
aus klein-Paris

AW: externes programm schließen
21.10.2007 12:05:00
Jo
Hallo Luschi,
vielen Dank für deinen Tipp. Leider ist es nicht genau das was ich suche. Das externe Programm, das ich mit "shell" öffne muss sich nachdem es vollständig geöffnet bzw. gerechnet hat selbständig wieder schließen. Im Moment kann ich es nur automatisch öffnen und muss es dann selbständig mit [x] schließen. Ich habe aber 8760 Simulationsläufe, so dass dies nicht prktikabel ist.
Hast du oder sonst jemand noch einen Tipp. Hab schon überall gesucht!
Vielen Dank!

Anzeige
AW: externes programm schließen
21.10.2007 13:55:00
Jo
Hat mir jemand noch einen Tipp!?
Mein Code sieht zur Zeit so aus:
Option Explicit
Private Declare

Function TerminateProcess Lib "kernel32" (ByVal _
hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare 

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

Function CloseHandle Lib "kernel32" (ByVal hObject As _
Long) As Long
Const PROCESS_TERMINATE = &H1
Private ProcessId As Long
Private ProcessId_Exit As Long
Private RetVal As Variant


Sub Test3()
ProcessId = shell("D:\app\fcit\kpro46de\rkern\kprohaup.exe", vbNormalFocus)
'Shell startet das ausgewählte Programm.
ProcessId_Exit = OpenProcess(PROCESS_TERMINATE, 0&, ProcessId)
'Mit dieser Funktion erhalten Sie das Object-Handle auf den
'aktiven Prozess.
RetVal = TerminateProcess(ProcessId_Exit, 1&)
'Mit der TerminateProcess Funktion können Sie den ausgewählten
'Prozess und all seine Threads (falls vorhanden) beenden.
RetVal = CloseHandle(ProcessId_Exit)
'Hier wird das Handle wieder geschlossen.
End Sub


Das Problem ist jetzt noch, dass das Programm sofort wieder geschlossen wird. Ich möchte aber sicher sein, dass das Programm vollständig zuende gerechnet hat. Ein Timer wäre evt. eine Möglichkeit, wird aber zu einer sehr langen Simulationszeit führen (8760 Läufe) wenn ich eine Zeitspanne wähle bei der ich sicher sein kann dass das Programm zuende rechnet. Gibt es denn ein Funktion, die wartet bis die externe Anwendung fertig ist und sie dann erst schließt?
Vielen Dank!
Mfg Jo

Anzeige
AW: externes programm schließen
21.10.2007 13:58:56
Jo
Wie bekomm ich meine Frage zu den offenen Fragen?

AW: externes programm schließen
21.10.2007 17:52:00
Tino
Hallo,
Habe diese Möglichkeit im Angebot!
sollte am Programm ende ein Meldungsfenster erscheinen, könntest du es so machen!
Dieses Makro prüft für ca. 10 Sekunden (10 mal 1000 Millisekunden) ob ein bestimmtes Windowsfenster geöffnet ist,
bei ja gibt es diesem Fenster den Focus. Sollte nach 10 Sekunden dieses Fenster nicht erscheinen bricht dass Programm ab.
Aber die SendKey Metohte ist nicht gerate zuverlässig und man sollte am Rechner nichts machen!
Kannst ja eine andere Beendigungs- Prozedur einbauen.

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Programm()
Dim Zähler As Byte
Prüfe_Nochmal:
If Prüfe("Name Fenstertitel") = False Then
Sleep (1000)
Zähler = Zähler + 1
If Zähler > 10 Then GoTo Anwendungsfehler:
GoTo Prüfe_Nochmal
End If
'hier eine SendKeys Anweisung ablaufen Lassen
'siehe Hilfe SendKeys
Exit Sub
Anwendungsfehler:
MsgBox "Zeit abgelaufen"
End Sub
Function Prüfe(Fenster As String) As Boolean
On Error GoTo fehler
AppActivate Fenster
Prüfe = True
Exit Function
fehler:
Prüfe = False
End Function


Gruss Tino

Das Forum lebt von Rückmeldungen!


Anzeige
AW: externes programm schließen
21.10.2007 18:54:00
Kretschi
Hallo Tino,
vielen Dank für deine Antwort. Es ist glaube ich nur leider nicht exakt das was ich suche. Nach Beendigung der Exe geht zwar ein Fenster zum Bestätigen auf ( "Programm Terminated with exid code 0 - Exit Window? Ja/Nein"), dies ist ja aber verbunden mit der Exe. Im Task Manager habe ich nur die Exe der Anwendung die ich schließen muss. Ideal wäre es wenn die Funktion überprüfen würde ob die Anwendung fertig ist (z.B. alle paar msec) und sie dann gleich schließen würde. Andernfalls brauch ich etliche Stunden für meine Simulation.
Ich bekomm die Anwendung ja schon geschlossen (siehe Code) nur eben zu früh nehm ich an!
Werde aber dennoch mal deinen Code ausprobieren!
Noch jemand einen Tipp?
Mfg Jo

Anzeige
AW: externes programm schließen
21.10.2007 19:06:00
Tino
Hallo,
wenn die Meldung einen anderen Titel hat als dein Programm funktioniert es!
Schau mal im Task Manager unter Prozesse, diese Namen funktionieren auch!
Gruss
Tino

AW: externes programm schließen
21.10.2007 22:34:12
Kretschi
Hallo Tino,
Ich habe versucht deinen Code mit ein zu binden. Leider klappt es noch immer nicht. Mit SendKey sende ich ein "J", sollte normalerweise funktionieren. Fenster geht aber noch immer nicht zu. Nehm an ich bin zu blöd!
So schaut mein Code zur Zeit aus:
Public Declare

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


Sub Makro2()
' Makro2 Makro
Dim shell
Dim Zähler As Byte
Set shell = CreateObject("WScript.Shell")
shell.Run "D:\app\fcit\kpro46de\rkern\kprohaup.exe"
Prüfe_Nochmal:
If Prüfe("D:\app\fcit\kpro46de\rkern\kprohaup.exe") = False Then
Sleep (1000)
Zähler = Zähler + 1
If Zähler > 10 Then GoTo Anwendungsfehler:
GoTo Prüfe_Nochmal
End If
SendKeys "J", True
'hier eine SendKeys Anweisung ablaufen Lassen
'siehe Hilfe SendKeys
Exit Sub
Anwendungsfehler:
MsgBox "Zeit abgelaufen"
End Sub



Function Prüfe(Fenster As String) As Boolean
On Error GoTo fehler
AppActivate Fenster
Prüfe = True
Exit Function
fehler:
Prüfe = False
End Function


Wäre super, wenn du nochmals drüber schauen könntest!
MFG Kretschi

Anzeige
AW: externes programm schließen
21.10.2007 22:49:00
Tino
Hallo,
du musst bestimmt "j" mit Enter bestädigen, gehe schritt für schritt vor als ob du es von Hand mit der Tastaur machen würdest!

Sub Makro2()
' Makro2 Makro
Dim shell
Dim Zähler As Byte
Set shell = CreateObject("WScript.Shell")
shell.Run "D:\app\fcit\kpro46de\rkern\kprohaup.exe"
Prüfe_Nochmal:
If Prüfe("D:\app\fcit\kpro46de\rkern\kprohaup.exe") = False Then
Sleep (1000)
Zähler = Zähler + 1
If Zähler > 10 Then GoTo Anwendungsfehler:
GoTo Prüfe_Nochmal
End If
Application.SendKeys "J", True
Application.SendKeys "{Return}", True
'hier eine SendKeys Anweisung ablaufen Lassen
'siehe Hilfe SendKeys
Exit Sub
Anwendungsfehler:
MsgBox "Zeit abgelaufen"
End Sub


Gruss
Tino

Anzeige
AW: externes programm schließen
21.10.2007 23:04:41
Kretschi
Hallo,
habe den SendKeys Return noch mit dazugeschrieben, geht aber leider noch immer nicht. Das Bestätigungsfenster kommt zwar in den Vordergrund. Wird aber nicht geschlossen.
MFG Kretschi

AW: externes programm schließen
21.10.2007 23:08:00
Tino
Hallo,
kommt "J" dort an wo es hin soll?
Was würdest du von Hand nach dem "J" machen?
Gruss
Tino

AW: externes programm schließen
21.10.2007 23:17:00
Tino
Hallo,
versuche es mal so

Application.SendKeys "J{Return}", True


Gruss
Tino

AW: externes programm schließen
21.10.2007 23:32:39
Kretschi
Hallo,
ich glaube es liegt nicht an den SendKeys. Von Hand genügt schon ein "J" um alles zu schließen.
MFG Kretschi

Anzeige
AW: externes programm schließen
21.10.2007 23:36:46
Tino
Hallo,
SendKey ist ein Tastenanschlag, also machst du noch irgendetwas!
Vielleicht unbewusst mit der Maus?
Gruss
Tino

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige