(C) 2009 - 2021 by Mourad Louha · Alle Rechte vorbehalten

Entwickeln von Office Add-Ins mit Add-In Express – Teil 2

Wie bereits in ersten Teil des Beitrags angekündigt, möchte ich über meine Erfahrungen bei der Portierung von VBA Anwendungen zu .NET berichten. Jetzt, nach einigem Experimentieren mit Visual Studio, muss ich an dieser Stelle erwähnen, dass auch wenn ich ursprünglich aus der Ecke Borland C++ und später Microsoft C++ komme (wirklich sehr lang her, kennt übrigens noch einer Borland C++?), Visual Studio fordert schon etwas Einarbeitung.

Zum Start hatte ich mir vorgenommen, meine einfache Anwendung „Zeichenobjekte in Excel komfortabel ein- und ausblenden“ zu portieren. Optimal wäre es, wenn die Anwendung sowohl in Excel 2003 als auch in Excel 2007 laufen würde. Und später, so hatte ich überlegt, wäre es nicht schlecht, wenn dieselbe Anwendung auch in Word oder PowerPoint laufen würde.

Ok, fangen wir mal an; zunächst erstelle ich ein neues Projekt in Visual Studio. Wie bereits im vorherigen Beitrag beschrieben, wähle ich „ADX COM Add-in“ aus der Rubrik „Andere Projekttypen – Erweitert“.

Add-In Express

Anschließend wähle ich erscheinenden Assistenten „Visual Basic Project“ mit den Standardoptionen und gebe „Microsoft Excel“ als Host an.

Schauen wir uns nun das Layout meiner Original-Anwendung in Excel VBA an. Beim Start des Add-Ins wird eine Symbolleiste erzeugt, von welcher aus ein nicht modaler Dialog (UserForm) aufgerufen werden kann. Dieser präsentiert sich wie folgt:

Add-In Express

Nach einigen Recherchen, ob denn eine VBA Userform in Visual Studio importiert werden kann, wurde ich leider enttäuscht. Microsoft selbst empfiehlt bei MSDN mit dem lapidaren Satz „Die beste Möglichkeit VBA Userforms zu portieren, ist diese neu zu entwickeln“, neue Windows-Forms zu erstellen. Es gibt zwar Möglichkeiten, Module über dem Umweg von Visual Basic 6 irgendwie zu konvertieren; letzten Endes wird eine Portierung größtenteils doch zu einer Neuentwicklung führen, dafür sind die Unterschiede einfach zu groß. Andererseits sind viele Funktionen die ich in VBA entwickelt habe, bereits in .NET über standardtisierte Systemaufrufe realisierbar. Und die Portierung wird, denke ich, zu besser wartbaren und noch mehr modularem Code führen. Insbesondere ist der Aufwand XLA‘s für meine Module zu erstellen nicht unerheblich.

Ok, erstellen wir nun eine Windows Form in Visual Studio. Das geht sehr einfach durch Auswahl des Menüs „Projekt – Windows Form hinzufügen“. Im Dialog kann man zwischen verschiedenen vorgefertigten Dialogen wählen, sinnvoll ist für uns eine leere Windows Form. Nach dem Öffnen des Designers können wir aus einer Reihe von Steuerelementen die passenden heraussuchen und in der Windows Form positionieren. Folgend eine Abbildung, die den Status nach dem Einfügen aller von mir benötigten Steuerelemente zeigt.

Add-In Express

Nun füge ich mit der im vorherigen Artikel beschriebenen Methode eine Command Bar aus den Add-In Express Tools hinzu (kurz zusammengefasst: über einen Doppelklick auf die Datei „AddinModule.vb“, einem Rechtklick in dem entsprechenden Ansichtsfenster und Auswahl von „Add CommandBar“ aus dem Kontextmenü das Element erstellen). Im Unterschied jedoch zum vorherigen Artikel und im Gegensatz zur VBA-Lösung, möchte ich jedoch heute mein Menü in der Hauptmenüleiste von Excel verankern.

Add-In Express

Die Hauptmenüleiste von Excel kann über „Worksheet Menu Bar“ angesprochen werden. Dies kann im entsprechenden Feld eingegeben werden. Zudem entscheide ich mich zunächst dafür, bei der Einstellung „SupportedApps“ nur Excel anzugeben (in der Standardeinstellung sind weitere Office Anwendungen enthalten), da Hauptmenüleisten in anderen Office Anwendungen einen anderen Namen tragen. Nun muss ich noch ein paar Einträge hinzufügen, was durch Anklicken der Schaltfläche neben „Controls“ geschehen kann.

Add-In Express

Links oben unter dem Titel erhalten Sie eine Vorschau auf das Menü. Darunter befindet sich eine Symbolleiste, anhand welcher Sie die verschiedenen Untermenütypen einfügen können. Im Beispiel hier oben würde mein Hauptmenüeintrag „Maninweb“ heißen und die darunter liegenden Menüpunkte aufrufen. Beispielhaft habe ich auch einen neuen Menüpunkt im Menü Datei“ von Excel eingefügt. Hier wäre zu beachten, dass die ID bekannt sein sollte, da diese im Feld ID anzugeben ist.

An dieser Stelle auch zu Veranschaulichung, wie einfach es ist, Kontextmenüs hinzuzufügen. Hierfür erstelle ich den neuen Eintrag „AdxContextMenu1“ in der Designer Ansicht zu „AddinModule.vb“ und wähle in den Eigenschaften „Control“ und brauche nur noch meine Einträge anzulegen. Einzig den Namen „Cell“ des Kontextmenüs aus Excel bei Rechtsklick auf eine Zelle muss ich kennen.

Add-In Express

Nun zu Office 2007. Da dieses nun etwas anders arbeitet und ich nicht unbedingt das zuvor angelegte Menü im Ribbon „Addins“ von Excel 2007 wiederfinden möchte (was übrigens durch die Einstellung „UseForRibbon = False“ verhindert wird), lege ich mir auch ein Ribbon Control über „Add Ribbon Tab“ an und erstelle ebenfalls mein Menü. Folgend mein Ergebnis:

Add-In Express

Auch hier stelle ich unter „Ribbons“ nur Excel ein. Nun habe ich zunächst einen Test durchgeführt und nachgeschaut, ob die Menüs, Ribbons und das Kontextmenü in den verschiedenen Excel Versionen auch erscheinen. Kein Problem, gut zu wissen, dass das Kontextmenü auch in beiden Versionen zur Verfügung steht.

Die Original Anwendung in Excel VBA enthält eine Routine, die über eine Klasse die Standard Excel Ereignisse zur Aktivierung einer Arbeitsmappe und einer Tabelle abfängt. Wir brauchen insofern einen ähnlichen Vorgang in unserer Add-In Express Anwendung. In der Designer Ansicht zu „AddinModule.vb“ kann über das Kontextmenü durch Auswahl von „Add Events“ auch ein Event Handler für Excel Ereignisse eingefügt werden.

Add-In Express

Das danach eingefügte Element habe ich in „MIW_Excel“ umbenannt. Wir können anschließend in der Codeansicht unsere beiden Ereignisse über „Private Sub MIW_Excel_SheetActivate(ByVal sender As Object, ByVal hostObj As Object) Handles MIW_Excel.SheetActivate“ und „Private Sub MIW_Excel_WorkbookActivate(ByVal sender As Object, ByVal hostObj As Object) Handles MIW_Excel.WorkbookActivate“ anlegen und dort eine Funktion aufrufen, die die verfügbaren Zeichenobjekte in einer Tabelle auflistet. Diese Funktion ist im VBA Originalprojekt in einem Modul abgelegt und brauchte von der Logik her nur minimal modifiziert werden.

Es gibt übrigens auch die Möglichkeit eine eigenständige Klasse dem Projekt hinzuzufügen, die die Ereignisse einer speziellen Mappe abfangen könnte. Dies werden aber wir ein anderes Mal ausprobieren.

Wenn wir in die Codeansicht von „AddinModule.vb“ wechseln, finden wir auch in speziell dafür vorgesehenen Regionen den Initialisierungscode für unsere zuvor per Designer erstellten Objekte wieder. Damit in den Menü auch etwas passiert, müssen wir die Ereignisse dieser füllen. Der Aufruf der Windows Form gestaltet sich über die OnClick-Ereignisse relativ einfach.

Add-In Express

Wenn wir die Anwendung nun testen, erhalten wir folgendes Ergebnisse in Excel 2003, 2007 und übrigens auch in 2010:

Add-In Express

Add-In Express

Add-In Express

Wie zuvor erwähnt, wäre es schön, wenn die Anwendung auch in Word oder Powerpoint integrierbar wäre. Folgend die Vorgehensweise für Word. Ich hatte mich ja zuvor für einen neuen Menüpunkt in der Hauptmenüleiste in Excel entschieden. Ähnlich kann ich ein Menü anlegen, das sich dann in Word integriert. Hier heißt das Menü „Menu Bar“, über das Kontextmenü in der Designer-Ansicht zu „AddinModule.vb“ füge ich eine neue CommandBar hinzu und baue das Menü dort genauso auf, wie meine CommandBar für Excel. Ausserdem setze ich den Haken bei „Add Application Events„ für Word. Last but not least rufe ich erneut mein Ribbon Element auf und für auch dort Word hinzu.

Add-In Express

Wir dürfen an dieser Stelle auch nicht vergessen, dem COM Add-In auch in der Einstellung „SupportedApps“ den Eintrag „Word“ hinzufügen. Schauen wir nun wie sich die Anwendung nach dem Kompilieren und einer Registrierung nun unter Word präsentiert.

Add-In Express

Add-In Express

Bliebe insofern nur noch die Funktion zum Aufzählen der Zeichenobjekte an das Word Objektmodell anzupassen, das dürfte jedoch kein Problem sein. In derselben Art und Weise könnte nun Powerpoint angebunden werden. Insgesamt kann also das Fazit gezogen werden, dass es relativ einfach ist ein COM Add-In zu entwickeln, welches sich in mehrere Office Programme integriert. Zur Vorbereitung eines nächsten Beitrages werde ich mir die Add-In Express Vorlagen für XLL’s, RTD Server und Smart Tags anschauen. Folgend ein paar Links mit weiteren Informationen zu diesem Thema:

» Add-In Express und COM-Add-Ins, Englisch
» Erstellen von COM-Add-Ins mit Add-In Express, Englisch

 
Comments

No comments yet.