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?
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
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
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
Um ein fremdes Programm wie Outlook oder den Windows-Rechner mit VBA zu beenden, kannst Du die folgenden Schritte ausführen:
ALT + F11, um den VBA-Editor in Excel zu öffnen.Einfügen > 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
Close_Outlook Subroutine aus, um Outlook zu beenden.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.
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
Outlook beenden: Verwende den oben genannten Close_Outlook Code, um Outlook zu schließen.
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
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.
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.