Access-Add-In mit VSTO

Access-Add-Ins können Sie mit Access selbst erstellen oder aber auch mit Visual Studio, zum Beispiel in der kostenlosen Visual Studio 2015 Community Edition. Dieser Beitrag zeigt, wie Sie ein Access-Add-In mit Visual Studio erstellen und was dabei zu beachten ist. Dabei legen wir vor allem ein Augenmerk darauf, wie Sie dem Fehlen einer Vorlage zum Erstellen von Access-Add-Ins begegnen und ein Add-In für eine andere Office-Anwendung nutzen, um ein Access-Add-In zu programmieren.

Voraussetzungen

Die erste Voraussetzung ist das Vorhandensein von Visual Studio Community Edition 2015, welches Sie nach Eingabe des Namens als Suchbegriff bei Google schnell finden sollten. Dieses kommt aber in der Regel nicht direkt mit den Office Developer Tools. Diese finden Sie ebenfalls am besten, wenn Sie bei Google die Suchbegriffe Office Developer Tools eingeben. Ein guter Startpunkt ist zum Zeitpunkt der Veröffentlichung dieses Beitrags aber auch diese Adresse:

https://blogs.msdn.microsoft.com/visualstudio/2015/11/23/latest-microsoft-office-developer-tools-for-visual-studio-2015/

Sie müssen also zuerst Visual Studio 2015 Community Edition installieren und dann die aktuellsten Erweiterungen herunterladen. Danach sollten Sie, wenn Sie Visual Studio starten und ein neues Projekt anlegen, die Vorlagen wie in Bild 1 finden.

Keine Vorlage für ein Access-Add-In

Bild 1: Keine Vorlage für ein Access-Add-In

Add-In für Access

Wer weiß, dass die Elemente in alphabetischer Reihenfolge aufgelistet werden, und sieht, dass Excel 2013 und 2016 VSTO-Add-In der erste Eintrag ist, erkennt schnell: Es gibt keine Vorlage für Add-Ins, die mit Access arbeiten. Aber das ist kein Problem: Wir starten einfach mit einem anderen Add-In-Typ, beispielsweise für Microsoft Excel, und passen das daraus generierte Projekt dann für den Einsatz in Access an.

Start mit Excel statt mit Access

Sie erstellen also zunächst ein neues Projekt auf Basis der Vorlage Visual C# (oder Visual Basic)|Office/SharePoint|VSTO-Add-Ins|Excel 2013 und 2016 VSTO-Add-In. Geben Sie dabei den Projektnamen an, in unserem Beispiel schlicht AccessAddIn.

Nach einem Klick auf OK erstellt Visual Studio das Projekt.

Add-In in Excel testen

Wir wollen das Add-In, das wir ja nun erstellt, aber noch nicht für den Einsatz in Access angepasst haben, zunächst einmal auf seine Tauglichkeit unter Excel testen. Dazu klicken Sie in Visual Studio einfach auf F5 und führen das Add-In so aus. Das Resultat ist ernüchternd, denn wir erhalten direkt eine Fehlermeldung wie in Bild 2.

Fehler beim Start des Excel-Add-Ins

Bild 2: Fehler beim Start des Excel-Add-Ins

Um dieses erste Problem zu beheben, schließen Sie Excel und öffnen es das nächste Mal als Administrator. Dazu geben Sie Excel in das Suchen-Feld von Windows ein, klicken mit der rechten Maustaste auf den Eintrag Excel 2016 und wählen aus dem Kontextmenü den Eintrag Als Administrator ausführen aus (s. Bild 3).

Excel als Administrator starten

Bild 3: Excel als Administrator starten

Nach dem öffnen von Excel und dem Erstellen oder Laden einer Datei öffnen Sie über den Backstage-Bereich die Excel-Optionen und wechseln dort zum Bereich Menüband anpassen. Hier aktivieren Sie nun die Hauptregisterkarte Entwicklertools (s. Bild 4).

Entwicklertools aktivieren

Bild 4: Entwicklertools aktivieren

Dies fügt dem Ribbon von Excel einen neuen Reiter namens Entwicklertools hinzu. In diesem finden Sie eine Schaltfläche namens COM-Add-Ins. Wenn Sie diese anklicken, öffnet sich die Liste der aktuell aktiverten Add-Ins. Ganz oben sehen Sie bereits den Eintrag Access-AddIn für unser soeben erstelltes Add-In. Ganz unten sollten Sie den Eintrag Visual Studio Tools for Office Design-Time Adaptor for Excel sehen. Diesen Eintrag müssen Sie deaktivieren, um den Fehler beim Aufruf von GetCustomUI() zu beheben (s. Bild 5).

Fehler durch GetCustomUI beheben

Bild 5: Fehler durch GetCustomUI beheben

Bevor wir uns nun an die Arbeit machen, das Add-In für den Einsatz mit Access umzurüsten, wollen wir zumindest noch eine Ribbon-Schaltfläche hinzufügen, welche ein Meldungsfenster anzeigt. Damit stellen wir sicher, dass das Add-In grundsätzlich funktioniert. Es wäre schade, wenn wir nun erst die ganzen Schritte für die Anpassung als Access-Add-In durchführen und dann, wenn es nicht funktionieren sollte, nicht wissen, wo der Fehler zu suchen ist.

Sobald Sie Excel nun schließen und erneut starten, erscheint die Fehlermeldung nicht mehr.

Ribbon hinzufügen

Nun wollen wir den Code zur Erstellung eines Ribbons zu unserem Add-In hinzufügen. Dazu erstellen Sie in Visual Studio eine neue Klasse, indem Sie den Kontextmenü-Eintrag des Projekts AccessAddIn aus dem Projektmappen-Explorer namens Hinzufügen|Neues Element… anklicken. Es erscheint der Dialog aus Bild 6, mit dem Sie ein Element des Typs Menüband (Visueller Designer) namens AddInRibbon.cs hinzufügen.

Hinzufügen eines Ribbons

Bild 6: Hinzufügen eines Ribbons

Es erscheint die Ansicht aus Bild 7, mit der Sie die Ribbon-Steuerelemente aus der Toolbox an die gewünschten Stellen im Ribbon einfügen können. Nun bedarf es einiger Erläuterungen, was es mit dem Element TabAddIns (Integriert) auf sich hat. Eines steht jedoch fest: Durch das einfache Hinzufügen eines Ribbons ändert sich noch nichts, beim nächsten Debuggen/Starten des Add-Ins per F5 öffnet sich zwar Excel, aber es erscheinen keine zusätzlichen Elemente im Ribbon.

Bearbeiten des Ribbbons

Bild 7: Bearbeiten des Ribbbons

Schaltfläche zum Ribbon hinzufügen

Wir fügen nun zunächst eine Schaltfläche zum Ribbon hinzu, indem wir ein Button-Element aus der Toolbox in den Bereich group1 ziehen. Die Beschriftung beider Elemente, also der Gruppe und der Schaltfläche, passen wir nun an.

Dazu klicken Sie auf das Element, in Bild 8 zum Beispiel auf das Button-Element, und stellen im Eigenschaften-Bereich die Eigenschaft Label auf den gewünschten Wert ein, in diesem Fall Test. Im gleichen Zug können Sie die Eigenschaft Name auf den Wert btnTest ändern. Für das Group-Element stellen Sie Label auf Beispielgruppe und Name auf grpBeispiel ein.

Bezeichnung der Schaltfläche ändern

Bild 8: Bezeichnung der Schaltfläche ändern

Nun fügen wir noch eine Ereignisprozedur zur Schaltfläche hinzu. Das Klassenmodul mit dem Code für das Ribbon-Objekt öffnen Sie, indem Sie aus dem Kontextmenü der Schaltfläche den Eintrag Code anzeigen auswählen (s. Bild 9). Dieser enthält jedoch noch keine Ereignisprozedur für die Schaltfläche btnTest. Diese legen Sie am einfachsten an, indem Sie in der Entwurfsansicht doppelt auf die Schaltfläche klicken.

Anzeigen der Ereignisprozedur der Schaltfläche

Bild 9: Anzeigen der Ereignisprozedur der Schaltfläche

Sollte nun nicht automatisch die Klasse hinter dem Ribbon-Element erscheinen, können Sie diese wiederum über den Kontextmenü-Befehl Code anzeigen oder die Taste F7 öffnen. Dieses Klassenmodul enthält nun eine Methode namens btnText_Click. Wir wollen dieser ein einfaches Meldungsfenster hinzufügen, wozu zwei Schritte nötig sind. Als Erstes fügen Sie der Klasse oben mit der using-Anweisung einen Verweis auf das Namespace System.Windows.Forms hinzu:

using System.Windows.Forms;

Die C#-Methode füllen wir dann mit einem einfachen Aufruf der Show-Methode der MessageBox-Klasse (s. Bild 10):

Hinzufügen einer MessageBox zur Schaltfläche

Bild 10: Hinzufügen einer MessageBox zur Schaltfläche

private void btnTest_Click(object sender,  RibbonControlEventArgs e) {
     MessageBox.Show("Schaltfläche  angeklickt.");
}

Wenn Sie nun das Add-In per F5 starten/debuggen, wird Excel geöffnet, aber auf den ersten Blick ist kein neuer Eintrag zu erkennen. Dieser erscheint erst, wenn Sie nun auf den Tab Add-Ins klicken. Dort finden Sie dann neben der Gruppe Benutzerdefinierte Symbolleisten unsere selbst definierte Gruppe namens Beispielgruppe und die Schaltfläche Test. Klicken Sie diese an, taucht auch prompt die von uns programmierte Meldung auf (s. Bild 11).

Die neu hinzugefügte Add-In-Schaltlfäche

Bild 11: Die neu hinzugefügte Add-In-Schaltlfäche

Wechsel zu Access

Nun gehen wir einen Schritt weiter und wollen das Add-In so anpassen, dass es nicht unter Excel, sondern unter Access geöffnet wird. Dazu sind einige änderungen nötig, die wir teilweise im Text-Editor Ihrer Wahl durchführen müssen, weil die entsprechenden Dateien nicht in Visual Studio geöffnet werden können.

Schritt 1: Verweis auf die Access-Bibliothek

Die erste änderung ist das Hinzufügen eines Verweises auf die Access-Bibliothek. Dazu betätigen Sie den Menübefehl Projekt|Verweis hinzufügen…, der den Verweis-Manager öffnet. Aus unerfindlichen Gründen finden Sie den Verweis auf die Bibliothek Microsoft Access x.0 Object Library nicht wie gewohnt im Bereich COM/Typbibliotheken (s. Bild 12).

Der Verweis auf Microsoft Access 16.0 Object Library fehlt.

Bild 12: Der Verweis auf Microsoft Access 16.0 Object Library fehlt.

Stattdessen müssen Sie auf den Bereich Durchsuchen wechseln und dort auf die Schaltfläche Durchsuchen… klicken. Hier navigieren Sie zur Datei MSACC.OLB, die sich unter Office 2016 beispielsweise in diesem Verzeichnis befindet: C:\Program Files (x86)\Microsoft Office\root\Office16. Nachdem Sie diese ausgewählt haben, sieht der Dialog Verweis-Manager wie in Bild 13 aus.

Hinzufügen per Durchsuchen...

Bild 13: Hinzufügen per Durchsuchen…

Datei ThisAddIn.Designer.cs ändern

Eine wichtige Rolle spielt die Datei ThisAddIn.Designer.cs. Sie legt unter anderem fest, welche Anwendung als Host verwendet wird. Damit es sich dabei nicht mehr um Excel handelt, sondern um Access, sind einige änderungen nötig. Die Datei finden Sie nicht direkt im Projektmappen-Explorer, sondern Sie müssen diese über den Windows Explorer per Doppelklick öffnen oder diese einfach aus dem Windows Explorer in Visual Studio ziehen. Wir schauen uns die notwendigen änderungen von oben nach unten an. Die vorherige Version der Anweisungen haben wir jeweils auskommentiert (dies geschieht unter C# durch Voranstellen zweier Schrägstriche). Als Erstes ändern wir folgende Zeile, wobei einfach Excel durch Access ersetzt wird (ca. Zeile 28):

//internal Microsoft.Office.Interop.Excel.Application Application;
internal Microsoft.Office.Interop.Access.Application Application;

Die zweite änderung folgt gleich ein paar Zeilen weiter unten. Hier wird Excel.ApplicationFactory einfach durch das allgemeine Factory-Objekt ersetzt (für Access gibt es kein ApplicationFactory-Objekt, ca. Zeile 33):

//public ThisAddIn(global::Microsoft.Office.Tools.Excel.ApplicationFactory factory, global::System.IServiceProvider serviceProvider) : base(factory, serviceProvider, "AddIn", "ThisAddIn") {
public ThisAddIn(global::Microsoft.Office.Tools.Factory factory, global::System.IServiceProvider serviceProvider) : base(factory, serviceProvider, "AddIn", "ThisAddIn") {

In der Methode Initialize ersetzen wir wie folgt Excel durch Access (ca. Zeile 43):

//this.Application = this.GetHostItem<Microsoft.Office.Interop.Excel.Application>(typeof(Microsoft.Office.Interop.Excel.Application), "Application");
this.Application = this.GetHostItem<Microsoft.Office.Interop.Access.Application>(typeof(Microsoft.Office.Interop.Access.Application), "Application");

Und es folgen noch zwei Ersetzungen der Factory. Die erste sieht so aus (ca. Zeile 184):

//private static global::Microsoft.Office.Tools.Excel.ApplicationFactory _factory;
private static global::Microsoft.Office.Tools.Factory _factory;

Die zweite betrifft diese Zeile (ca. Zeile 202):

//internal static global::Microsoft.Office.Tools.Excel.ApplicationFactory Factory {
internal static global::Microsoft.Office.Tools.Factory Factory {

Anweisungen in ThisAddIn.Designer.cs löschen

Nun entfernen wir einige Anweisungen aus der gleichen Datei, welche die ordnungsgemäße Ausführung des Add-Ins in Access verhindern. Damit Sie sich ungefähr an den Zeilennummern orientieren, kommentieren Sie die betroffenen Zeilen einfach durch Voranstellen von // aus. Die ersten beiden Zeilen finden Sie ab Zeile 20:

// internal Microsoft.Office.Tools.CustomTaskPaneCollection CustomTaskPanes;
// internal Microsoft.Office.Tools.SmartTagCollection VstoSmartTags;

Zeile 126:

//this.CustomTaskPanes.BeginInit();
//this.VstoSmartTags.BeginInit();

Zeile 134:

//this.VstoSmartTags.EndInit();
//this.CustomTaskPanes.EndInit();

Zeile 144:

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