Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
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.
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.
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.
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).
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.
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.
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: