PowerPoint: Texte automatisiert übersetzen

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Neulich war es mal wieder so weit: Eine PowerPoint-Präsentation musste her. Und das auch noch auf Englisch. Okay, das Schul-Englisch ist zum Verstehen und schriftliche Kommunikation ausreichend, aber eine PowerPoint-Präsention für englischsprachiges Fachpublikum sollte schon annährend perfekt sein. Wozu gibt es Übersetzungsdienste? Also habe ich meine Texte auf Deutsch zurechtgelegt und diese von der KI übersetzen lassen. Dann habe ich alles in die PowerPoint-Präsentation eingefügt und noch die Animationen hinzugefügt, damit beispielsweise Stichpunkte Schritt für Schritt eingeblendet werden können. All das hat so gut geklappt, dass ich die Präsentation anschließend auch noch für ein Video aufbereiten wollte – diesmal jedoch auf Deutsch. Also habe ich erstmal eine komplette Seite kopiert, übersetzen lassen und wieder zurückgeschrieben. Das habe ich für einige Folien gemacht und dann schnell festgestellt, dass so alle Animationen verloren gehen. Der nächste Ansatz dann: Absatz für Absatz in die Zwischenablage, übersetzen lassen, wieder zurückschreiben. So blieben die Animationen erhalten, aber es war zu viel Handarbeit. Wozu beherrsche ich – im Gegensatz zu Englisch – eigentlich perfekt VBA? Also habe ich mich an die Programmierung der Übersetzung der enthaltenen Texte begeben. Das Ergebnis siehst Du in diesem Artikel!

PowerPoint ist in diesem Magazin bisher noch gar nicht vorgekommen – höchstens als Randnotiz in Zusammenhang mit der Office-Programmierung. In diesem Artikel wollen wir jedoch direkt einmal eine praktische Lösung liefern.

Ausgangspunkt ist ein Dokument mit Folien wie der aus Bild 1. Wir haben hier verschiedene Absätze mit englischem Text, die wir gern übersetzen würden. Dabei gibt es verschiedene Vorgehensweisen:

Ein zu übersetzendes PowerPoint-Dokument

Bild 1: Ein zu übersetzendes PowerPoint-Dokument

  • Die erste ist, einfach manuell in das Dokument zu gehen und die Texte Wort für Wort zu übersetzen. Das ist recht viel Arbeit und kostet entsprechend Zeit.
  • Die zweite ist, die Texte seitenweise zu kopieren und von der KI übersetzen zu lassen. Wenn man die übersetzte Seite dann zurückkopiert, verliert man jedoch eventuell für einzelne Absätze festgelegte Animationen.
  • Die dritte ist, sich einmal im Ribbon von PowerPoint umzuschauen und festzustellen, dass es dort einen Eintrag namens Übersetzen gibt. Markieren wir damit die vollständige Seite, zeigt dieser wie in Bild 2 die englische und die ins Deutsche übersetzte Version des Textes an. Wenn wir hier allerdings auf Einfügen klicken, stellen wir fest, dass auch hier einfach der ganze Text übersetzt und wieder zurückgeschrieben wird – ohne Berücksichtigung der Animationen.
  • Der eingebaute Übersetzter

    Bild 2: Der eingebaute Übersetzter

  • Die vierte Stufe wäre, die Texte absatzweise zu markieren und den Rest den eingebauten Übersetzer erledigen zu lassen. Auf diese Weise habe ich zuvor mit der externen KI gearbeitet, aber auch dabei sind Fehler passiert: Wenn man den Zeilenumbruch mit kopiert und die Übersetzung für den vollständigen Absatz einfügt, gehen wiederum die Animationen verloren. Man muss also genau prüfen, ob man das Zeilenumbruchzeichen nicht mit kopiert. Wie kann man das verhindern? Indem man darauf achtet, dass die Markierung sich nur genau bis zum letzten sichtbaren Zeichen des Absatzes erstreckt. Wenn der Zeilenumbruch ebenfalls markiert ist, enthält die Markierung noch einen kleinen Bereich hinter dem letzten Zeichen. Das passiert beispielsweise, wenn man den Absatz durch einen dreifachen Mausklick selektiert. Auch diese Variante kostet immer noch recht viel Zeit (siehe Bild 3).
  • Texte absatzweises übersetzen

    Bild 3: Texte absatzweises übersetzen

  • Die fünfte und nachfolgend vorgestellte Variante ist, alle Textabschnitte der PowerPoint-Präsentation automatisiert zu durchlaufen, die Texte zu übersetzen und diese wieder zurückzuschreiben, ohne dass Animationen verloren gehen.

Diesen Ansatz schauen wir und nun an. Dazu benötigen wir ein paar Grundlagen zur PowerPoint-Programmierung und werfen einen Blick auf das Objektmodell dieser Anwendung.

Das Objektmodell von PowerPoint

Wir werden uns nicht das vollständige Objektmodell ansehen, sondern nur die für uns relevanten Abschnitte. Bevor wir damit starten, legen wir ein neues Standardmodul im VBA-Editor von PowerPoint an, den wir mit der Tastenkombination Alt + F11 öffnen.

Hier stellen wir fest, dass es keine Standardklassen oder -module gibt, die bereits beim Anlegen eines PowerPoint-Dokuments vorhanden sind – so, wie es beispielsweise bei Excel oder Word der Fall ist. Also können wir mit einem frischen, leeren VBA-Projekt starten.

PowerPoint referenzieren

Das Application-Objekt ist das oberste Element im Objektmodell von PowerPoint. Wir deklarieren es mit der folgenden Zeile:

Dim objPowerPoint As PowerPoint.Application

Je nachdem, ob wir von einem Modul innerhalb des PowerPoint-Dokuments auf das Application-Objekt zugreifen oder von außen, ändert sich die Referenzierung.

Für unser Beispiel reicht es erst einmal, wenn wir wie folgt darauf zugreifen:

Set objPowerPoint = Application

PowerPoint-Präsentation referenzieren

Damit haben wir bereits Zugriff auf die Anwendung. Nun wollen wir auch noch das aktuell angezeigte Dokument referenzieren. Dazu nutzen wir wie nachfolgend gezeigt eine Objektvariable des Typs PowerPoint.Presentation:

Dim objPresentation As PowerPoint.Presentation

Die aktuell geöffnete Präsentation erhalten wir mit der Funktion ActivePresentation:

Set objPresentation = objPowerPoint.ActivePresentation

Slides durchlaufen

Eine PowerPoint-Präsentation besteht zuerst einmal aus den Folien. Diese können wir mit einer Variablen des Typs Slide referenzieren:

Dim objSlide As PowerPoint.Slide

Auf die einzelnen Slides greifen wir zum Beispiel über den Index zu. Dieser ist praktischerweise 1-basiert, sodass wir die Slides entsprechend der Nummer der Slide-Übersicht am linken Rand des PowerPoint-Fensters ansprechen können. Mit der Count-Methode können wir die Anzahl der Folien ermitteln:

Debug.Print objPresentation.Slides.Count

Wir wollen diese aber ohnehin nacheinander durchlaufen, sodass uns eine For Each-Schleife dienen würde. Hier geben wir zuerst einmal den Wert der Eigenschaft SlideNumber aus:

For Each objSlide in objPresentation.Slides
     Debug.Print objSlide.SlideNumber
Next objSlide

Shapes durchlaufen

Unseren Texten noch ein wenig näher kommen wir mit der Shapes-Auflistung. Shapes sind alle Elemente, die wir über die Benutzeroberfläche direkt anklicken können.

Diese werden auch im Taskpane names Auswahl angezeigt (siehe Bild 4). Diesen blendest Du am einfachsten ein, wenn Du oben in der Suche die Zeichenfolge Pane eingibst und dann auf Auswahlbereich anzeigen klickst.

Auflistung der Shape-Elemente in der Benutzeroberfläche

Bild 4: Auflistung der Shape-Elemente in der Benutzeroberfläche

Um mit den Shapes zu arbeiten, deklarieren wir eine Variable des Typs Shape:

Dim objShape As PowerPoint.Shape

Diese Elemente können wir für jedes Slide-Objekt ebenfalls in einer For Each-Schleife durchlaufen. In diesem Fall wollen wir einfach nur den Namen eines jeden Shape-Elements ausgeben:

For Each objShape In objSlide.Shapes
     Debug.Print objShape.Name
Next objShape

Die Shape-Elemente können verschiedene untergeordnete Elemente enthalten beziehungsweise verschiedenen Typs sein.

Den Typ finden wir mit der Eigenschaft Type heraus. In der folgenden Schleife geben wir den Namen und den Typ der Shapes eines Slides im Direktbereich des VBA-Editors aus:

For Each objShape In objSlide.Shapes
     Debug.Print objShape.Name, "Type: " & objShape.Type
Next objShape

Für die erste Seite unseres Beispiels erhalten wir die folgende Ausgabe:

Title 1       Type: 14
Content Placeholder 2       Type: 14
Picture 3     Type: 13
Picture 8     Type: 13

Zusammen mit den übrigen Folien finden wir die Type-Werte 1, 13, 14 und 17 vor. Im Objektkatalog (zu öffnen mit F2) finden wir heraus, was diese Werte bedeuten. Dazu suchen wir zunächst nach dem Shape-Element und dann nach der Type-Eigenschaft (siehe Bild 5).

Werte für die Shape-Typen

Bild 5: Werte für die Shape-Typen

Hier finden wir für die von uns verwendeten Objekte die folgenden Typen:

  • 1: msoAutoShape
  • 13: msoPicture
  • 14: msoPlaceholder
  • 17: msoTextBox

Wir wollen uns nur um die Shape-Elemente mit Text kümmern. Diese finden wir allerdings nicht zuverlässig über den Type-Wert heraus, denn es gibt sowohl Elemente des Typs Placeholder als auch TextBox mit Texten.

Es gibt jedoch noch eine weitere für uns nutzbare Eigenschaft namens HasTextFrame. Hat diese den Wert -1 beziehungsweise True, finden wir dort Text vor.

Textinhalte mit dem TextFrame-Element markieren

Um dem Zugriff auf die Texte noch etwas näher zu kommen, können wir das TextFrame-Element nutzen. Dieses deklarieren wir wie folgt:

Dim objTextFrame As PowerPoint.TextFrame

Danach können wir über die Eigenschaft TextFrame des Shape-Objekts auf dieses Objekt zugreifen:

If objShape.HasTextFrame Then
     Set objTextFrame = objShape.TextFrame
End If

Befindet sich Text im TextFrame?

Allerdings kann es auch Elemente geben, die zwar für Text ausgelegt sind, aber keine Texte enthalten. Doch es gibt eine Eigenschaft für diesen Fall, nämlich HasText.

Damit kommen wir den Texten noch ein wenig näher. Dann nämlich können wir das im TextFrame-Element enthaltene TextRange-Element referenzieren, das wir zunächst deklarieren:

Dim objTextRange As PowerPoint.TextRange

Diese füllen wir wie folgt:

If objTextFrame.HasText Then
     Set objTextRange = objTextFrame.TextRange
End If

Das TextRange-Objekt enthält den kompletten Text in diesem TextFrame-Element.

Einzelne Absätze im TextRange finden

In Word beispielsweise würden wir nun ein Paragraph-Objekt verwenden, um die einzelnen Elemente der Paragraphs-Auflistung zu durchlaufen.

Im PowerPoint-Objektmodell sieht das ein wenig anders aus. Hier erhält man über die Paragraphs-Auflistung wiederum TextRange-Objekte. Man kann es sich so vorstellen, dass der komplette Inhalt nun nach Zeilenumbrüchen aufgeteilt wird und durch neue TextRange-Objekte definiert wird.

Also deklarieren wir die Variablen zum Erfassen der einzelnen Absätze wie folgt:

Dim objParagraph As PowerPoint.TextRange

Damit können wir nun alle Absätze mit folgender Schleife durchlaufen und ihre Inhalte im Direktbereich ausgeben:

 

Schreibe einen Kommentar