Nachdem wir bereits gezeigt haben, wie man COM-Add-Ins für die Verwendung in anderen Office-Anwendungen nutzen kann, wollen wir nun auch einmal eines für Word programmieren. Die Aufgabe lautet, die verschiedenen Funktionen, die wir im Artikel “Word: PDF per VBA erzeugen” definiert haben, in Word für alle Dokumente bereitzustellen. Dazu erstellen wir ein neues COM-Add-In mit der Entwicklungsumgebung twinBASIC. Das COM-Add-In soll seine Funktionen per Ribbon bereitstellen, sodass der Benutzer mit wenigen Mausklicks die gewünschten Exporte erzeugen kann. Dazu gehört der Export des vollständigen Dokuments, aller Seiten einzeln, eines bestimmten Bereichs, der aktuellen Seite oder auch von Bereichen, die durch bestimmte Formatierungen eingeleitet werden.
Im Artikel Word: PDF per VBA erzeugen (www.vbentwickler.de/384) haben wir einige Methoden gezeigt, wie wir den Inhalt von Word-Dokumenten in PDF-Dokumente exportieren können. Diese sehen wie folgt aus:
- Komplettes Dokument als PDF speichern
- Jede Seite als eigenes PDF-Dokument extrahieren
- Bereiche nach Seitenzahl exportieren
- Exportieren der aktuellen Seite
- Aufteilen nach Eigenschaften wie Überschriften
- Speichern des markierten Textes in ein eigenes PDF-Dokument
Diese Funktionen wollen wir nun in ein COM-Add-In integrieren, das die Funktionen für alle Dokumente in einem eigenen Tab im Ribbon anzeigt (siehe Bild 1). Hier sehen wir auch die Möglichkeit, die Seitenzahlen zum Exportieren eines Bereichs zu exportieren. Außerdem können wir angeben, ob das PDF nach dem Export direkt geöffnet werden soll.
Bild 1: Das Ribbon-Tab für die Exportfunktionen
Voraussetzungen
COM-Add-Ins wie dieses erstellen wir mit dem Tool twinBASIC, das für die Erstellung von 32-Bit-Anwendungen kostenlos verfügbar ist. Mehr dazu findest Du in Artikeln wie twinBASIC: Visual Basic für die Zukunft (www.vbentwickler.de/310) und COM-Add-Ins mit twinBASIC (www.vbentwickler.de/311).
Da dort die Basics zum Erstellen von COM-Add-Ins bereits ausführlich dokumentiert wurden, konzentrieren wir uns hier auf die für unseren Anwendungszweck spezifischen Teile der Programmierung.
Starten des COM-Add-Ins
Beim Starten des COM-Add-Ins wird die Methode OnConnection der Schnittstelle IDTExtentibility2 aufgerufen (siehe Listing 1).
Sub OnConnection(ByVal Application As Object, ByVal ConnectMode As ext_ConnectMode, ByVal AddInInst As Object, _ ByRef custom As Variant()) Implements IDTExtensibility2.OnConnection Set objWord = Application Set objWordEvents = Application End Sub
Listing 1: Diese Prozedur wird beim Starten von Word aufgerufen
Diese dient normalerweise dazu, einer Objektvariablen wie der folgenden einen Verweis auf die Anwendung hinzuzufügen, die das Add-In aufgerufen hat, in diesem Fall Word.Application. Diese landet in einem Standardmodul namens mdlWord.twin, weil wir von verschiedenen Modulen aus auf diese Variable zugreifen wollen:
Public objWord As Word.Application
Andererseits benötigen wir in diesem Fall aber auch die Möglichkeit, beim Öffnen eines neuen Dokuments oder beim Wechseln zu einem anderen Dokument auf das entsprechende Ereignis zu reagieren. Das ist notwendig, weil wir in die beiden Felder Erste Seite und Letzte Seite des Ribbons die erste und die letzte Seite des aktuellen Dokuments eintragen wollen. Dazu deklarieren wir also noch eine Variable namens objWordEvents, diesmal mit dem Schlüsselwort WithEvents:
Private WithEvents objWordEvents As Word.Application
Diese füllen wir und gleichzeitig implementieren wir die beiden Ereignisse DocumentOpen und DocumentChange für diese Variable:
Private Sub objWordEvents_DocumentOpen(ByVal Doc As _ Word.Document) RibbonAktualisieren End Sub Private Sub objWordEvents_DocumentChange() RibbonAktualisieren End Sub
Beide rufen die folgende Prozedur auf, welche das aktuelle Dokument referenziert, sofern dieses überhaupt vorhanden ist. Dann ermitteln wir die erste und die letzte Seite und schreiben diese in die Variablen lngErsteSeite und lngLetzteSeite. Diese Variablen deklarieren wir wiederum im Standardmodul mdlWord.twin.
Schließlich rufen wir die Invalidate-Methode der mit objRibbon referenzierten Ribbon-Definition auf, damit diese die anzuzeigenden Werte mit den entsprechenden get…-Callbackfunktionen erneut aufruft:
Private Sub RibbonAktualisieren() Dim objDocument As Word.Document If Not objRibbon Is Nothing Then On Error Resume Next Set objDocument = objWord.ActiveDocument On Error GoTo 0 If Not objDocument Is Nothing Then lngErsteSeite = 1 lngLetzteSeite = objWord.ActiveDocument. _ ComputeStatistics(wdStatisticPages) objRibbon.Invalidate End If End If End Sub
Ribbon des COM-Add-Ins definieren
Damit kommen wir zu einem wichtigen Element, nämlich der Schnittstelle zum Aufrufen der Funktionen des COM-Add-Ins. Diese definieren wir in der Funktion GetCustomUI, die beim Starten von Word automatisch aufgerufen wird. Hier setzen wir in der Variablen strXML die Ribbon-Definition zusammen und geben diese dann zurück (siehe Listing 2).
Private Function GetCustomUI(ByVal RibbonID As String) As String Implements IRibbonExtensibility.GetCustomUI Dim strXML As String strXML &= "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui"" loadImage=""loadImage" _ & """ onLoad=""onLoad"">" & vbCrLf strXML &= " <ribbon startFromScratch=""false"">" & vbCrLf strXML &= " <tabs>" & vbCrLf strXML &= " <tab id=""tab"" label=""amvWordPDFExport"">" & vbCrLf strXML &= " <group id=""grp"" label=""amvWordPDFExport"">" & vbCrLf strXML &= " <button id=""btnExportKomplett"" size=""large"" label=""Komplett exportieren"" image=" _ & """word_pdf_book.ico"" onAction=""onAction""/>" & vbCrLf strXML &= " <button id=""btnExportEinzelneSeiten"" size=""large"" label=" _ & """Alle Seiten einzeln exportieren"" image=""word_book_pdfs.ico"" onAction=""onAction""/>" & vbCrLf strXML &= " <button id=""btnExportAktuelleSeite"" size=""large"" label=""Aktuelle Seite exportieren"" " _ & "image=""word_pdf.ico"" onAction=""onAction""/>" & vbCrLf strXML &= " <button id=""btnExportAktuelleMarkierung"" size=""large"" label=" _ & """Aktuelle Markierung exportieren"" image=""word_pdf_range.ico"" onAction=""onAction""/>" & vbCrLf strXML &= " <separator id=""sep1""/>" & vbCrLf strXML &= " <editBox id=""txtErsteSeite"" label=""Erste Seite"" onChange=""onChange"" getText=" _ & """getText""/>" & vbCrLf strXML &= " <editBox id=""txtLetzteSeite"" label=""Letzte Seite"" onChange=""onChange"" getText=" _ & """getText""/>" & vbCrLf strXML &= " <button id=""btnExportBereich"" size=""large"" label=""Bereich exportieren"" image=" _ & """word_pdf_pages.ico"" onAction=""onAction""/>" & vbCrLf strXML &= " <checkBox id=""chkOeffnen"" label=""PDF nach Erstellen öffnen"" getPressed=" _ & """GetPressedCheckBox"" onAction=""onActionCheckBox""/>" & vbCrLf strXML &= " </group>" & vbCrLf strXML &= " </tab>" & vbCrLf strXML &= " </tabs>" & vbCrLf strXML &= " </ribbon>" & vbCrLf strXML &= "</customUI>" & vbCrLf Return strXML End Function
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: