Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1068to1072
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

Fremdes Programm beenden

Fremdes Programm beenden
19.04.2009 14:02:33
Horst
Hallo zusammen!
Wie kann man per VBA ein fremdes Programm (zB Rechner, Outlook) beenden?
Mit "Shell kann ich ein Programm starten. Doch wie kann ich es per VBA Prozedur wieder schließen? Gibt's dafür eine simple Lösung?

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fremdes Programm beenden
19.04.2009 14:15:28
Tino
Hallo,
z. Bsp. so.
Option Explicit

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

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

Private Const PROCESS_TERMINATE = &H1
Private Const PROCESS_VM_READ = &H10

Private lvntTaskId As Long


'Beispiel für Outlook************************************************************************** 
Public Sub Open_Outlook()
    'Eventuell Pfad anpassen 
    lvntTaskId = Shell("C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE", vbMaximizedFocus)
End Sub

Public Sub Close_Outlook()
    Dim lngHandle As Long
    If lvntTaskId <> 0 Then
        lngHandle = OpenProcess(PROCESS_VM_READ Or PROCESS_TERMINATE, 0&, lvntTaskId)
        If lngHandle <> 0 Then Call TerminateProcess(lngHandle, 0&)
    End If
End Sub
'*********************************************************************************************** 


'Beispiel für Rechner************************************************************************** 
Public Sub Open_Rechner()
    'Eventuell Pfad anpassen 
    lvntTaskId = Shell("C:\Windows\System32\calc.exe", vbMaximizedFocus)
End Sub

Public Sub Close_Rechner()
    Dim lngHandle As Long
    If lvntTaskId <> 0 Then
        lngHandle = OpenProcess(PROCESS_VM_READ Or PROCESS_TERMINATE, 0&, lvntTaskId)
        If lngHandle <> 0 Then Call TerminateProcess(lngHandle, 0&)
    End If
End Sub
'*********************************************************************************************** 


Gruß Tino

Anzeige
AW: Fremdes Programm beenden
19.04.2009 14:18:22
Horst
super!
geht das eigentlich auch einfach mit: SendKeys ("%{F4}"), True ?
AW: Fremdes Programm beenden
19.04.2009 14:31:51
Tino
Hallo,
ich bin eigentlich ein Verfechter von SendKeys und versuche dies wo es nur geht zu vermeiden.
Teste mal ob es so geht.
Option Explicit

Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer

Private Declare Sub keybd_event Lib "user32" ( _
  ByVal byteVirtualKeycode As Byte, _
  ByVal byteScan As Byte, _
  ByVal lFlags As Long, _
  ByVal lExtraInfo As Long)

Private Sub CheckNumLock() 'zum aktivieren der Num-Lock Taste 
Const KEYEVENTF_KEYUP As Long = &H2
Const VK_NUMLOCK = &H90

If Not (GetKeyState(vbKeyNumlock) = 1) Then
  keybd_event VK_NUMLOCK, 1, 0, 0
  keybd_event VK_NUMLOCK, 1, KEYEVENTF_KEYUP, 0
End If

End Sub

Sub test()
AppActivate "- Microsoft Outlook"
Application.SendKeys "%{F4}"

Call CheckNumLock 'Bug bei SendKeys, Num- Taste wieder aktivieren. 
End Sub


Gruß Tino

Anzeige
AW: Fremdes Programm beenden
19.04.2009 14:40:50
Horst
Hi!
also mit AppActivate "- Microsoft Outlook"
bzw. auch mit AppActivate "C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE" bekomme ich Laufzeitfehler 5: Üngültiger Prozeduraufruf oder ungültiges Argument. Outlook schließt sich nicht.
Was mache ich falsch?
AW: Fremdes Programm beenden
19.04.2009 14:47:55
Tino
Hallo,
- Microsoft Outlook ist der rechte Teil der bei mir im Titel von Outlook steht.
Schau mal bei Dir was da im Titel steht oder schau im Taskmanager unter Anwendungen welchen Namen Outlook unter Task verwendet.
Gruß Tino
AW: Fremdes Programm beenden
19.04.2009 15:01:47
Horst
also bei mir steht auch "- Microsoft Outlook". Steht auch im Task-Manager. Prozess ist Outlook.exe. Der Pfad von der QuickLaunch ist:
"C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE" /recycle
Anzeige
AW: Fremdes Programm beenden
19.04.2009 15:24:45
Tino
Hallo,
habe es jetzt mal unter Win Xp mit xl2003 getestet, bei mir funzen beide Versionen wie angegeben.
Weis nicht was bei Dir anders ist.
Gruß Tino
AW: Fremdes Programm beenden
19.04.2009 14:30:54
Horst
Hi Tino!
Hast du den Code unter Excel 03 getestet? Das Öffnen der Programme funktioniert problemlos, nur das Schließen klappt nicht. Es tut sich nichts. Müssen evtl. irgendwelche externen Verweise aktiv sein?
xl2003 kann ich nicht testen.
19.04.2009 14:34:00
Tino
Hallo,
habe hier zur Zeit Vista mit xl2007 und da funzt es.
xl2003 kann ich jetzt nicht testen.
Gruß Tino
AW: xl2003 kann ich nicht testen.
19.04.2009 22:40:58
Horst
Besten Dank, Tino! Ich hab's hinbekommen, dass es funktioniert.
Allerdings scheint es, dass keine der beiden Varianten zu 100 % funktioniert. Hab' mal paar Stresstests gemacht, bei denen noch die Lösung mit den "SendKeys"-Befehl am besten abschneidet ;-)) Das Beenden des Programms kann in seltenen Fällen zum Problem werden - scheint auch von der Auslastung des gestarteten Programms abzuhängen.
Anzeige
noch eine Möglichkeit
20.04.2009 07:57:22
Tino
Hallo,
eine weitere Möglichkeit wäre dieses Programm mit dem WMI Service zu beenden.
Teste mal.
Sub Outlook_beenden()
Dim objWMI As Object, objProcess As Object

    Set objWMI = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\.\root\cimv2")
          
    Set objProcess = objWMI.ExecQuery _
        ("Select * from Win32_Process Where Name = 'OUTLOOK.exe'")

    On Error Resume Next
    For Each objProcess In objProcess
              objProcess.Terminate
    Next
    
    If Err.Number <> 0 Then MsgBox "Es sind fehler aufgetreten beim versuch Outlook zu beenden!", vbCritical


Set objProcess = Nothing:  Set objWMI = Nothing
End Sub


Gruß Tino

Anzeige
AW: noch eine Möglichkeit
20.04.2009 13:08:38
Horst
Scheint die "stärkste" Lösung zu sein. Manchmal tritt dann beim nächsten Start von Outlook die Fehlermeldung auf, dass das Programm beim letzten Mal nicht richtig geschlossen wurde. Aber dies lässt sich abmildern, indem man das Terminieren des Programms etwas verzögert. Scheint problemlos zu laufen.
Besten Dank, Tino!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige