Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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?
Anzeige

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
Anzeige
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
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
Anzeige
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
Anzeige
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!
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Programme in Excel mit VBA beenden


Schritt-für-Schritt-Anleitung

Um ein fremdes Programm wie Outlook oder den Windows-Rechner mit VBA zu beenden, kannst Du die folgenden Schritte ausführen:

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.
  2. Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)" und wähle Einfügen > Modul.
  3. Code einfügen: Kopiere den folgenden Code in das Modul:
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

Public Sub Close_Outlook()
    Dim lngHandle As Long
    lvntTaskId = Shell("C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE", vbMaximizedFocus)

    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
  1. Programm ausführen: Führe die Close_Outlook Subroutine aus, um Outlook zu beenden.

Häufige Fehler und Lösungen

  • Laufzeitfehler 5: Tritt auf, wenn der Titel des Fensters nicht korrekt angegeben ist. Überprüfe den Titel im Task-Manager oder in der Anwendung selbst.

  • Outlook schließt nicht: Stelle sicher, dass der Pfad zur Outlook.exe korrekt ist. Manchmal kann es helfen, den Pfad anzupassen, indem Du /recycle am Ende hinzufügst.

  • SendKeys funktioniert nicht: Wenn Du SendKeys verwendest, stelle sicher, dass die Anwendung im Vordergrund ist. Nutze AppActivate vor dem Befehl.


Alternative Methoden

Eine andere Möglichkeit, ein Programm zu beenden, ist die Nutzung des Windows Management Instrumentation (WMI) Services. Hier ein Beispiel, wie Du Outlook mit WMI beenden kannst:

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

Praktische Beispiele

  1. Outlook beenden: Verwende den oben genannten Close_Outlook Code, um Outlook zu schließen.

  2. Rechner beenden: Ändere den Code so, dass er den Windows-Rechner (calc.exe) schließt:

Public Sub Close_Rechner()
    Dim lngHandle As Long
    lvntTaskId = Shell("C:\Windows\System32\calc.exe", vbMaximizedFocus)

    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

Tipps für Profis

  • Prozesse effizient beenden: Stelle sicher, dass Du immer die richtigen Berechtigungen hast, um Prozesse zu beenden. Bei administrativen Aufgaben kann es nötig sein, Excel als Administrator zu starten.

  • Fehlerbehandlung einbauen: Füge Fehlerbehandlungsroutinen in Deinen Code ein, um unerwartete Situationen elegant zu handhaben.

  • Testen unter verschiedenen Excel-Versionen: Achte darauf, Deinen Code in verschiedenen Versionen von Excel zu testen, da es Unterschiede im Verhalten geben kann.


FAQ: Häufige Fragen

1. Wie kann ich Excel sofort beenden?
Du kannst den Befehl Application.Quit verwenden, um Excel sofort zu schließen.

2. Was ist der Unterschied zwischen OpenProcess und TerminateProcess?
OpenProcess wird verwendet, um ein Handle für einen Prozess zu erhalten, während TerminateProcess verwendet wird, um den Prozess tatsächlich zu beenden.

3. Warum funktioniert SendKeys manchmal nicht?
SendKeys funktioniert nur, wenn die Anwendung im Vordergrund ist. Wenn eine andere Anwendung den Fokus hat, wird der Befehl möglicherweise nicht korrekt ausgeführt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige