Kategorien
Blog

Office-VBA-Hacks: PowerPoint automatisch beenden

Vor kurzem hatte ich das Problem, dass ich Powerpoint automatisch mittels VBA-Code beenden wollte. Das ist an sich ganz einfach:

Application.quit

Allerdings hatte ich in meinem speziellen Fall ein Problem: Der Befehl wird schlicht ignoriert, wenn er automatisch im Kontext von Auto_Open() ausgeführt werden soll. Es klingt zwar abwegig, ein PowerPoint-AddIn bauen zu wollen, das nach dem Start von PowerPoint etwas tut und es anschließend direkt wieder beendet, aber genau das brauchte ich. Die harte Tour ist natürlich:

SendKeys "%{F4}"

Was einfach nur ein ALT+F4 zum Beenden sendet. Das kann allerdings auch mal eine andere Anwendung oder sogar Windows selbst erwischen, je nachdem, was gerade im Vordergrund läuft.

Außerdem hat Auto_Open() als Verankerung für den AddIn-Code einen weiteren, sehr heftigen Nachteil: Wenn es ausgeführt wird, hat sich PowerPoint noch nicht vollständig selbst initialisiert. Auch die leere Startpräsentation ist noch nicht vorhanden. VBA-Code, der sonst stabil funktioniert, greift häufig ins Leere und stürzt ab. Wir müsssen also Auto_Open() durch irgendwas anderes ersetzen. Zunächst benötigen wir ein normales Modul (nicht Formular oder Klasse) in dem wir Auto_Open() zur Initialisierung verwenden:

Public oPPT As New EventClass
Sub Auto_Open()
Set oPPT.oEvent = Application
End Sub

Auto_Open() tut also nichts weiter, als die Klasse EventClass instanziieren und auf die laufende PowerPoint-Instanz zu verweisen. Nun können wir erweiterte Events abragen, die nur über diesen Umweg erreichbar sind. Die Klasse müssen wir selber schreiben:

Public WithEvents oEvent As Application
'der folgende Event wird ausgelöst,
'wenn eine neue Präsentation angelegt wird
Private Sub oEvent_AfterNewPresentation(ByVal oPres As Presentation)
'hier der Code, der sonst in Auto_Open() steht
doSomething()
'da der Event nur einmal zu Beginn und dann
'nicht mehr abgefragt werden soll
'löschen wir ihn gleich wieder:
Set oPPT.oEvent = Nothing
End Sub

Der Code wird jetzt nicht mehr beim Öffnen von PowerPoint sondern beim Anlegen der ersten neuen Präsentation ausgeführt. Das stellt sicher, dass PowerPoint sich wirklich vollständig selbst initialisiert hat. Und ganz nebenbei funktioniert nun auch Application.Quit wieder, da es ja nicht mehr im Kontext von Auto_Open() sondern von oEvent_AfterNewPresentation() ausgeführt wird.