PowerPoint-Übersetzung per COM-Add-In

Möchtest Du den gesamten Artikel lesen? Und vielleicht sogar den Artikel im PDF-Format und die Beispieldateien herunterladen? Dann hole Dir den Artikel gleich hier - völlig kostenlos!

Im Artikel “PowerPoint: Texte automatisiert übersetzen” (www.vbentwickler.de/437) haben wir VBA-Code produziert, mit dem wir alle Absätze aller Folien in einem PowerPoint-Dokument automatisch übersetzen können. Dabei nutzen wir den Dienst DeepL. Leider müssen wir, um diesen Code in einem PowerPoint-Dokument verwenden zu können, das Modul erst in das jeweilige Dokument integrieren. Wenn man oft PowerPoint-Folien übersetzen muss, ist das recht aufwändig. Da nehmen wir lieber den Aufwand in Kauf, einmal ein COM-Add-In für diesen Zweck zu programmieren, dass wir dann auch noch an Dich weitergeben können, damit Du es für Dich und Deine Mitarbeiter und/oder Kunden einsetzen kannst.

Das Werkzeug für COM-Add-Ins: twinBASIC

Wie üblich nutzen wir das in der 32-Bit-Version sogar kostenlose Produkt twinBASIC für die Erstellung des COM-Add-Ins. Im Download findest Du, auch wenn Du Dir noch nicht die kostenpflichtige Version von twinBASIC gekauft hast, aber auch eine 64-Bit-Version der DLL, die das COM-Add-In enthält. Da wir keine DLL-Funktionen nutzen, ist der Code für beide Varianten allerdings identisch.

twinBASIC findest Du beispielsweise unter dem folgenden Link:

https://github.com/twinbasic/twinbasic/releases/tag/beta-x-0585

Nach dem Start (es ist keine Installation nötig) erscheint der Dialog aus Bild 1. Hier wählen wir unter Samples den Eintrag Sample 5. MyCOMAddin aus.

Auswahl des Projekttyps

Bild 1: Auswahl des Projekttyps

Anschließend erscheint der Dialog aus Bild 2, wo wir den Namen des Projekts festlegen – hier auf amvPowerPointTranslator. Danach finden wir bereits die Entwicklungsumgebung vor, in der wir die ersten grundlegenden Änderungen durchführen.

Projektname für das neue Projekt

Bild 2: Projektname für das neue Projekt

Änderungen am Beispielprojekt für das COM-Add-In

Als Erstes stellen wir den Klassennamen sowohl im Code der Klasse als auch für die Klassendatei auf amvPowerPointTranslator ein (siehe Bild 3). Nach dem Ändern im Modul speichern wir das Projekt zunächst, damit wir im nächsten Schritt das Modul schließen können, um den Namen der .twin-Datei anzupassen.

Eintragen des neuen Klassennamens

Bild 3: Eintragen des neuen Klassennamens

Verweis auf PowerPoint hinzufügen

Damit wir die PowerPoint-Elemente unter Verwendung von IntelliSense nutzen können, fügen wir dem Projekt unter Project Settings im Bereich Library References einen Verweis auf die Bibliothek Microsoft PowerPoint 16.0 Object Library hinzu (siehe Bild 4).

Auswahl der PowerPoint-Bibliothek

Bild 4: Auswahl der PowerPoint-Bibliothek

Funktionen für die Registrierung des COM-Add-In anpassen

Die Beispielfunktionen zum Durchführen der Registrierung in der Datei DllRegistration.twin sind für den Einsatz in Access- und Excel-Anwendungen ausgelegt. Dies passen wir noch an. Dabei stellen wir vor allem die Konstante AddinClassName ebenfalls auf amvPowerPointTranslator ein.

Außerdem ändern wir die Konstante RootRegistryFolder_Excel auf den Namen RootRegistryFolder_PowerPoint und fügen auch in dem Wert den Eintrag PowerPoint statt Excel ein. Die Konstante RootRegistryFolder_Access löschen wir.

In den beiden Funktionen DllRegisterServer und DllUnregisterServer ersetzen wir RootRegistryFolder_Excel durch RootRegistryFolder_PowerPoint und löschen alle Einträge für RootRegistryFolder_Access. Das Ergebnis sieht in gekürzter Form wie in Listing 1 aus.

Module DllRegistration
     Const AddinProjectName As String = VBA.Compilation.CurrentProjectName
     Const AddinClassName As String = "amvPowerPointTranslator"
     Const AddinQualifiedClassName As String = AddinProjectName & "." & AddinClassName
     Const RootRegistryFolder_PowerPoint As String = "HKCU\SOFTWARE\Microsoft\Office\PowerPoint\Addins\" _
         & AddinQualifiedClassName & "\"
  
     Public Function DllRegisterServer() As Boolean
         On Error GoTo RegError
         Dim wscript As Object = CreateObject("wscript.shell")
         wscript.RegWrite RootRegistryFolder_PowerPoint & "FriendlyName", AddinProjectName, "REG_SZ"
         wscript.RegWrite RootRegistryFolder_PowerPoint & "Description", AddinProjectName, "REG_SZ"
         wscript.RegWrite RootRegistryFolder_PowerPoint & "LoadBehavior", 3, "REG_DWORD"
         ...
     End Function
  
     Public Function DllUnregisterServer() As Boolean
         On Error GoTo RegError
         Dim wscript As Object = CreateObject("wscript.shell")
         wscript.RegDelete RootRegistryFolder_PowerPoint & "FriendlyName"
         wscript.RegDelete RootRegistryFolder_PowerPoint & "Description"
         wscript.RegDelete RootRegistryFolder_PowerPoint & "LoadBehavior"
         wscript.RegDelete RootRegistryFolder_PowerPoint
         ...
     End Function
End Module

Listing 1: Funktionen zum Registrieren und Deregistrieren

Klasse amvPowerPointTranslator anpassen

Auch den Inhalt der Datei amvPowerPointTranslator.twin passen wir an. Hier löschen wir die Variable applicationObject durch objPowerPoint und legen ihren Datentyp auf PowerPoint.Application fest. Diese weisen wir in der Ereignisprozedur OnConnection wie folgt zu:

Sub OnConnection(ByVal Application As Object, _
         ByVal ConnectMode As ext_ConnectMode, _
         ByVal AddInInst As Object, _
         ByRef custom As Variant()) _
     Implements IDTExtensibility2.OnConnection
     Set objPowerPoint = Application
End Sub

In der Prozedur OnHelloWorldClicked finden wir auch noch ein Vorkommen der Variablen applicationObject, das wir durch objPowerPoint ersetzen. Den Rest belassen wir erst einmal so, wie er ist, und kompilieren das Projekt erstmalig mit dem Befehl File|Build.

Der Kompiliervorgang sollte genau wie die Registrierung nun erfolgreich verlaufen sein. Sollte das nicht der Fall, nutze entweder das Beispielprojekt aus dem Download oder gehe die bisherige Anleitung nochmals durch.

Normalerweise sollte aber nun beim Öffnen von PowerPoint ein Tab namens twinBASIC Test erscheinen und ein Klick auf die enthaltene Schaltfläche sollte die Meldung aus Bild 5 anzeigen.

Das COM-Add-In ist bereits startbereit.

Bild 5: Das COM-Add-In ist bereits startbereit.

Funktion implementieren

Nun brauchen wir eigentlich erst einmal nur die Funktionen aus der Lösung aus dem Artikel PowerPoint: Texte automatisiert übersetzen (www.vbentwickler.de/437) in ein neues Modul im twinBASIC-Projekt einzufügen.

Dafür benötigen wir alle vier Module:

  • mdlDeepL
  • mdlJSON
  • mdlJSONDOM
  • mdlUebersetzen

Diese können wir leider nicht per Drag and Drop einfügen, daher müssen wir jeweils ein neues Modul erstellen und den Code des jeweiligen Moduls dort hineinkopieren.

Neue Module erstellen wir wie in Bild 6 und füllen dann die Inhalte der Module des VBA-Projekts der PowerPoint-Datei zwischen die Anweisungen Module … und End Module ein.

Neues Modul hinzufügen

Bild 6: Neues Modul hinzufügen

Außerdem benötigen wir noch zwei weitere Verweise auf die Bibliotheken Microsoft Scripting Runtime und Microsoft XML, v6.0, die wir wie oben gezeigt hinzufügen.

Die Variable objPowerPoint nehmen wir nun aus der Klasse amvPowerPointTranslator.twin heraus, da wir dort nicht von anderen Modulen aus darauf zugreifen können, und fügen sie dem Modul mdlUebersetzen hinzu:

Private objPowerPoint As PowerPoint.Application

Aufruf der Prozedur Translate

Die gleich angepasste Prozedur Translate aus dem oben genannten PowerPoint-Artikel rufen wir auf, wenn der Benutzer auf den einzigen bisherigen Button des twinBASIC-Projekts klickt:

Public Sub OnHelloWorldClicked(Control As IRibbonControl)
     MsgBox "Hello world, from twinBASIC!" & vbCrLf & _
                 "(via " & objPowerPoint.Name & ")"
     Call Translate()
End Sub

Code der Lösung anpassen

Danach passen wir den Code unserer Lösung an. Wir können vorab prüfen, ob wir schon Stellen finden, die wir für den Betrieb in einem COM-Add-In anpassen müssen. Wir können aber auch einfach mal starten und schauen, was passiert. Dabei stoßen wir auch gleich auf einen Fehler. Um uns die Arbeit ein wenig zu erleichtern, fügen wir eine einfache Fehlerbehandlung zunächst zur Prozedur Translate hinzu:

Public Sub Translate()
     On Error GoTo Fehler
     ...
     Exit Sub
Fehler:
     MsgBox Err.Number & " " & Err.Description & " " & Erl
End Sub

Außerdem nummerieren wir die Zeilen, damit die MsgBox-Funktion nicht nur die Fehlermeldung und die Fehlermeldung ausgibt, sondern mit der Erl-Funktion auch die Zeile, die den Fehler ausgelöst hat.

Der erste Fehler betrifft gleich diese Zeile:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar