VBA , externe Programme starten, warten bis fertig
Hi Werner,
- Die Makroaktivierung brauche ich, weil in der Tabelle ein
Programm mit VB Skript eingebettet ist. Nun ist in der Spalte
A ein CommandButton den ich starten möchte, er heisst
CommandButton2.
Wie kann ich den Knopf von VB aus starten???
Ich habe mal rumprobiert. Du brauchst den CommanButton2 und eine Scxhaltfläche(Formular) der du das Makro „tt2“ zuweist.
Der Code funktioniert leider nur wenn CommandButton2 nicht aktiviert ist. Wie du u.a. an den auskommentierten Zeilen siehst, klappte kein Versuch den Code zum laufen zu bringen wenn CB2 aktiviert ist. Irgendwie fehlt da ein Befehl: If CommandButton2.HasFocus Then o.ä.
Code in das Dokumentmodul „Tabelle1“ kopieren.
Option Explicit
Private Sub CommandButton1\_Click()
End Sub
Private Sub CommandButton2\_Click()
MsgBox "gedrückt"
End Sub
Sub tt2()
'On Error GoTo Klicken
'Range("A1").Select
'Range("A1").Activate
'MsgBox IsError(CommandButton2.Activate)
On Error Resume Next
'Application.SendKeys "{ESC}"
CommandButton1.Activate
CommandButton2.Activate
'MsgBox Selection.Address
'CommandButton2.Activate
'Application.SendKeys "{Eingabe}"
'MsgBox TypeName(Selection)
'CommandButton2.SendKeys " "
'Klicken:
Application.SendKeys " "
End Sub
- Danach wird das Skript ausgeführt und ist irgendwann
fertig.
Wie weiss ich wann, denn nach Ausführung des Knopfes rennt ja
auch mein VB eventuell weiter und will die Tabelle schon
wieder schliessen oder die nächste Aktion ausführen.
Der erste Code startet ein Programm, wartet bis Programm fertig, dann läuft der Code weiter:
Option Explicit
'Quelle -ActiveVB.de
Private Declare Function CloseHandle Lib "kernel32" (ByVal \_
hObject 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 GetExitCodeProcess Lib "kernel32" \_
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" ( \_
ByVal dwMilliseconds As Long)
Const STILL\_ACTIVE = &H103
Const PROCESS\_ALL\_ACCESS = &H1F0FFF
Dim TaskID&
Private Function IsActive() As Boolean
Dim Handle&, ExitCode&
Handle = OpenProcess(PROCESS\_ALL\_ACCESS, False, TaskID)
Call GetExitCodeProcess(Handle, ExitCode)
Call CloseHandle(Handle)
IsActive = IIf(ExitCode = STILL\_ACTIVE, True, False)
End Function
Sub start()
TaskID = Shell("notepad.exe", vbNormalFocus)
Do While IsActive
DoEvents
Sleep 250
Loop
MsgBox "Anwendung Läuft nicht mehr!"
End Sub
Der zweite Code (von Bernd Held) macht es ähnlich und misst die Zeit des Programmlaufes:
Option Explicit
Declare Function OpenProcess Lib "kernel32" \_
(ByVal dwDesiredAccess As Long, \_
ByVal bInheritHandle As Long, \_
ByVal dwProcessId As Long) As Long
Declare Function GetExitCodeProcess Lib "kernel32" \_
(ByVal L\_Prozess As Long, \_
l\_Ende As Long) As Long
Public Const PROCESS\_QUERY\_INFORMATION = &H400
Public Const STILL\_ACTIVE = &H103
Sub StartenExternerAnwendung()
Dim Beginn As Double
Dim l As Long
Dim L\_Prozess As Long
Dim l\_Ende As Long
Beginn = Now
With Sheets("Tabelle2")
.Range("A65536").End(xlUp).Offset(1, 0).Value = Now
l = Shell("sol.exe", 1)
L\_Prozess = OpenProcess(PROCESS\_QUERY\_INFORMATION, False, l)
Do While l\_Ende = STILL\_ACTIVE
GetExitCodeProcess L\_Prozess, l\_Ende
DoEvents
Loop
.Range("B65536").End(xlUp).Offset(1, 0).Value = Format(Now - Beginn, "s")
End With
End Sub
Ps: Nochmals nachgefragt, was genau meinst du mit
„in der Tabelle ein Programm mit VB Skript eingebettet“ ?
Startest du eine mit VB erzeugte Exe oder startest du ein Makro mit VB A -Code?
Gruß
Reinhard