CLS: Tipps & Tricks: PowerPoint-VBA



Tipps & Tricks: PowerPoint-VBA

Auf dieser Seite finden Sie 4 Tipps & Tricks für PowerPoint-VBA. Soweit keine Einschränkungen dazu genannt werden, gelten diese Tipps & Tricks für alle Versionen von PowerPoint.

Wenn in den folgenden Erläuterungen Texte wie MsgBox formatiert sind, handelt es sich um konkret einzugebende Inhalte wie VBA-Code oder die Eingabe von Werten. Menüs wie Datei Speichern sind wie hier zu sehen formatiert. Schaltflächen oder Registerkarten auf Dialogen werden wie Menüs behandelt.

Alle Tipps sind nach bestem Wissen geprüft, aber selbstverständlich ohne Gewähr. Sollten Sie doch einen Fehler darin entdecken, würden wir uns freuen, wenn Sie uns per eMail Bescheid sagen.

Um herauszufinden, auf welcher Folie sich Ihre Präsentation gerade befindet, braucht es einen kleinen Umweg über die Ansicht. Solange nur eine Präsentation läuft, können Sie davon ausgehen, dass es innerhalb der Presentations-Auflistung die erste ist, deswegen ist es im folgenden Code so eingesetzt:

Function DieseFolie() As Slide
On Error GoTo Mist
 
Set DieseFolie = SlideShowWindows(1).View.Slide
Exit Function

Mist:
MsgBox "Fehler Nr. " & Err.Number & ": " & Err.Description
End Function

Das wurde diesmal als Funktion mit der Folie als Rückgabewert geschrieben, so dass Sie in Ihrem Code einfach darauf Bezug nehmen können. Rufen Sie diese in einer normalen Prozedur (hier nun ohne Fehlerbehandlung) so auf:

Sub WelcheFolienNr()
MsgBox DieseFolie.SlideNumber
End Sub

Damit können Sie auf alle Eigenschaften der Folie zugreifen.

Es gibt noch eine Besonderheit beim VBA-Aufruf aus einer Präsentation heraus, die sich grundsätzlich von der anderer Office-Aufrufe unterscheidet: nicht nur die Anzeige eines Fehlers im Debug-Modus ist unmöglich, sondern es findet überhaupt keine Fehlermeldung statt! Selbst Kompilierfehler werden übergangen und in allen solchen Fällen ohne weitere Rückmeldung gar kein Code ausgeführt!

Das ist natürlich beim Programmieren mehr als übel, denn das macht die Fehlersuche praktisch unmöglich. Sie müssen also in jeder Prozedur fast zwingend eine eigene Fehlerbehandlung einbauen (und vorher mit Debuggen Kompilieren von VBA-Project überprüfen):

Sub KlickMichFehlersicher(shpObject As Shape)
On Error GoTo Mist
 
With shpObject
MsgBox "Ich bin '" & .Name & "' mit Width=" & _
.Width & " und Height=" & .Height
End With
Exit Sub

Mist:
MsgBox "Fehler Nr. " & Err.Number & ": " & Err.Description
End Sub

Mithilfe der in "Präsentation: aktuelle Folie ermitteln" gezeigten Funktion für die aktive Folie lässt sich auch der jeweilige Folientitel anzeigen. Sie müssen aber auch damit rechnen, dass es gar keinen gibt:

Sub WelcherFolienTitel()
With DieseFolie.Shapes.Placeholders
If .Count = 0 Then
MsgBox "Hier gibt es kein Titel-Objekt!", vbCritical
Else
MsgBox "Der Titel ist: '" & .Item(1).TextFrame.TextRange.Text & "'"
End If
End With
End Sub

Die Prozedur nutzt aus, dass der Titel in der PlaceHolders-Aufzählung enthalten ist, falls darin überhaupt ein Objekt ist. Auch mit mehreren Platzhaltern aus einer Master-Folie ist der Titel immer der erste.

Das schwierigste Problem bei der Programmierung in einer PowerPoint-Präsentation (also nicht während des Entwurfs!) ist die Erkennung des markierten Objekts. Die Notfall-Technik heißt oft: für zehn Rechtecke, deren Makro-Aktion beispielsweise das angeklickte Rechteck rot färben soll, werden zehn Prozeduren geschrieben, in denen das jeweilige Rechteck hart codiert ist.

Dabei ist es so unglaublich einfach, das auslösende Objekt per VBA zu ermitteln, dass daran vor allem ärgerlich ist, wie miserabel die Technik dokumentiert ist (und wie sehr sich das mal wieder von Screen.ActiveControl in Access oder von CommandBars.ActionControl in Office allgemein unterscheidet!).

Wenn Sie für ein markiertes Objekt im Entwurf per Rechtsklick Aktionseinstellungen wählen und dort als Makro ausführen den Namen Ihrer bereits vorhandenen Prozedur (hier also KlickMich) angeben, wird diese beim Aufruf automatisch das entsprechende Objekt als Parameter erhalten. Sie müssen als erstes Argument lediglich eine Shape-Variable erwarten:

Sub KlickMich(shpObject As Shape)
With shpObject
MsgBox "Ich bin '" & .Name & "' mit Width=" & _
.Width & " und Height=" & .Height
End With
End Sub

Über den shpObject-Parameter (der einen beliebigen Namen haben darf) können Sie flexibel das jeweils angeklickte Objekt ansprechen, ohne dieses konkret im Code nennen zu müssen.