Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1072to1076
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
Inhaltsverzeichnis

Warten bis Anwendung beendet ist

Warten bis Anwendung beendet ist
11.05.2009 15:45:03
Werner
Hallo zusammen!
Für mein Problem finde ich trotz intensiver Suche keine Lösung:
Ich will mein Makro solange pausieren lassen, bis ein bestimmtes Programm beendet ist.
Eigentlich wollte ich, dass mein Makro anhält bis das Programm "Saperion" aus folgendem Code gestartet und bereit ist:
Private Declare

Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal _
lpWindowName As String) As Long
Private Declare 

Function MoveWindow Lib "user32" (ByVal hwnd _
As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal bRepaint As Long) As Long


Sub Saperion()
Shell "X:\win32app\Saperion\ARCHIE32.EXE /DocFlow /CurrentUser"
DoEvents
wHandle = FindWindow(vbNullString, "")
Application.Wait TimeSerial(Hour(Now()), _
Minute(Now()), Second(Now()) + 20)
End Sub


Mein Problem ist, dass diese Anwendung manchmal so lange braucht, dass die 20 Sekunden nicht reichen.
Es sollen nämlich Daten aus Excel dorthin übergeben werden.
Ich habe aber im Taskmanager gesehen, dass eine Anwendung Namens "WinJa Windows Client" irgendwann auftaucht.
Sobald diese Anwendung wieder weg ist ist auch mein Programm bereit.
Kriegt man es hin, dass mein Makro wartet?
Gruß und Danke
Werner

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Warten bis Anwendung beendet ist
11.05.2009 16:22:58
Tino
Hallo,
vielleicht so.

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub Beispiel()
Dim strCaption As String
strCaption = "Microsoft Outlook" 'Titel der Anwendung, Beispiel Outlook
Do While FindWindow(vbNullString, strCaption)  0
DoEvents
Loop
MsgBox "Outlook beendet"
End Sub


Gruß Tino

AW: Warten bis Anwendung beendet ist
12.05.2009 08:43:30
Werner
Hallo!
Leider klappt das nicht.
Ein Problem wird auch sein, dass die angesprochene Anwendung nicht als Fenster auftaucht.
Es gibt aber noch einen Prozess, der beendet wird, wenn meine Anwendung bereit ist: SW9C.exe
Vielleicht weis ja noch jemand Rat?!
Gruß
Werner
Anzeige
AW: Warten bis Anwendung beendet ist
12.05.2009 09:39:51
Tino
Hallo,
hier habe ich noch eine Möglichkeit, kannst ja mal testen ob es hiermit geht.
Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub CheckProcess()
Dim objWMIService As Object, objProcess As Object
Dim booProcess As Boolean
Dim strProcessName As String

strProcessName = "firefox.exe" 'Name der Anwendung 

Set objWMIService = GetObject("winmgmts:")
strProcessName = LCase(strProcessName)

Do
    Set objProcess = objWMIService.ExecQuery("Select * from Win32_Process")
    
    booProcess = False
           
           For Each objProcess In objProcess
               If LCase(objProcess.Name) Like strProcessName Then
                 booProcess = True
                 Exit For
               End If
           Next
                  
    If booProcess Then DoEvents: Sleep 200

Loop While booProcess

MsgBox "'" & strProcessName & "' ist beendet"


End Sub


Gruß Tino

Anzeige
AW: Warten bis Anwendung beendet ist
12.05.2009 10:37:38
Werner
Hi
Es tut sich zwar was, passt aber nicht zu meinem Problem.
Es müsste vielleicht nach folgendem Muster laufen:
1. prüfen, ob der Prozess "SW9C.exe" gestartet wurde und läuft
2. wenn der Prozess nicht läuft immer wieder prüfen ob er läuft
3. wenn er läuft prüfen ob dieser Prozess beendet ist.
4. wenn beendet nächstes/anderes Makro laufen lassen
Gruß und Danke!
Werner
AW: Warten bis Anwendung beendet ist
12.05.2009 11:10:03
Tino
Hallo,
bauen wir es um in eine Funktion.
Vielleicht geht es ja so.
Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Function CheckProc(strProgName As String) As Boolean
Dim objWMIService As Object, objProcess As Object
Dim booProcess As Boolean
Dim strProcessName As String

strProcessName = LCase(strProgName)
Set objWMIService = GetObject("winmgmts:")
Set objProcess = objWMIService.ExecQuery("Select * from Win32_Process")
  
           For Each objProcess In objProcess
               If LCase(objProcess.Name) Like strProcessName Then
                 CheckProc = True
                 Exit Function
               End If
           Next

End Function

Sub Beispiel()

    Do While Not CheckProc("SW9C.exe")
     DoEvents: Sleep 100
    Loop

'eventuell hier noch eine Pause einlegen 

Call Machwas 'Anwendung ist gestartet 

    Do While CheckProc("SW9C.exe")
     DoEvents: Sleep 100
    Loop

'eventuell hier noch eine Pause einlegen 

Call Machwasanderes 'Anwendung beendet 

End Sub


Gruß Tino

Anzeige
AW: Warten bis Anwendung beendet ist
12.05.2009 15:09:55
Werner
Ne ne
Auch das ist es nicht. Leider.
Vielleicht denke ich auch zu kompliziert.
Was wäre mit dem hier...
1. prüfen lassen, ob der Prozess "SW9C.exe" läuft
2. Wenn ja Wert in einer Zelle auf 1 setzen
Der Prozess SW9C.exe wird auch nicht von Excel aus gestartet.
Er kommt erst später beim Start einer anderen Anwendung dazu.
Gruß
Werner
AW: Warten bis Anwendung beendet ist
12.05.2009 16:11:43
Tino
Hallo,
aber das macht der Code doch.
In der ersten Schleife wartet er auf den Prozess und in der zweiten Schleife
wartet er bis dieser wieder beendet ist.
Nach der jeweiligen Schleife, kommt Dein Code den Du verwendet möchtest.
Natürlich muss der Code vor dem ganzen gestartet werden,
mit Button oder irgendeiner Ereignisprozedur z. Bsp. Workbook_Open beim öffnen der Excel- Datei.
Gruß Tino
Anzeige
AW: Warten bis Anwendung beendet ist
13.05.2009 12:15:10
Werner
Hallo Tino
aber es hat nicht so funktioniert wie gewünscht.
Habe mir im Netz gestern den ganzen Abend um die Ohren gehauen und folgendes zusammengebastelt:
Sub prozess()
Application.Cursor = xlWait
prcListProcess
Application.Cursor = xlNormal
End Sub



Public Sub prcListProcess(Optional ByVal strComputername As String = ".")
Dim objWMI As Object, objItem As Object, objProperty As Object
Dim lngRow As Long
Application.Cursor = xlWait
Sheets("Tabelle2").Select
Columns("A:B").Select
Selection.ClearContents
Range("A1").Select
Set objWMI = GetObject("winmgmts:\\" & strComputername & "\root\cimv2"). _
ExecQuery("Select * from Win32_Process")
For Each objItem In objWMI
For Each objProperty In objItem.properties_
lngRow = lngRow + 1
Cells(lngRow, 1).Value = objProperty.Name
Cells(lngRow, 2).Value = objProperty.Value
Next
lngRow = lngRow + 1
Next
Set objWMI = Nothing
Suchen_SW9C
End Sub


Sub Suchen_SW9C()
Dim rngFind As Range
Dim strTitel As String
strTitel = "SW9C.exe"
Set rngFind = Columns("B").Find(strTitel, _
LookIn:=xlFormulas)
If Not rngFind Is Nothing Then
rngFind.Select
Else
Application.Wait (Now + TimeValue("0:00:2"))
prcListProcess
End If
Sheets("Tabelle1").Select
End Sub


Hab's mehrfach durchlaufen lassen und es scheint zu klappen.
Nicht das du meinst ich würde alles verstehen was da steht. ;-)
Und bestimmt kann man das Ganze einfacher und übersichtlicher stricken. Ich leider nicht. ;-)
Hab' VIELEN DANK für deine Geduld und Hilfe!!!
Echt ein klasse Forum hier. Habe schon oft Hilfe gesucht und HIER gefunden.
Gruß
Werner

Anzeige
wenn es funktioniert ist es doch ok. (owT.)
13.05.2009 15:29:22
Tino

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige