Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
460to464
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
460to464
460to464
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Makro soll auf Anwendung warten

Makro soll auf Anwendung warten
29.07.2004 11:57:01
Russi
Hallo, Ihr Spezialisten da draußen!
Ich hoffe mal wieder auf Eure Hilfe: Ich rufe per VBA Winzip auf. Während Winzip arbeitet, soll die Makroausführung unterbrochen werden/pausieren.
Ein entsprechendes Code-Beispiel habe ich bereits gefunden: Siehe hier
Diese Warten-Funktion funktioniert bei mir jedoch nicht:
Die Sub "Aufrufen_und_warten" findet die ProzessID von "Winzip32 exe". Trotzdem wartet das Makro nicht, bis Winzip fertig gepackt hat.
Hier ist meine Beispieldatei: Siehe hier
Wäre toll, wenn mir wieder jemand von Euch weiterhelfen könnte!!!
Viele Grüße
Russi

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro soll auf Anwendung warten
30.07.2004 08:26:57
kdosi
Hallo Russi, ich weis nicht, ob es Dir hilft, aber der Code hat bei mir ohne Probleme functioniert! In dem Code habe ich aber vieles auskommentirt, also das Problem liegt irgendwo in dem auskommentiertem Code :-). Vesuch es ertsmals ohne den "On Error Resume Next" und "On Error GoTo 0" Statements, oder soltest Du die Err.Number Eigenschafft testen, ob keine Fehler aufgetreten sind, z.B :
On Error GoTo 0
Hier etwas tun ... "ABC"
If(Err.Number = 0) then alles OK else gabs Probleme bei ABC
Gruss kdosi, CZ
---------------------------------------------------------------------------------------
Option Explicit
Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const WAIT_TIMEOUT = &H102&
Public Const PFAD As String = "C:\Program Files\EasyZip"
Public Const EXE_NAME As String = "EZIP.EXE"
Declare

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

Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long

Sub Zippen()
Dim Zip As String
Dim Dateiname As String
'    Dim PFAD As String
Dim Zeile As Integer
'    Dateiname = "Datenaktuell"
'    Zeile = 3
'    'Do While ThisWorkbook.Sheets("Parameter").Cells(Zeile, 1).Value > ""
'        PFAD = ThisWorkbook.Sheets("Parameter").Cells(Zeile, 1).Value
'        ' ggf. alte ZIP-Datei löschen
'        On Error Resume Next
'        Kill (PFAD & Application.PathSeparator & Dateiname & ".zip")
'        On Error GoTo 0
'        ' ZIP-Datei generieren
'        Zip = "c:\programme\winzip\winzip32.exe -min -a -r " _
'            & """" & PFAD & Application.PathSeparator & Dateiname & ".zip"" " _
'            & """" & PFAD & "\*.xls"""
Call Aufrufen_und_warten(VBA.IIf(VBA.Right(PFAD, 1) = "\", PFAD & EXE_NAME, PFAD & "\" & EXE_NAME))
VBA.MsgBox EXE_NAME & " beendet!"
'        'Shell Zip
'        ' EXE aus ZIP generieren
'        Zip = "c:\programme\winzip\wzsepe32.exe " & _
'            """" & PFAD & Application.PathSeparator & Dateiname & ".zip"""
'        Call Aufrufen_und_warten(Zip)
'        'Shell Zip
'        Zeile = Zeile + 1
'    'Loop
End Sub


Sub Aufrufen_und_warten(ProgEXE As String)
Dim ProcessID As Long
Dim hProcess As Long
Dim RetVal As Long
ProcessID = Shell(ProgEXE)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
Do
DoEvents
RetVal = WaitForSingleObject(hProcess, 50)
Loop Until RetVal <> WAIT_TIMEOUT
End Sub

Anzeige
AW: Makro soll auf Anwendung warten
30.07.2004 09:10:21
Russi
Hallo kdosi!
Vielen Dank für Deine Hilfe!!!
Dein Beispiel funktioniert, übergibt aber leider keine Parameter an Winzip. Ändere ich das Makro dementsprechend ab, kommt die MSGBOX, sobald WinZIP fertig geladen ist. WinZIP ist aber dann noch eine ganze Weile mit dem Packen der Datei und der Unterverzeichnisse beschäftigt und erst danach wird WinZIP wieder geschlossen.
Hast Du dafür vielleicht auch noch eine Lösung parat?
Russi
www.Russi.de.tt
______________________________________________________________________________________
Hier mein Code:
Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const WAIT_TIMEOUT = &H102&
Public Const PFAD As String = "c:\programme\winzip"
Public Const EXE_NAME As String = "Winzip32.EXE"
Declare

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

Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long

Sub Zippen()
Dim Zip As String
Dim Dateiname As String
Dim Zeile As Integer
Call Aufrufen_und_warten("c:\programme\winzip\winzip32.exe -min -a -r ""O:\AXA_Agenturdialog\daten_06_2004\VTD_200001\LVB_200100\Datenaktuell.zip"" ""O:\AXA_Agenturdialog\daten_06_2004\VTD_200001\LVB_200100\Datenaktuell.xls""")
'Call Aufrufen_und_warten(VBA.IIf(VBA.Right(PFAD, 1) = "\", PFAD & EXE_NAME, PFAD & "\" & EXE_NAME))
VBA.MsgBox EXE_NAME & " beendet!"
End Sub


Sub Aufrufen_und_warten(ProgEXE As String)
Dim ProcessID As Long
Dim hProcess As Long
Dim RetVal As Long
ProcessID = Shell(ProgEXE)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
Do
DoEvents
RetVal = WaitForSingleObject(hProcess, 50)
Loop Until RetVal <> WAIT_TIMEOUT
End Sub

Anzeige
AW: Makro soll auf Anwendung warten
30.07.2004 13:50:47
kdosi
Hallo Russi, also ich habe etwas gefunden, und es scheint zu funktionieren!
Die Do Loop Until Schleife ersetzt man mit :
If lHnd 0 Then
lRet = WaitForSingleObject(lHnd, INFINITE)
CloseHandle (lHnd)
End If
Die WaitForSingleObject Funktion wartet jetzt so lange, bis die "Shell-Anwendung" geschossen ist. Probleme koennten entstehen, wenn die Shell-Anwendung haengen bleibt, weil dann bleibt auch der Macro-Code haengen. Aber der Code mit der Do Loop Schleife hat auch bei mir nicht auf die Beendung des WinZIPs gewartet! Also lass es mich wissen, ob es funzt :-)
Gruss kdosi, CZ
' hier habe ich den Beispiel gefunden, und weiter unten ist der Makro-Code.
' -----------------------------------------
' h t t p :/ / w w w .thescarms.com/VBasic/wait.asp
' -----------------------------------------
Option Explicit
Const SYNCHRONIZE = &H100000

Const INFINITE = &HFFFF
'Wait forever

Const WAIT_OBJECT_0 = 0
'The state of the specified object is signaled

Const WAIT_TIMEOUT = &H102
'The time-out interval elapsed & the object’s state
'is nonsignaled.

Public Const WINZIP32EXE_PFAD As String = "c:\programme\winzip"
Public Const WINZIP32EXE_NAME As String = "Winzip32.EXE"
Public Const XLSDATEI_NAME As String = "Datenaktuell.xls"
Public Const ZIPDATEI_NAME As String = "Datenaktuell.zip"
' "c:\programme\winzip\winzip32.exe -min -a -r "
Public Const BEFEHLSZEILENOPTIONEN As String = "-min -a -r"
' "O:\AXA_Agenturdialog\daten_06_2004\VTD_200001\LVB_200100\Datenaktuell.zip""
' ""O:\AXA_Agenturdialog\daten_06_2004\VTD_200001\LVB_200100\Datenaktuell.xls"""
Public Const STANDARDZIELORDNER As String = "C:\Temp"
Declare

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

Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Declare 

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

Sub Zippen()
Dim Zip As String
Dim DATEINAME As String
Dim Zeile As Integer
'    Adding Files, the command format is:
'    winzip[32].exe action [options] filename[.zip] files
Call Aufrufen_und_warten(WINZIP32EXE_PFAD & "\" & WINZIP32EXE_NAME & " " & BEFEHLSZEILENOPTIONEN & " " & _
STANDARDZIELORDNER & "\" & ZIPDATEI_NAME & " " & _
STANDARDZIELORDNER & "\" & XLSDATEI_NAME)
VBA.MsgBox EXE_NAME & " beendet!"
End Sub


Sub Aufrufen_und_warten(ProgEXE As String)
Dim lPid As Long
Dim lHnd As Long
Dim lRet As Long
If Trim$(ProgEXE) = "" Then Exit Sub
lPid = VBA.Shell(ProgEXE, vbNormalFocus)
If lPid <> 0 Then
'Get a handle to the shelled process.
lHnd = OpenProcess(SYNCHRONIZE, 0, lPid)
'If successful, wait for the application to end and close the handle.
If lHnd <> 0 Then
lRet = WaitForSingleObject(lHnd, INFINITE)
CloseHandle (lHnd)
End If
End If
End Sub

Anzeige
AW: Makro soll auf Anwendung warten
30.07.2004 14:09:45
Russi
Hallo kdosi!!!
Du bist der Größte!!! Es funktioniert tatsächlich!
Dein Beispiel kriege ich jetzt auch selbst so umgearbeitet, dass es genau für mich passt.
Vielen vielen Dank für Deine tolle Hilfe! Hätte ich alleine niemals hinbekommen.
Viele Grüße
Russi
www.Russi.de.tt
AW: Makro soll auf Anwendung warten
kdosi
:-))) es freut mich, dass es lauft! Gruss kdosi, CZ

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige