Erste Schritte mit VBA in PowerPoint 2010

Office 2010

Zusammenfassung: Führt Visual Basic for Applications (VBA) in PowerPoint 2010 für den PowerPoint Poweruser ein, der noch kein Programmierer ist. Dazu gehört ein Überblick über die VBA-Sprache, Anweisungen für den Zugriff auf VBA in PowerPoint 2010, eine detaillierte Erläuterung einer Lösung für ein realitätsnahes VBA-Programmierungsproblem in PowerPoint und Tipps zum Programmieren und Debuggen.

PowerPoint 2010 umfasst Features, mit denen Sie effiziente und ansprechende Präsentationen erstellen können. Diese Features sind leicht auf der Benutzeroberfläche auffindbar. In manchen Fällen möchten Sie jedoch vielleicht trotz der zahlreichen Features auf der PowerPoint-Standard-Benutzeroberfläche eine einfachere Möglichkeit nutzen, um eine alltägliche, wiederholende Aufgabe oder eine Aufgabe durchzuführen, die auf der Benutzeroberfläche nicht direkt berücksichtigt wurde. Glücklicherweise ist bei Office-Anwendungen wie PowerPoint Visual Basic for Applications (VBA) integriert, eine Programmiersprache, mit der Sie diese Anwendungen erweitern können.

VBA arbeitet durch das Ausführen von Makros, schrittweise in Visual Basic geschriebenen Ausführungen. Das Erlernen der Programmierung kann einschüchternd wirken, aber mit ein wenig Geduld und einigen Beispielen, wie die in diesem Artikel aufgeführten Beispielen konnten viele Benutzer feststellen, dass das Erlernen einer geringen Menge VBA-Code die Arbeit leichter gestaltet und die Möglichkeit schafft, Aufgaben in Office zu erledigen, die zuvor undenkbar waren. Nachdem Sie ein wenig VBA erlernt haben, wird es Ihnen noch leichter fallen, zusätzlichen Code zu erlernen – sodass den Möglichkeiten keine Grenzen gesetzt sind.

Der bei weitem häufigste Grund PowerPoint VBA zu verwenden, ist die Automatisierung wiederholender Aufgaben. Gehen Sie z. B. davon aus, Sie haben eine Präsentation, die viele leere Textfelder enthält, die Sie löschen möchten. Statt auf jede Folie zu wechseln, und die leeren Textfelder zu suchen, auszuwählen und zu löschen, können Sie ein PowerPoint-VBA-Makro diese Aufgabe übernehmen lassen.

Ein weiterer häufig genannter Grund für die Verwendung von PowerPoint VBA ist das Hinzufügen neuer Funktionen zu PowerPoint. Sie können beispielsweise ein VBA-Makro erstellen, dass genau in der Mitte der Präsentation ausgeführt wird, unabhängig von der Anzahl der Folien in der Präsentation. Dadurch wird eine Meldung angezeigt, in der Ihnen die für die Präsentation verbleibende Zeit angegeben wird.

Es gibt noch viele Weitere Gründe, PowerPoint VBA zu verwenden, nicht zuletzt wegen der Möglichkeit, Aufgaben durchzuführen, bei denen PowerPoint mit anderen Office-Anwendungen zusammenarbeiten soll. Sie können beispielsweise den gesamten Text aus einer Präsentation in eine CSV-Datei exportieren, die Sie in Microsoft Excel 2010 öffnen können.

Hinweis Hinweis

In einigen Office-Anwendungen können Sie VBA-Makros erstellen, indem Sie eine Makroaufzeichnung starten. Insbesondere wenn Sie mehrere Aktionen ausführen, und die Makroaufzeichnung sie erfasst, damit Sie sie wiedergeben können. PowerPoint 2010 weist keine Makroaufzeichnung auf; das Schreiben von VBA-Code ist die einzige Möglichkeit, Makros zu erstellen. (In früheren Versionen von PowerPoint aufgezeichnete oder geschriebene Makros können weiterhin mithilfe des Visual Basic-Editors in PowerPoint 2010) bearbeitet werden.

In diesem Artikel wird PowerPoint VBA anhand des Schreibens eines Makros erläutert, mit dem alle leeren Textfelder in einer Präsentation gelöscht werden.

Anwendungen mithilfe von Code Aufgaben erledigen lassen

Sie denken vielleicht, das Schreiben von Code wäre unverständlich oder schwierig, die Grundprinzipien verwenden jedoch alltägliche Gedankengänge und sind sehr leicht zu erlernen. Die Office 2010-Anwendungen werden so erstellt, dass sie sogenannte Objekte aufweisen, die Anweisungen erhalten können. Sie interagieren mit Anwendungen, indem Sie Anweisungen an verschiedene Objekte in der Anwendung senden. Diese Objekte sind viele, vielseitig und flexibel, haben jedoch ihre Grenzen. Sie können nur das ausführen, wofür sie gedacht sind, und sie führen nur das aus, wozu sie durch Sie angewiesen sind.

Das Objektmodell

Programmierungsobjekte beziehen sich systemseitig in einer Hierarchie mit der Bezeichnung Objektmodell der Anwendung aufeinander. Das Objektmodell spiegelt in etwa das wider, was Ihnen auf der Benutzeroberfläche angezeigt wird; der PowerPoint-Objektmodus enthält beispielsweise die Application-, Presentation- und Slide-Objekte und viele mehr. Das Objektmodell ist eine Konzeptzuordnung der Anwendung und den Funktionen.

Eigenschaften und Methoden

Sie können Objekte manipulieren, indem Sie die Eigenschaften festlegen und die Methoden aufrufen. Durch das Festlegen einer Eigenschaft wird die Qualität des Objekts geändert. Durch das Aufrufen einer Methode führt das Objekt eine Aktion aus. Das Slide-Objekt besitzt beispielsweise eine Copy-Methode, durch die eine Kopie der Folie in der Zwischenablage gespeichert wird, und eine Layout-Eigenschaft, die das Layout der Folie darstellt.

Auflistungen

Viele Objekte kommen im Singular und Plural vor – Präsentation und Präsentationen, Folie und Folien usw. Die Plurale werden als Auflistungen bezeichnet. Mit Auflistungsobjekten kann eine Aktion bei mehreren Elementen in der Auflistung durchgeführt werden. In diesem Artikel wird ebenfalls erläutert, wie die Slides-Auflistung zum Entfernen ungewünschter Objekte auf den einzelnen Folien in einer Präsentation verwendet werden kann.

Mit dem erlernten Wissen zum in Microsoft PowerPoint 2010 verfügbar gemachten Objektmodell möchten Sie das Aufrufen von Objektmethoden und Festlegen von Objekteigenschaften bestimmt direkt ausprobieren. Dazu müssen Sie Ihren Code an einer Stelle und auf eine Art und Weise erstellen, die Office versteht; in der Regel durch die Verwendung des Visual Basic-Editors. Obwohl es standardmäßig zum Installationsumfang gehört, wissen viele Benutzer gar nicht, dass es verfügbar ist, bis es im Menüband aktiviert wird.

Die Entwickler-Registerkarte

Alle Office 2010-Anwendungen verwenden das Menüband. Eine Registerkarte im Menüband ist die Entwickler-Registerkarte, über die Sie auf den Visual Basic-Editor und weitere Entwicklertools zugreifen können. Da Office 2010 die Entwickler-Registerkarte nicht standardmäßig anzeigt, müssen Sie sie aktivieren, indem Sie folgendermaßen vorgehen:

Aktivieren der Entwickler-Registerkarte

  1. Klicken Sie auf der Registerkarte Datei auf Optionen, um das Dialogfeld PowerPoint-Optionen zu öffnen.

  2. Klicken Sie links neben dem Dialogfeld auf Menüband anpassen.

  3. Klicken Sie links neben dem Dialogfeld auf Befehle auswählen und wählen Sie Häufig verwendete Befehle aus.

  4. Klicken Sie rechts neben dem Dialogfeld auf Menüband anpassen, dann auf Hauptregisterkarten, und aktivieren Sie anschließend das Kontrollkästchen Entwickler.

  5. Klicken Sie auf OK.

Nachdem PowerPoint die Entwickler-Registerkarte anzeigt, beachten Sie auf der Registerkarte die Positionen der Schaltflächen Visual Basic, Makros und Makrosicherheit.

Abbildung 1. Entwickler-Registerkarte in PowerPoint 2010

Registerkarte 'Entwicklertools' in PowerPoint 2010

Sicherheitsprobleme

Klicken Sie auf die Schaltfläche Makrosicherheit, um anzugeben, welche Makros und welchen Bedingungen ausgeführt werden können. Obwohl Rogue-Makrocode Ihren Computer ernsthaft beschädigen kann, können Sicherheitsbedingungen, die verhindern, dass Sie nützliche Makros ausführen, Ihre Produktivität einschränken. Makrosicherheit ist ein relativ komplexes und kompliziertes Thema, mit dem Sie sich eingehend befassen sollten, wenn Sie mit PowerPoint-Makros arbeiten.

Für die Zwecke dieses Artikels müssen Sie beachten, dass wenn die Leiste Sicherheitswarnung: Makros wurden deaktiviert zwischen dem Menüband und dem Arbeitsblatt angezeigt wird, wenn Sie eine Arbeitsmappe öffnen, die eine Makro enthält, Sie auf die Schaltfläche Inhalt aktivieren klicken können, um die Makros zu aktivieren.

Beachten Sie ebenfalls, dass Sie aus Sicherheitsgründen kein Makro im standardmäßigen PowerPoint-Präsentationsformat (.pptx) speichern können; stattdessen müssen Sie das Makro in einer Datei mit einer speziellen Dateierweiterung speichern, .pptm.

Der Visual Basic-Editor

Nachdem Sie die Entwickler-Registerkarte anzeigen, können Sie den Visual Basic-Editor öffnen, dabei handelt es sich um das integrierte Tool, dass Sie zum Schreiben und Bearbeiten von VBA-Code für PowerPoint verwenden können.

Erstellen eines neuen Makros im Visual Basic-Editor

  1. Klicken Sie auf der Entwickler-Registerkarte auf die Schaltfläche Makros.

  2. Geben Sie im angezeigten Dialogfeld Makro unter MakronameHello ein.

  3. Klicken Sie auf die Schaltfläche Erstellen, um den Visual Basic-Editor mit Angaben zu einem neuen Makro zu öffnen, das bereits eingegeben wurde.

VBA ist eine vollwertige Programmiersprache mit entsprechender Programmierumgebung. In diesem Artikel werden nur die Tools untersucht, die Sie für Ihre ersten Programmierschritte verwenden, d. h. die meisten Tools im Visual Basic-Editor gehören nicht dazu. Schließen Sie das Eigenschaften-Fenster links im Visual Basic-Editor und ignorieren Sie die beiden Dropdownlisten, die über dem Code angezeigt werden.

Abbildung 2. Visual Basic-Editor

Visual Basic-Editor

Der Visual Basic-Editor enthält folgenden Code.

Sub Hello()

End Sub

Sub bedeutet Unterroutine, die sie vorläufig als "Makro" definieren können. Beim Ausführen des Hello-Makros wird sämtlicher Code ausgeführt, der sich zwischen Sub Hello() und End Sub befindet.

Nun können Sie das Makro so bearbeiten, dass es folgendem Code ähnelt.

Sub Hello()
   MsgBox("Hello world")
End Sub

Wechseln Sie in PowerPoint zurück zur Entwickler-Registerkarte und klicken Sie dann erneut auf die Schaltfläche Makros. Wählen Sie in der angezeigten Liste das Hello-Makro und klicken Sie dann auf Ausführen, um ein kleines Meldungsfeld anzuzeigen, in dem der Text, "Hello world" angezeigt wird

Sie haben soeben benutzerdefinierten VBA-Code in PowerPoint erstellt und implementiert! Klicken Sie im Meldungsfeld auf OK , um es zu schließen und das Ausführen des Makros abzuschließen.

Wenn das Meldungsfeld nicht angezeigt wird, prüfen Sie die Makrosicherheitseinstellungen starten Sie PowerPoint neu.

Makros zugänglich machen

Sie können das Makros-Dialogfeld auch über die Ansicht-Registerkarte abrufen, wenn Sie jedoch häufig ein Makro verwenden, ist es eventuell praktischer, über eine Tastenkombination oder eine Symbolleiste für den Schnellzugriff-Schaltfläche darauf zuzugreifen.

Um in der Symbolleiste für den Schnellzugriff eine Schaltfläche für das Hello-Makro zu stellen, gehen Sie wie folgt vor:

Erstellen einer Schaltfläche für ein Makro in der Symbolleiste für den Schnellzugriff

  1. Klicken Sie auf die Datei-Registerkarte.

  2. Klicken Sie auf Optionen, um das Dialogfeld PowerPoint-Optionen zu öffnen, und klicken Sie dann auf Symbolleiste für den Schnellzugriff.

  3. Klicken Sie in der Liste Befehle auswählen auf Makros. Suchen Sie in der angezeigten Liste nach dem Text Presentation1!Hello und wählen Sie ihn aus.

  4. Klicken Sie auf die Schaltfläche Hinzufügen, um das Makro zu der Liste rechts hinzuzufügen, und klicken Sie auf die Schaltfläche Ändern…, um dem Makro ein Schaltflächensymbol zuzuweisen.

  5. Klicken Sie auf OK. Ihre neue Schaltfläche sollte in der Symbolleiste für den Schnellzugriff über der Datei-Registerkarte angezeigt werden.

Sie können nun jederzeit Ihr Makro ausführen, ohne die Entwickler-Registerkarte zu verwenden – probieren Sie es aus.

In manchen Fällen enthält eine Präsentation, an der Sie eine Zeit lang gearbeitet haben, leere Textfelder, die Sie nicht benötigen. Sie haben Sie beispielsweise hinzugefügt, weil Sie planten, sie erneut zu verwenden, dies war jedoch nicht der Fall. Oder aber Sie haben Sie aus Versehen hinzugefügt.

Um diese leeren Textfelder zu entfernen, können Sie die Präsentation durchgehen und sie alle manuell löschen, oder Sie können ein Makro schreiben, damit es das für Sie erledigt. Ein Makro kann ebenfalls leere verborgende Textfelder entfernen.

In den folgenden Abschnitten finden Sie die Vorgehensweise zum Erstellen und Implementieren dieses Makros.

Der beste Ort für den Anfang beim Erstellen eines neuen PowerPoint-Makros ist die PowerPoint-Objektmodellreferenz, die Teil der PowerPoint 2007-Entwicklerreferenz im Microsoft Developer Network (MSDN) ist. In der Objektmodellreferenz werden verfügbare Objekte, Eigenschaften und Methoden erläutert, sowie viele Anwendungsbeispiele.

Abbildung 3. PowerPoint-Objektmodellreferenz

PowerPoint-Objektmodellreferenz

Diese Referenzmaterialien werden für PowerPoint 2010 aktualisiert, wenn es öffentlich freigegeben ist, die PowerPoint 2007-Entwicklerreferenz eignet sich jedoch für einen Großteil der PowerPoint 2010-Zwecke. Beachten Sie außerdem eine weitere wichtige Ressource – die Visual Basic for Applications-Sprachreferenz – aus der PowerPoint 2007-Entwicklerreferenz kann man darauf zugreifen.

Um leere Textfelder aus Ihrer Präsentation zu entfernen, müssen Sie zunächst herausfinden, ob es ein TextBox-Objekt in Dem PowerPoint-Objektmodell gibt. Klicken Sie auf die PowerPoint-Objektmodelreferenz, um eine umfangreiche Liste aller Objekte in PowerPoint anzuzeigen.

Es gibt kein TextBox-Objekt, jedoch ein TextFrame-Objekt. Im TextFrame-Thema ist angegeben, dass das TextFrame-Objekt "den Textrahmen in einem Shape-Objekt repräsentiert", das Shape-Objekt ist also eventuell der beste Startort.

Wenn Sie im TextFrame-Thema weiter nach unten scrollen, ist dort angegeben, dass Sie "die HasText-Eigenschaft verwenden können, um zu ermitteln, ob der Textrahmen Text enthält", das könnten Sie also gut einsetzen, um leere zu löschende Textfelder zu suchen. Sehen Sie sich an, was Sie noch über Shapes herausfinden können.

Klicken Sie auf das Shape Object-Thema und dann auf das Unterthema Shape Object Members. Suchen Sie nach Hinweisen, dass Sie eine Shape als Textfeld verwenden können. Methoden sind Elemente, die mit einer Shape ausgeführt werden können, Sie möchten jedoch Dinge suchen, die eine Shape sein kann, scrollen Sie also nach unten bis Properties.

Beachten Sie, dass ein Shape-Objekt eine Property mit der Bezeichnung Type besitzt; klicken Sie auf den Type-Link, um eine Liste der Konstanten anzuzeigen, die die verschiedenen Shapes darstellen. Unter anderem umfasst die Liste msoTextBox. (Das mso-Präfix gibt an, dass es sich hierbei um Microsoft Office-Typen, in in jeder Office-Anwendung verfügbar sind, nicht nur in PowerPoint.)

Scrollen Sie nach unten zum Shape.Type Property-Thema, dort finden Sie ein Beispiel zur Verwendung der Property.

For Each sld In ActivePresentation.Slides
    For Each sh In sld.Shapes
        If sh.Type = msoLinkedOLEObject Then
            If sh.OLEFormat.ProgID = "Excel.Sheet" Then
                sh.LinkFormat.AutoUpdate = ppUpdateOptionManual
            End If
        End If
    Next
Next

In dem Thema Shape.Type ist angegeben, dass "In diesem Beispiel alle Formen auf allen Folien der aktiven Präsentation durchlaufen werden und alle verknüpften Microsoft Office Excel-Arbeitsblätter sind so festlegt, dass sie manuell aktualisiert werden".

In diesem Abschnitt wird erläutert, wie der Code diese Aufgabe durchführt.

Wenn…dann

Sehen Sie sich die folgende Codezeile näher an, in der Type verwendet wird.

        If sh.Type = msoLinkedOLEObject Then

Einige Zeilen weiter unten auf der gleichen Eben befindet sich folgender Code.

        End If

Hierbei handelt es sich um ein Beispiel einer If…Then-Anweisung, eines der wichtigsten Programmierungskonstrukte, und glücklicherweise gleichermaßen einfach verständlich. Die If…Then-Anweisung weist PowerPoint an, das auszuführen, was zwischen den Zeilen If und End If aufgeführt ist, jedoch nur, wenn die Bedingung in der If-Zeile true ist. In dem Beispiel enthält die Bedingung folgenden Code.

        sh.Type = msoLinkedOLEObject

Unter Verwendung dieses Codes als Richtlinie sieht die Bedingung für das Makro zum Löschen der Textfelder aus der Präsentation wahrscheinlich in etwa folgendermaßen aus.

        sh.Type = msoTextBox

Weitere Informationen zur If…Then-Anweisung finden Sie im Themenabschnitt "Visual Basic-Konzeptthemen" der VBA-Sprachreferenz. (Der vollständige Namen lautet If…Then…Else-Anweisung; Else ist eine optionale Komponente, die hier nicht erforderlich ist).

Für jedes…Weiter

Der Beispielcode veranschaulicht außerdem ein allgemeines Muster zur VBA-Programmierung in PowerPoint, vor allem wenn Sie mit Shapes arbeiten. Insbesondere "durchläuft es alle Formen auf allen Folien in der aktiven Präsentation". Durchlaufen bedeutet eine Aktion zu wiederholen, in diesem Fall handelt es sich um eine For Each…Next-Schleife.

For Each sld In ActivePresentation.Slides
    For Each sh In sld.Shapes
    Next
Next

Die For Each…Next-Schleife ist ein weiteres Konstrukt, das wichtig für das Programmieren und leicht zu verstehen ist. Beide Schliefen im Code beginnen mit den Worten 'Für jeden' und enden mit dem Wort 'Weiter'. Beachten Sie, dass eine der For Each…Next-Schleifen in der anderen befindet, oder verschachtelt, im Programmier-Jargon. Im folgenden Code untersucht die äußere Schleife die einzelnen Folien der Präsentation.

For Each sld In ActivePresentation.Slides

Hierbei ist sld eine Variable; d. h., ein Platzhalter für die jeweilige Folie, die die Schleife untersucht. ActivePresentation ist ein Objekt, das die aktive PowerPoint-Präsentation darstellt, und Slides ist ein Auflistungsobjekt, das hier alle Folien in der aktiven Präsentation darstellt.

Die innere Schleife untersucht anschließend mit folgendem Code alle Formen auf der Folie.

    For Each sh In sld.Shapes

sh ist eine weitere Variable, die dazugehörige Rolle dient jedoch als Platzhalter für die Form, die die Schleife prüft. Die sld-Variable ist die gleiche wie zuvor; sie stellt die aktuelle Folie dar, und Shapes ist ein weiteres Auflistungsobjekt, dass alle Shapes auf der aktuellen Folie darstellt.

Sie finden eventuell nicht immer Beispielcode, der dem ähnelt, was sie machen möchten, oftmals ist das jedoch der Fall, und am ehesten finden Sie in der Objektmodellreferenz ein Beispiel zu Ihrem Vorhaben. Verwenden Sie die Objektmodellreferenz, um herauszufinden, welche Dinge aufgerufen werden und wie sie verwendet werden. Wenn Sie (z. B. die Type-Eigenschaft) auf eine bestimmte Weise verwenden möchten (z. B. zum Prüfen des Type jeder Shape auf jeder Slide), ist die Wahrscheinlichkeit groß, dass jemand anders das schon vor Ihnen machen wollte, und in der Objektmodellreferenz dokumentiert wurde.

Starten Sie PowerPoint und speichern Sie die neue Präsentation als PowerPoint-Präsentation mit Makros (*.pptm). Erstellen Sie dann ein neues Makro mit der Bezeichnung ClutterRemover und geben Sie folgenden Code ein.

For Each SlideToCheck In ActivePresentation.Slides
    For Each ShapeToCheck In SlideToCheck.Shapes
        ShapeToCheck.Delete
    Next
Next

Beachten Sie bei der Eingabe des Punkts nach ActivePresentation, dass der Visual Basic-Editor ein Popup anzeigt, dass alle Eigenschaften und Methoden auflistet, die für das ActivePresentation-Objekt verfügbar sind. Das ist ein Beispiel für IntelliSense-Technologie; d. h. der Visual Basic-Editor auf das, was er durch Ihre Eingabe erkennt und bietet eine Liste entsprechender Optionen an. Sie können eine Option aus der Liste auswählen oder einfach mit der Eingabe fortfahren.

Sehen Sie sich den gerade eingegebenen Code ein wenig genauer an. Sie haben ähnliche verschachtelte Schleifen wie in dem Beispiel eingerichtet, statt sld und sh haben Sie nun jedoch längere Variablennamen, die Ihnen dabei helfen, sich daran zu erinnern, welchen Zweck Sie mit dem Code verfolgen. Einige Programmierer bevorzugen kurze Variablennamen und andere wiederum kürzere, präzisere Namen, mit denen Sie leicht sehen können, was die Variable darstellt. Beim zuletzt genannte Ansatz ist der Code leichter verständlich und allgemein praktischer zum Erlernen von Code.

In den Schleifen besitzt das Makro bis jetzt folgenden Code.

        ShapeToCheck.Delete

Warum Delete, statt .Remove oder .GetRidOf? Da das Entfernen eines Textfelds aus einem Shape-Objekt eine Aktion ist, schlagen Sie das Shape-Objekt in der Objektmodellreferenz und unter den Methoden suchen. Cut und Delete sind zwei Möglichkeiten und Sie die gelöschten Shapes nicht in der Zwischenablage ablegen müssen, ist Delete die naheliegendste Wahl.

Fügen Sie die If…Then-Anweisung noch nicht hinzu. Prüfen Sie zunächst, dass Sie wissen, wie Formen gelöscht werden. Beim Programmieren ist es besser, nicht zu versuchen, zu viele Dinge gleichzeitig vorzunehmen. Sie müssen die verschachtelten Schleifen bereits testen; wenn Sie außerdem versuchen, die If-Anweisung funktionieren zu lassen, erhöht sich das Risiko, einen Fehler zu generieren, den Sie nicht nachverfolgen können. Die ShapeToCheck.Delete-Zeile ist eine einfache Möglichkeit, mit den Schleifen etwas auszuführen, das Sie anzeigen und somit testen können. Nachdem Sie die Funktion der Schleifen überprüft haben, können Sie eine If-Bedingung hinzufügen, sodass nur leere Textfelder gelöscht werden.

Klicken Sie auf die Schaltfläche Speichern und schließen Sie den Visual Basic-Editor. Löschen Sie die Standard-Titelfolie in PowerPoint und fügen Sie zwei leere Folien hinzu. Platzieren Sie vier Formen auf jeder Folie. (Da Sie den Typ noch nicht überprüfen, sind alle Formen geeignet; Smileys, Blitze, ganz nach Ihrem Wunsch). Führen Sie anschließend das ClutterRemover-Makro aus.

Ein Fehler

Was ist vorgefallen? Es befinden sich immer noch zwei Formen auf jeder Folie! Versuchen Sie es erneut und Ihnen wird auf jeder Folie eine verbleibende Form angezeigt, und versuchen Sie erneut, sie alle endgültig zu löschen. Was geschieht?

Das Problem besteht darin, dass die Auflistung jedes Mal neu nummeriert wird, wenn Sie ein Element löschen. Stellen Sie sich eine Situation vor, in der Sie eine Auflistung von Elementen durchlaufen und das erste löschen. Die Schleife startet bei Element 1 und Sie löschen es. Das ursprüngliche Element 2 ist nun Element 1, das ursprüngliche Element 3 ist nun Element 2 usw. Wenn die Schleife beim neuen Element 2 ankommt, hat es tatsächlich das ursprüngliche Element 2 übersprungen.

Bei dem Beispielcode aus der Objektmodellreferenz besteht dieses Problem nicht, da es die Elemente nicht löscht, die von den Schleifen untersucht werden. In diesem Problem wir ein wichtiger Punkt zu Beispielcode veranschaulicht – es ist kein Problem, Code zu finden, der Ihren Anforderungen ähnelt , erwarten Sie jedoch nicht, dass es sich dabei um genau das handelt, was sie brauchen. Führen Sie Tests durch und bereiten Sie sich darauf vor, Änderungen vorzunehmen, die Sie nicht vorhersehen konnten.

Eine Problembehebung

Sie können verhindern, dass der Code Elemente überspringt, indem Sie abwärts statt aufwärts zählen. Mal angenommen Sie löschen Element 3 von vier Elementen. Obwohl Element 4 dennoch neu zu Element 3 nummeriert wird, ist das in Ordnung, da die Schleife beim Abwärtszählen mit Element 2 fortfährt, und nicht mit Element 4.

Um eine abwärts zählende Schleife zu erstellen, benötigen Sie ein leicht abgewandeltes Programmierungskonstrukt mit der Bezeichnung "For…Next"-Schleife. Jedes Element einer Auflistung besitzt eine Nummer, die als Index bezeichnet wird. Dabei untersucht die "Each…Next"-Schleife jedes Element einer Auflistung und VBA verarbeitet die Indizes, die "For…Next"-Schleife gibt explizit die Indizes an. Diese verbesserte Kontrolle ist genau das, was Sie zum Beheben des Problems benötigen.

Öffnen Sie das ClutterRemover-Makro im Visual Basic-Editor und ändern Sie den Code folgendermaßen.

For Each SlideToCheck In ActivePresentation.Slides
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
        SlideToCheck.Shapes(ShapeIndex).Delete
    Next
Next

Beachten Sie, dass die zweite Zeile den folgenden "For Each"-Code nicht mehr enthält.

    For Each ShapeToCheck In SlideToCheck.Shapes

Stattdessen verwendet er folgenden "For…Next"-Code.

    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1

Der neue Code gibt explizit an, wie die Schleife die Elemente der Shapes-Auflistung durchläuft. ShapeIndex ist eine Variable, in der der aktuelle Index enthalten ist; d. h. die Anzahl der Shape, die die Schleife aktuell untersucht. SlideToCheck.Shapes.Count gibt die Gesamtanzahl der Elemente an, die die Shapes-Auflistung besitzt; die Schleife zählt ab dieser Nummer abwärts bis zur Nummer 1. "To 1" weist VBA an, bis zum ersten Element der Auflistung hinunter zu zählen, und "Step -1" weist ihn an, abwärts statt aufwärts zu zählen.

Die neue ShapeIndex-Variable nimmt den Platz der vorherigen ShapeToCheck-Variable ein, um auf die Shapes in der Schleife zu verweisen. Das bedeutet, folgender Code geht verloren.

        ShapeToCheck.Delete

Er wird durch die dritte Zeile des neuen Codes ersetzt.

        SlideToCheck.Shapes(ShapeIndex).Delete

Der Code verwendet die ShapeIndex-Variable zur Indizierung der SlideToCheck.Shapes-Auflistung, und sie verwendet wie zuvor die Delete-Methode.

Der Code in der äußeren "For Each"-Schleife ist identisch, da Sie keine Folien löschen. Würden Sie Folien löschen, könnten Sie eine "For"-Schleife verwenden, die in der äußeren Schleife ebenfalls abwärts zählt.

Nehmen Sie erneut den Testaufbau vor und führen Sie die neue Version des Makros aus. Dieses Mal sollte das Makro alle Shapes beim ersten Versuch löschen.

Bewährte Programmierungsmethoden

Zwei Dinge sind in VBA nicht unbedingt erforderlich, werden jedoch dringend empfohlen, dabei handelt es sich um Kommentare und Variablen-Deklarationen.

Bei mit Apostroph beginnenden Codezeilen handelt es sich um einen Kommentar, sie haben keine Auswirkungen auf das Makro. Im Folgenden finden Sie die Hauptverwendungszwecke für Kommentare:

  1. Um den Code leicht verständlich zu machen, nicht nur für Sie, sondern auch für Personen, die den Code zu einem späteren Zeitpunkt eventuell ändern müssen.

  2. Um eine Codezeile temporär zu deaktivieren (bezeichnet als auskommentieren).

Hier finden Sie das Makro bis jetzt mit einigen hinzugefügten Kommentaren.

' Visit each slide
For Each SlideToCheck In ActivePresentation.Slides
    ' On each slide, count down through the shapes
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
        ' Delete all shapes
        SlideToCheck.Shapes(ShapeIndex).Delete
    Next
Next

Darüber hinaus ist es eine gute Idee Variablen-Deklarationen am Anfang des Makros hinzuzufügen. Eine Variablen-Deklaration gibt an, welche Art von Entität die Variable darstellt. Variablen-Deklarationen sind in VBA nicht erforderlich, durch Variablen-Deklarationen ist es jedoch einfacher, Variablen nachzuverfolgen und Fehler in Ihrem Code zu ermitteln.

Dim SlideToCheck As Slide
Dim ShapeIndex As Integer

Dim ist eine Abkürzung für "Dimension", Slide und Integer sind dabei die Datentypen, die diese bestimmten Variablen darstellen. Beachten Sie, dass der Visual Basic-Editor nach Ihrer Eingabe von As ein Popup anzeigt, das alle verfügbaren Datentypen auflistet. Das ist ein weiteres Beispiel der IntelliSense-Technologie; d. h. d. h. der Visual Basic-Editor auf das, was er durch Ihre Eingabe erkennt und bietet eine Liste entsprechender Optionen an. Sie können eine Option aus der Liste auswählen oder einfach mit der Eingabe fortfahren. Beachten Sie außerdem, dass IntelliSense beim Deklarieren einer Variable mit einem Objekttyp (z. B. Slide) eine entsprechende Liste der mit dem Objekt verknüpften Eigenschaften und Methoden anzeigt, wenn Sie die Objektvariable später im Makro verwenden.

Konstruieren der If-Bedingung

Um das ClutterRemover-Makro zu vervollständigen, muss als Letztes ermittelt werden, wie nur leere Textfelder gelöscht werden, statt alle Shapes zu löschen. Es gibt zwei Bedingungen, die eine zum Löschen Shape erfüllen muss: es muss sich dabei um ein Textfeld handeln und es muss leer sein.

Wie weiter oben in diesem Artikel beschrieben, können Sie die .Type-Eigenschaft verwenden, um zu ermitteln, ob Shape ein Textfeld ist. Durch diese Informationen erhalten Sie folgenden Code.

SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox

Zu der gleichen Diskussion gehört die Feststellung, dass Sie die .HasText-Eigenschaft des TextFrame-Objekts verwenden könne, um sie auf Text zu prüfen.

SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText

Da die If-Bedingung nur erfüllt werden soll, wenn der Textrahmender Shapekeinen Text enthält, fügen Sie zum Code das Not-Schlüsselwort hinzu.

Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText

Kombinieren Sie jetzt die beiden Bedingungen in einer, indem Sie das And-Schlüsselwort verwenden. (Weitere Informationen zu Not, And und anderen logischen Operatoren finden Sie in der VBA-Sprachreferenz).

SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText

Durch das Unterstrichzeichen wird eine logische Codezeile über mehr als eine physikalische Zeile im Visual Basic-Editor erweitert.

Fügen Sie zuletzt ein If zum Anfang der logischen Zeile hinzu, ein Then am Ende und einen Kommentar zur Erläuterung des Codes.

' If the shape IS a text box and DOES NOT have text
If SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText Then

Zusammenfassung

Das fertige Makro sollte folgendem Code ähneln.

Dim SlideToCheck As Slide
Dim ShapeIndex As Integer
' Visit each slide
For Each SlideToCheck In ActivePresentation.Slides
    ' On each slide, count down through the shapes
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
    ' If the shape IS a text box and DOES NOT have text
    If SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
    Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText Then
        ' Delete the shape
        SlideToCheck.Shapes(ShapeIndex).Delete
    End If
    Next
Next

Löschen Sie alle Folien aus Ihrer Präsentation und fügen Sie dann eine Titelfolie sowie zwei leere Folien ein. Fügen Sie auf den beiden leeren Folien jeweils vier Textfelder ein; versehen Sie die Textfelder mit sichtbaren Rahmen oder Füllungen. Geben Sie dann in ein paar der Textfelder etwas ein, aber nicht in jedes. Führen Sie das Makro aus. Die leeren Textfelder sollten ausgeblendet werden und die befüllten sowie die leeren Platzhalterfelder auf der Titelfolie angezeigt bleiben.

Das Makro führt die Aufgabe für eine beliebige Anzahl von Textfeldern und Folien aus.

Anhand der in diesem Artikel aufgeführten Informationen zusammen mit einiger Experimentier- und Qualitätsprüfungszeit für die Durchsicht der VBA-Sprachreferenz haben Sie ausreichend Informationen, um nahezu jede Aufgabe auszuführen, die Sie dazu motiviert hat, VBA zu lernen. Großartig! Als Nächstes könnten Sie den Bereich auf ein generelleres Verständnis von VBA ausweiten.

Eine Möglichkeit, mehr über VBA zu lernen, ist das Durchsehen von Arbeitscode. Zusätzlich zu den in der Objektmodellreferenz und der VBA-Sprachreferenz genannten Beispielen finden Sie umfangreichen PowerPoint VBA-Code aus verschiedenen Onlinequellen, darunter Artikel im MSDN, Websites, die von Microsoft Most Valuable Professionals (MVPs) unterhalten werden, und auf PowerPoint sind sowie andere Ressourcen, die über eine schnelle Suche im Web auffindbar sind.

Der Code in diesen Ressourcen kann Ihnen dabei helfen, Ihre aktuellen Codierungsprobleme zu lösen und Ihnen Ideen für Projekte an die Hand zu geben, an die Sie bisher vielleicht noch gar nicht gedacht haben.

Wenn Sie VBA systematischer erlernen möchten, gibt es einige ausgezeichnete Bücher zu VBA, und viele gute Bewertungen zu diesen Büchern im Web, die Sie bei der Kaufentscheidung des passenden Buches für Ihren Lernstil unterstützen können.

Anzeigen: