MSDN Magazin > Home > Ausgaben > 2007 > August >  Office-Anwendungen: Erweitern Ihres VBA-Codes m...
Office-Anwendungen
Erweitern Ihres VBA-Codes mit VSTO
Paul Stubbs and Kathleen McGrath

Dieser Artikel basiert auf einer Vorabversion von Visual Studio mit dem Codenamen „Orcas“. Änderungen der Informationen in diesem Artikel sind vorbehalten.
Themen in diesem Artikel:
  • Unterschiede zwischen den Sprachfeatures von VSTO und VBA
  • Vorteile von VSTO gegenüber VBA
  • Aufrufen von VSTO aus VBA und von VBA aus VSTO
In diesem Artikel werden folgende Technologien verwendet:
VBA, VSTO
Falls Sie für Microsoft® Office entwickeln, dabei Visual Basic® for Applications (VBA) verwenden und noch nicht zu Microsoft .NET Framework gewechselt haben, macht Visual Studio®-Tools für Office (VSTO) in der nächsten Version von Visual Studio mit dem Codenamen „Orcas“ die Umstellung leichter und überzeugender. VSTO bietet Ihnen den vollständigen Featuresatz von Visual Studio, einschließlich Language Integrated Query (LINQ), Windows® Presentation Foundation (WPF), Windows Communications Foundation (WCF) und .NET Framework 3.5. Außerdem weist VSTO viele neue, auf 2007 Microsoft Office System ausgerichtete Features auf, einschließlich visueller Designer, mit denen Sie mühelos benutzerdefinierte Formularbereiche erstellen und die Multifunktionsleiste anpassen können. Sie können auf Dokumentebene und auf Anwendungsebene benutzerdefinierte Aufgabenbereiche erstellen sowie Workflowlösungen auf Basis von Office SharePoint® Server 2007 auf einfache Weise erstellen und debuggen. VSTO-Lösungen sind dank vollständiger Unterstützung für ClickOnce einfach bereitzustellen. Außerdem können Sie mit VSTO Ihre vorhandenen Investitionen in VBA durch die Erweiterung der bestehenden Lösungen mit verwaltetem Code effektiv nutzen.

Unterschiede bei den Sprachfeatures
Es gibt einige Unterschiede bei den Sprachfeatures, die in VBA und Visual Basic verfügbar sind. Einige der wichtigsten betreffen Datentypen, Anweisungen und neue Sprachfeatures. So entspricht beispielsweise der Datentyp Integer in VBA dem Datentyp Short in Visual Basic und der Datentyp Long in VBA dem Datentyp Integer in Visual Basic. Es gibt auch einige Datentypen, die in Visual Basic nicht mehr unterstützt werden, wie z. B. Variant: Sie können stattdessen den Object-Datentyp verwenden.
Die in VBA weit verbreiteten Standardeigenschaften werden in Visual Basic oder VSTO nicht unterstützt. So können Sie zum Beispiel der Range-Eigenschaft eines Absatzes nicht wie in VBA eine Zeichenfolge zuweisen. Sie müssen stattdessen wie im folgenden Code die Text-Eigenschaft angeben:
‘ VBA
Me.Application.ActiveDocument.Paragraphs(1).Range = _
    “This is my first paragraph.”

‘ Visual Basic
Me.Application.ActiveDocument.Paragraphs(1).Range.Text = _
    “This is my first paragraph.”
Sie haben weiterhin Zugriff auf viele der VBA-spezifischen Sprachfeatures wie MsgBox, obwohl Visual Basic auch die Verwendung von MessageBox unterstützt. Obwohl auch die OnError-Anweisung in Visual Basic weiterhin unterstützt wird, sollten Sie die Verwendung der strukturierten Fehlerbehandlung in Erwägung ziehen, die von Try/Catch-Anweisungen bereitgestellt wird.
Die Unterschiede zwischen VBA und Visual Basic werden mit jeder neuen veröffentlichten Version von Visual Basic größer. Einige der neuen Features von Visual Basic 9.0 umfassen lokalen Typrückschluss, Objektinitialisierer, anonyme Typen, Erweiterungsmethoden, XML-Integration und LINQ.
Jetzt kann Visual Basic zum Beispiel den Typ einer lokalen Variablen durch Auswertung des ihr zugewiesenen Werts bestimmen, was als lokaler Typrückschluss bezeichnet wird. Obwohl der Datentyp nicht angegeben wird, darf dies nicht mit der dynamischen Bindung verwechselt werden, bei der der Datentyp zur Laufzeit bestimmt wird. Der lokale Typrückschluss erfolgt zur Entwurfszeit (frühe Bindung), und alle Vorteile wie z. B. IntelliSense® sind verfügbar, wie Sie Abbildung 1 entnehmen können.
Abbildung 1 IntelliSense ist dank früher Bindung mit lokalem Typrückschluss verfügbar (Klicken Sie zum Vergrößern auf das Bild)
Mit LINQ können Sie mithilfe einer vertrauten, in die Visual Basic-Sprache integrierten Syntax Abfragen erstellen, anstatt eine völlig andere Abfragesprache wie SQL oder XQuery lernen zu müssen.

Steuern der Benutzeroberfläche
In typischen VBA-Lösungen werden die Einstiegspunkte in den Code durch Elemente der Benutzeroberfläche wie Symbolleisten und Menüs zur Verfügung gestellt oder durch Erstellen von UserForms, um Eingaben von Endbenutzern zu erfassen. Mit VSTO können Sie ähnliche Elemente der Benutzeroberfläche anpassen, und je nach Office-Anwendung können Sie zusätzliche Elemente der Benutzeroberfläche anpassen. Unabhängig davon, ob Sie mithilfe von VBA oder VSTO eine Lösung erstellen, erfassen Sie die Benutzereingaben durch Steuerelemente, die Sie in der Benutzeroberfläche bereitstellen. Sie können den Symbolleisten, Menüs, Formularen, Dokumenten, Aufgabenbereichen, der Multifunktionsleiste und weiteren Elementen Steuerelemente hinzufügen. Der wirkliche Unterschied liegt somit in Typ und Anzahl der Steuerelemente und den verfügbaren Arten von Benutzeroberflächen, die diese Steuerelemente enthalten können.
Wenn Sie mithilfe von VBA eine Office-Anwendung erstellen, unterscheiden sich die Formulare von denen, die Sie mit VSTO erstellen. Mit VBA besteht Ihre einzige Option in der Anzeige einer UserForm, und die zur Verwendung auf diesem Formulartyp verfügbaren ActiveX®-Steuerelemente sind begrenzt. VSTO unterstützt hingegen eine Vielzahl von Windows Forms-Steuerelementen. Sie können immer ein Windows Forms-Steuerelement finden, das der Funktionalität der Steuerelemente entspricht, die einer UserForm zur Verfügung stehen (auch wenn der Name des Steuerelements möglicherweise anders lautet). So entspricht zum Beispiel ein OptionButton auf einem Windows Form einem RadioButton in VSTO. Obwohl Sie in einem VSTO-Projekt in der Toolbox kein ToggleButton-Element finden werden, können Sie ein CheckBox-Steuerelement verwenden und seine Appearance-Eigenschaft auf „Button“ setzen. Die Namen der Eigenschaften, Methoden und Ereignisse dieser Arten von Steuerelementen weichen möglicherweise ebenfalls voneinander ab, Sie können jedoch in der Regel ein Äquivalent finden. Statt wie in VBA die Caption-Eigenschaft einer Beschriftung festzulegen, legen Sie in VSTO die Text-Eigenschaft der Beschriftung fest.
Die zahlreichen verfügbaren Windows Forms-Steuerelemente bieten erweiterte Funktionalität und ermöglichen Ihnen die Erstellung einer viel professionelleren Benutzeroberfläche für Ihre Anwendung, als Sie dies mit UserForms erreichen könnten. Da VSTO-Lösungen in Visual Studio erstellt werden, haben Sie Zugriff auf viele Features, die im VBA-Code-Editor nicht verfügbar sind, wie z. B. das Datenquellenfenster, mit dem Sie datengebundene Steuerelemente direkt einem Windows Form hinzufügen können. Sie können auch einige der neuen Sprachfeatures von Visual Basic und Visual C#® verwenden, mit deren Hilfe Sie über LINQ-Abfragen ein ListBox- oder ComboBox-Steuerelement ausfüllen können.
Sie können Ihrer Anwendung mit VSTO WPF-Steuerelemente hinzufügen, indem Sie im Dialogfeld „Add New Item“ (Neues Element hinzufügen) ein WPF-Benutzersteuerelement auswählen und es entwerfen, indem Sie entweder WPF-Steuerelemente aus der Toolbox ziehen oder dem XML-Fenster XAML-Markup hinzufügen. Fügen Sie Ihrem Projekt dann ein Benutzersteuerelement hinzu, und ziehen Sie ein ElementHost-Steuerelement von der Registerkarte „WPF Interoperability“ (Interoperabilität mit WPF) der Toolbox zum Steuerelement. Wenn Sie die Child-Eigenschaft dieses Steuerelements auf das WPF-Benutzersteuerelement festlegen, werden alle WPF-Steuerelemente auf dem Windows Form gehostet. Jetzt können Sie dieses Steuerelement einem Windows Form, der Oberfläche des Dokuments oder einem Aufgabenbereich hinzufügen.
Aufgabenbereiche Seit Office 2003 können Sie den Office-Aufgabenbereich so anpassen, dass die gleiche Art von Benutzeroberfläche bereitgestellt wird, die ein Windows Form ermöglicht, jedoch mit dem zusätzlichen Vorteil, dass Sie den Aufgabenbereich außerhalb der Dokumentoberfläche andocken können. Eine Anpassung des Aufgabenbereichs ist bei VBA unmöglich. Mit VSTO lassen sich zwei Arten von Aufgabenbereichen anpassen: Aufgabenbereiche „Dokumentaktionen“ und benutzerdefinierte Aufgabenbereiche.
Der Aufgabenbereich „Dokumentaktionen“ ist ein Aufgabenbereich auf Dokumentebene, der nur für Dokumente oder Arbeitsmappen sichtbar ist, die der VSTO-Anpassung zugeordnet sind. Sie können pro Dokument oder Arbeitsmappe nur einen Aufgabenbereich „Dokumentaktionen“ haben. Sie passen diesen Aufgabenbereich auf Dokumentebene über das ActionsPane-Objekt an, wenn Sie in VSTO ein Microsoft Word- oder Excel®-Dokumentprojekt oder -Vorlagenprojekt erstellen.
Um den Aufgabenbereich auf Dokumentebene anzupassen, fügen Sie der Controls-Auflistung des ActionsPane-Objekts eine Instanz des Benutzersteuerelements hinzu. Sie können nicht den Namen ändern, der als Titel des Aufgabenbereichs angezeigt wird:
Dim TaskPaneControl As New UserControl1
Me.ActionsPane.Controls.Add(TaskPaneControl)
Mit 2007 Microsoft Office System wird eine neue Art von Aufgabenbereich eingeführt, die als benutzerdefinierter Aufgabenbereich bezeichnet wird und anpassbar ist, wenn Sie mit VSTO Add-Ins auf Anwendungsebene erstellen. Sie können den Aktionsbereich sowohl in der Version 2003 als auch in der Version 2007 von Word und Excel anpassen, benutzerdefinierte Aufgabenbereiche sind jedoch in der Version 2007 von fünf Anwendungen verfügbar (und folglich anpassbar): Word, Excel, InfoPath®, Outlook® und PowerPoint®.
In einem benutzerdefinierten Aufgabenbereich kann die gleiche Art von Windows Forms-Steuerelementen angezeigt werden wie in einem Aufgabenbereich auf Dokumentebene. Ein benutzerdefinierter Aufgabenbereich ist jedoch auf der Anwendungsebene verfügbar, und Sie können innerhalb Ihrer Lösung mehrere benutzerdefinierte Aufgabenbereiche anzeigen. Unabhängig davon, ob Sie sich für eine Anpassung des Aufgabenbereichs auf Anwendungsebene oder auf Dokumentebene entscheiden, ist der Prozess sehr ähnlich.
Um den benutzerdefinierten Aufgabenbereich auf Anwendungsebene anzupassen, fügen Sie der CustomTaskPanes-Auflistung eine Instanz des Benutzersteuerelements hinzu und übergeben den Titel, der im Aufgabenbereich angezeigt werden soll:
Dim CustomTaskPaneControl As New UserControl1
Me.CustomTaskPanes.Add(CustomTaskPaneControl, “Format Document”)
Unabhängig davon, ob Sie Office 2003-Lösungen mit VBA oder VSTO erstellen, können Sie die Symbolleisten und die Menüs anpassen. In der Regel rufen Sie ein Makro aus der OnAction-Eigenschaft einer Schaltfläche auf der Symbolleiste oder in einem Menü auf. Bei Verwendung von VSTO müssen Sie die neuen Menü- oder Symbolleistenelemente programmgesteuert statt mithilfe der OnAction-Eigenschaft erstellen (die nicht so eingestellt werden kann, dass sie verwalteten Code aufruft). Außerdem müssen Sie für die Schaltfläche einen Ereignishandler erstellen. Mit 2007 Office System wird die Office Fluent-Oberfläche eingeführt, die die Multifunktionsleiste umfasst. In den meisten 2007 Office System-Anwendungen werden Symbolleisten und Menüs durch die Multifunktionsleiste ersetzt, obwohl Sie im Hauptfenster von Outlook 2007 weiterhin Menüs und Symbolleisten vorfinden.
Sie können VBA verwenden, um die Multifunktionsleiste mithilfe von RibbonX anzupassen, aber VSTO macht es Ihnen noch leichter, da ein Designer für die Multifunktionsleiste bereitgestellt wird, mit dem Sie der Multifunktionsleiste neue Registerkarten, Gruppen und Steuerelemente ebenso intuitiv hinzufügen können wie einem Windows Form ein Steuerelement. Sie können Schaltflächen aus der Toolbox (in der Registerkarte „Ribbon Designer“) zum Ribbon Designer ziehen, Eigenschaften der Schaltfläche wie z. B. ihre Größe festlegen und Ereignishandler für das Click-Ereignis der Schaltfläche erstellen. Alternativ können Sie die Multifunktionsleiste mit mehreren anderen Steuerelementen unter Verwendung des Ribbon XML-Projektelements anpassen. Abbildung 2 zeigt die Projektelemente „Ribbon (Visual Designer)“ (Multifunktionsleiste (Visueller Designer)) und „Ribbon (XML)“ (Multifunktionsleiste (XML)), die in der Registerkarte „Office“ des Dialogfelds „Neues Element hinzufügen“ verfügbar sind.
Abbildung 2 Multifunktionsleisten-Projektelemente in VSTO (Klicken Sie zum Vergrößern auf das Bild)
Diese Anpassungsoptionen für die Multifunktionsleiste sind sowohl für Add-Ins auf Anwendungsebene als auch für Anpassungen auf Dokumentebene verfügbar, die die Multifunktionsleiste unterstützen. Sie können zum Beispiel eine Anpassung der Multifunktionsleiste auf Dokumentebene für eine Word-Vorlagenlösung erstellen, die Dienstleistungsangebote für ein Ingenieurbüro zusammenstellt.
Eine Multifunktionsleiste besteht aus drei Teilen: einer Registerkarte, einer Gruppe und den Steuerelementen, die Sie einer Gruppe hinzufügen. Mit dem Ribbon Designer in VSTO können Sie schnell eine vorhandene Registerkarte anpassen oder eine separate Registerkarte erstellen, die die gesamte Funktionalität für Ihre Anwendung enthält. Die Toolbox in Abbildung 3 listet alle Office-Multifunktionsleisten-Steuerelemente auf, die in einer Word-Lösung verfügbar sind. Wenn Sie ein Steuerelement zum Designer ziehen, können Sie Eigenschaften festlegen: z. B. seine Größe, seinen Text und ob im Eigenschaftenfenster ein Bild enthalten sein soll. Einige Steuerelemente können andere Steuerelemente enthalten. Abbildung 4 zeigt beispielsweise ein „Employees Menu“-Steuerelement, das eine Reihe von SplitButton-Steuerelementen enthält, die ihrerseits eine Reihe von Schaltflächen enthalten.
Abbildung 3 „Employees Menu“-Steuerelement im Designer (Klicken Sie zum Vergrößern auf das Bild)
Abbildung 4 Menübilder in der Darstellung (Klicken Sie zum Vergrößern auf das Bild)
Sie können ein integriertes Bild verwenden, indem Sie dessen Namen in der OfficeImageId-Eigenschaft eines Steuerelements angeben, oder Sie können leicht ein eigenes benutzerdefiniertes Bild hinzufügen. Sie können einem Steuerelement benutzerdefinierte Bilder hinzufügen, indem Sie ein Bild angeben, das dem Projekt als Ressource in der Image-Eigenschaft hinzugefügt wurde. Wenn Sie ein Bild aus einer Ressource hinzufügen, wird es im Designer wie in der Gruppe „PEPs“ in Abbildung 3 angezeigt. Wenn Sie hingegen integrierte Bilder verwenden, wird im Designer stattdessen ein Platzhalterbild angezeigt. Wenn Sie die Anwendung ausführen, werden die Bilder wie in Abbildung 4 angezeigt.
Einer der Vorteile bei der Verwendung des Ribbon Designer gegenüber Ribbon XML besteht darin, dass Sie die Ereignishandler für diese Steuerelemente auf die gleiche Weise erstellen können wie für Steuerelemente auf einem Windows Form. Wenn Sie zum Beispiel auf das Kombinationsfeld „Title“ (Titel) doppelklicken, können Sie den in Abbildung 5 gezeigten Code dem Title_TextChanged-Ereignishandler hinzufügen, um den Titel in das Dokument einzufügen. Ribbon XML ermöglicht erweiterte Anpassungen, die im Ribbon Designer nicht verfügbar sind. Sie können die Anpassung der Multifunktionsleiste nach Ribbon XML exportieren, um Ihre Lösung weiter anzupassen, aber Sie können Ribbon XML nicht wieder in den Designer importieren. Sie müssen auch eine Rückrufmethode für jeden Ereignishandler erstellen, der im Ribbon Designer-Code enthalten war.
Private Sub Title_TextChanged(ByVal sender As System.Object, _
    ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
        Handles Title.TextChanged

    With Globals.ThisDocument.Paragraphs(1)
        .Range.Text = Me.Title.Text & “ Proposal”
        .Range.Font.AllCaps = True
        .Range.Font.Bold = True
        .Range.ParagraphFormat.Alignment = _
            Word.WdParagraphAlignment.wdAlignParagraphCenter
    End With

End Sub


Bereitstellen von VSTO-Lösungen
Das Sicherheits- und Bereitstellungsmodell von VSTO unterscheidet sich erheblich von dem von VBA. In VBA wird der Quellcode im Dokument selbst gespeichert, sodass die Bereitstellung des Codes so einfach ist wie das Kopieren des Dokuments. Obwohl dieses Modell die Bereitstellung sehr einfach macht, wird das Vertrauen in den VBA-Code fraglicher, wie die vielen VBA-Makroviren beweisen, die entwickelt wurden. Ein weiteres Problem mit dem VBA-Modell des eingebetteten Codes wird deutlich, wenn Sie versuchen, eine neue Version bereitzustellen: Sie können den VBA-Code in Ihren Dokumenten nicht aktualisieren. Sie könnten jedes Dokument öffnen, um den VBA-Code darin zu ändern, aber wie garantieren Sie, dass Sie jede Kopie aktualisiert haben? Selbst in einer kleinen Gruppe finden Sie möglicherweise nicht jede Instanz, da Dokumente in E-Mails und auf Servern gespeichert werden oder möglicherweise umbenannt wurden.
In VSTO wird der Code tatsächlich mit dem Dokument verknüpft, wobei er an einem zentralen Speicherort bereitgestellt wird und alle Dokumente einfach mit dem Code verknüpft werden. Dadurch wird die Aktualisierung zum Kinderspiel. VSTO unterstützt die Veröffentlichung auf lokalen Laufwerken, UNC-Pfaden, HTTP-Sites und Wechselmedien wie CDs, DVDs und USB-Laufwerken. Der Entwickler oder Administrator veröffentlicht eine neue Version des Codes, und jeder Benutzer erhält den neuen Code, wenn das Dokument erneut geöffnet wird. Darüber hinaus bietet VSTO vollständige Unterstützung für ClickOnce, die Technologie, mit der VSTO den Code lokal veröffentlichen, aktualisieren und zwischenspeichern kann. Obwohl vollständige Erläuterungen zu ClickOnce den Rahmen dieses Artikels sprengen würden, werden Sie einige der Features kennen lernen, die für VSTO-Lösungen gelten.
Sie installieren ein Add-In auf die gleiche Weise wie jede andere Anwendung, indem Sie ein Installationsprogramm mit dem Namen „setup.exe“ ausführen, das den Benutzer auffordert, dem Setupprogramm die Installation, die Registrierung und die Festlegung der Vertrauensebene zu gestatten. Sie brauchen sich keine obskuren Registrierungsschlüssel oder komplexen Caspol.exe-Befehle mehr zu merken, um das Add-In zu installieren. Stattdessen können Sie das Veröffentlichungsfeature von VSTO verwenden, um das Setup.exe-Programm und die unterstützenden ClickOnce-Dateien zu erstellen.
Das Bereitstellungsfeature wird von allen 2007 Office System-Anwendungen unterstützt, die VSTO verwenden. Als Beispiel für die Verwendung von VSTO zur Veröffentlichung einer Lösung können Sie mit der Erstellung eines standardmäßigen Word 2007-Add-Ins mithilfe von Visual Basic beginnen. Doppelklicken Sie auf ThisAddin.vb, um das Codefenster zu öffnen. (Sie müssen auch einen Verweis auf die System.Deployment-Assembly hinzufügen. Dies wird von VSTO zwar nicht für die Bereitstellung verlangt, aber damit der Beispielcode die ClickOnce-Versionsinformationen anzeigt, müssen Sie einige Funktionen in dieser Assembly verwenden.) Fügen Sie dem Startup-Ereignis des Add-Ins den Code in Abbildung 6 hinzu. Der Code verwendet IsNetworkDeployed, um festzustellen, ob die Ausführung vom ClickOnce-Cache aus erfolgt. Ist dies der Fall, möchten Sie die Nummer der veröffentlichten Version der Anwendung anzeigen, die von der CurrentVersion-Eigenschaft des CurrentDeployment-Objekts zurückgegeben wird. Die CurrentVersion-Nummer entspricht den Feldern „Veröffentlichungsversion“ der Registerkarte „Veröffentlichen“ in den Eigenschaftenseiten des Projekts in Abbildung 7. Diese zeigt auch die Anwendungsversion an, bei der es sich um die Version des Assemblysatzes auf der Registerkarte „Application“ (Anwendung) handelt. Überprüfen Sie zunächst, ob die Anwendung funktioniert, indem Sie F5 drücken, um sie auszuführen. Word sollte geöffnet werden und ein Dialogfeld mit dem Text „Not a ClickOnce Application“ (Keine ClickOnce-Anwendung) angezeigt werden. Dies ist korrekt, da Sie die Anwendung von VSTO aus ausgeführt haben. Schließen Sie Word, um das Debuggen zu beenden.
If Not System.Deployment.Application.ApplicationDeployment _
        .IsNetworkDeployed Then

    ‘This is a ClickOnce Application
    Dim currentVersion As String
    currentVersion = System.Deployment.Application _
        .ApplicationDeployment.CurrentDeployment _
            .CurrentVersion.ToString()

    MsgBox(“Started “ & vbCrLf & “ App Version:” _
        & My.Application.Info.Version.ToString() & vbCrLf & _
        “ Published Version “ & currentVersion)
Else
    MsgBox(“Not a ClickOnce Application”)
End If

Abbildung 7 Das Add-In-Projekt (Klicken Sie zum Vergrößern auf das Bild)
Öffnen Sie die Eigenschaftenseite des Projekts, und klicken Sie auf die Registerkarte „Veröffentlichen“, um die Veröffentlichungseinstellungen anzuzeigen, die zwei Eigenschaften enthalten: den Veröffentlichungsort und den Installationsort. VSTO erstellt dann das veröffentlichte Projekt am Veröffentlichungsort. Stellen Sie sich diesen als das BIN-Verzeichnis für die Veröffentlichung vor, den endgültigen Bereitstellungsort der Lösung. Der Administrator kann den Veröffentlichungsort ändern und das Manifest mit dem Tool zum Generieren und Bearbeiten von ClickOnce-Manifesten (Mage.exe) neu signieren. Im Abschnitt „Install Settings“ (Installationseinstellungen) können Sie die Voraussetzungen und die Aktualisierungsfrequenz festlegen. Aus Gründen der Leistungsfähigkeit wird standardmäßig alle sieben Tage auf neue Versionen geprüft. Ändern Sie dies in „Check every time the customization runs“ (Bei jeder Ausführung der Anpassung prüfen), damit Sie die Änderungen sofort sehen können. Sie können die Veröffentlichungsversion mithilfe des Standardformats für Hauptversion, Nebenversion, Build und Revision festlegen. Gemäß Standardeinstellung wird die Revisionsnummer bei jeder erfolgreichen Veröffentlichung automatisch erhöht. Wenn alle diese Eigenschaften richtig eingestellt sind, klicken Sie nur noch auf die Schaltfläche „Jetzt veröffentlichen“ unten auf der Seite.
Der Veröffentlichungs-Assistent erstellt am Veröffentlichungsort eine Setup.exe-Bootstrapper-Datei und eine VSTO-Bereitstellungsmanifestdatei. Er erstellt auch ein Unterverzeichnis, das mit der Versionsnummer benannt wird, und speichert dort die Assemblys und die Anwendungsmanifestdatei. Wenn Sie erneut veröffentlichen, werden ein anderes Unterverzeichnis und eine neue VSTO-Bereitstellungsmanifestdatei erstellt, die auf die aktuelle Version des Anwendungsmanifests verweist. Wie Sie in Abbildung 8 sehen, gibt es zwei veröffentlichte Versionen des Add-Ins: 1.0.0.0 und 1.0.0.1. Es sind auch zwei Sicherungskopien der Bereitstellungsmanifestdateien vorhanden: DeployWordAddin_1_0_0_0.vsto und DeployWordAddin_1_0_0_1.vsto. Diese dienen nur dazu, Ihnen die Rückkehr zu einer bestimmten Version zu erleichtern. Wenn Sie zum Beispiel zu Version 1.0.0.0 zurückkehren möchten, benennen Sie einfach DeployWordAddin_1_0_0_0.vsto in DeployWordAddin.vsto um. Dann ruft die Anwendung bei der nächsten Überprüfung auf Aktualisierungen die Version 1.0.0.0 ab.
Abbildung 8 Word-Add-In-Versionen (Klicken Sie zum Vergrößern auf das Bild)
Dokumentlösungen funktionieren auf die gleiche Weise, außer dass das Dokument auch im Veröffentlichungsordner veröffentlicht wird und eine Kopie im Versionsunterverzeichnis veröffentlicht wird. Sie müssen Setup.exe nicht ausführen: Um die Dokumentlösung zu installieren, können Sie einfach das Dokument öffnen. Sie werden dann aufgefordert, die Installation der Lösung zuzulassen. So können Sie die Lösung an einem zentralen Speicherort veröffentlichen und dann das Dokument an die Benutzer verteilen.
Sobald Sie die Lösung veröffentlicht haben, können die Benutzer sie durch Ausführen des Setup.exe-Bootstrappers installieren, der dann die ClickOnce-Installation startet. Das Sicherheitsmodell ist stabiler als in VBA und viel einfacher anzuwenden als frühere Versionen von VSTO. Bei der ersten Prüfung wird kontrolliert, ob die Lösung mit einem vertrauenswürdigen Zertifikat signiert ist. Wenn das Zertifikat vertrauenswürdig ist, wird die Lösung installiert. Andernfalls wird der Benutzer aufgefordert, die Installation zuzulassen. Wie bereits erwähnt, sind Dokumentlösungen fast identisch mit Add-Ins, außer dass Sie die Lösung durch einfaches Öffnen des Dokuments installieren können. Ein Nachteil bei Dokumentlösungen besteht darin, dass der Dokumentspeicherort der Liste vertrauenswürdiger Office-Ordner hinzugefügt werden muss, wenn sich das Dokument nicht auf dem lokalen Computer befindet oder es VBA-Code enthält. Nach der Installation ist die Lösung offline verfügbar, ohne dass sie zuerst ausgeführt werden muss.

Erweitern von VBA mit VSTO
Ein anderes großartiges Feature von VSTO ist die Fähigkeit, parallel zu VBA zu funktionieren. So können Sie Ihre vorhandenen Investitionen in VBA beibehalten und VSTO verwenden, wo es sinnvoll ist. Sie können zum Beispiel mit VSTO mühelos Ihren VBA-Code erweitern, um die Multifunktionsleiste anzupassen, einen benutzerdefinierten Aufgabenbereich zu erstellen oder einen WCF-Dienst aufzurufen.
Die erste Möglichkeit für die Kommunikation zwischen VSTO und VBA besteht darin, dass VSTO VBA-Funktionen aufruft. Sie verwenden das Objektmodell der Office-Anwendung, um die Funktion aufzurufen. So stellt zum Beispiel Excel die Run-Methode zum Aufrufen von VBA-Unterroutinen und -Funktionen bereit. Um die Run-Methode zu verwenden, übergeben Sie den Namen der Unterroutine oder Funktion als ersten Parameter. Die verbleibenden optionalen Parameter werden verwendet, um Daten an die Funktionen zu übergeben. Stellen Sie sich vor, Sie haben eine VBA-Funktion namens „AddNumbers“, die zwei Parameter erfordert und eine ganze Zahl zurückgibt. Der VSTO-Code zum Aufruf dieser VBA-Funktion wäre dann:
Dim answer as integer = Me.Application.Run(“AddNumbers”, 10, 2)
Hierzu ist anzumerken, dass dieser Code fehlschlägt, wenn kein ordnungsgemäßer Zugriff auf die VBA-Makros gewährt wird. Standardmäßig sind VBA-Makros nicht aktiviert. Andererseits wird bei diesem Szenario jedoch davon ausgegangen, dass Sie über vorhandenen VBA-Code verfügen, der ausgeführt werden darf, und dass Sie jetzt diese vorhandenen Makros von VSTO aus aufrufen. Diese Lösung ist auch deshalb anfällig, weil der Benutzer VBA-Code problemlos ändern kann. Dies führt zum Fehlschlagen der Run-Methode. Außerdem steht Ihnen keine IntelliSense-Unterstützung zur Verfügung, wodurch häufiger Fehler auftreten können. Sie müssen Ihren Code defensiv schreiben, um diese Fälle zu behandeln.
Die zweite Möglichkeit für die Kommunikation zwischen VSTO und VBA besteht darin, dass VBA VSTO-Funktionen aufruft. Dies war bisher nur in sehr begrenzter und fehleranfälliger Weise möglich, ist aber jetzt in VSTO integriert. Das übliche Szenario für dieses Feature besteht darin, dass Sie ein vorhandenes Excel-Dokument haben, das VBA-Code enthält, und Sie jetzt zusätzliche Funktionalität hinzufügen möchten, die mit VSTO in verwaltetem Code geschrieben wurde.
Ein anderes verbreitetes Szenario ist, dass die IT-Abteilung in VSTO eine Funktionalitätsbibliothek erstellt, die vom VBA-Benutzer verwendet werden soll. Möglicherweise möchten Sie einfach ein Excel 2007-Arbeitsmappenprojekt mit aktivierten Makros erstellen, aber zunächst benötigen Sie eine vorhandene Arbeitsmappe, die VBA-Code enthält. Erstellen Sie eine neue Arbeitsmappe, fügen Sie VBA-Code hinzu, und speichern Sie diese als Arbeitsmappe mit Makros unter dem Namen „VBAInterop.xlsm“. Öffnen Sie Visual Studio „Orcas“, und erstellen Sie ein neues Visual Basic Excel 2007-Projekt.
Wenn Sie im neuen Projektdialogfeld aufgefordert werden, ein Dokument für Ihre Anwendung auszuwählen, dann wählen Sie „Vorhandenes Dokument kopieren“, und navigieren Sie zur Datei „VBAInterop.xlsm“, die Sie gerade erstellt haben. So können Sie VBA-Makros hinzufügen, die Funktionen in der mit dem Dokument verbundenen VSTO-Lösung aufrufen. Wenn Sie eine neue Installation von Visual Studio verwenden, werden Sie möglicherweise durch eine Warnmeldung darauf hingewiesen, dass Sie den Zugriff auf das VBA-Projektsystem zulassen müssen. Klicken Sie zur Genehmigung auf „OK“, und das Projekt wird erstellt.
Speichern Sie das Projekt nach seiner Erstellung durch Klicken auf „Datei“ | „Alles speichern“. Der Standardspeicherort ist für dieses Beispiel in Ordnung. Doppelklicken Sie im Projektmappen-Explorer auf ThisWorkbook.vb, um den Designer für die Arbeitsmappe zu öffnen. Sie können jede beliebige, von Ihnen gewählte Ansicht für VBA verfügbar machen. Eine Ansicht in VSTO ist das Objekt der höchsten Ebene, das im Projektmappen-Explorer als Datei unter dem Dokumentknoten dargestellt wird. Excel bietet standardmäßig vier Ansichten, eine für die Arbeitsmappe und eine für jedes Arbeitsblatt. Demgegenüber bietet Word nur eine Ansicht: das Dokument. Sie machen die Arbeitsmappenansicht für VBA verfügbar, indem Sie im Eigenschaftenraster der Datei „ThisWorkbook.vb“ eine Eigenschaft festlegen.
Zwei Eigenschaften steuern das Interoperabilitätsverhalten von VBA: EnableVbaCallers und ReferenceAssemblyFromVbaProject. Sie müssen nur EnableVbaCallers auf „True“ einstellen. ReferenceAssemblyFromVbaProject wird dann automatisch ebenfalls auf „True“ eingestellt. ReferenceAssemblyFromVbaProject unterstützt erweiterte Szenarios für die Interoperabilität mit VBA und geht über den Rahmen dieses Artikels hinaus.
Wenn Sie EnableVbaCallers auf „True“ einstellen, werden Sie durch eine Warnmeldung darauf hingewiesen, dass VBA-Code, den Sie beim Debuggen des Projekts schreiben, nicht im Projekt gespeichert wird. Ihr VSTO-Projekt enthält das Office-Dokument. Wenn Sie das Projekt erstellen und debuggen/ausführen, erstellt VSTO eine Kopie des Dokuments im Ausgabeverzeichnis. Ausgeführt wird diese Kopie, sodass von Ihnen vorgenommene Änderungen nicht in das zum Projekt gehörige Dokumentexemplar zurückgespeichert werden. Wenn Sie wünschen, dass Ihr VBA-Code im Dokument persistent gespeichert wird, müssen Sie das Dokument im Projekt außerhalb von VSTO öffnen und den VBA-Code hinzufügen.
Nachdem Sie nun die Interoperabilität mit VBA aktiviert haben, können Sie eine Funktion für den Aufruf durch VBA hinzufügen. Klicken Sie mit der rechten Maustaste auf ThisWorkbook.vb, und wählen Sie „Code anzeigen“ aus. Erstellen Sie eine Funktion, die zwei Zahlen addiert und das Ergebnis zurückgibt:
   Public Function AddNumbers (ByVal _
     x As Integer, _
     ByVal y As Integer) As Integer
       Return x + y
   End Function
Jetzt können Sie die Lösung durch Drücken von F5 ausführen. Drücken Sie nach dem Öffnen der Arbeitsmappe ALT + F11, um den in Abbildung 9 gezeigten VBA-Editor zu öffnen. Sie sehen dann den VBA-Code, der von VSTO generiert wurde, um VBA mit der VSTO-Assembly zu verbinden. Jetzt können Sie vom CallVSTOAssemby-Objekt aus die VSTO-Funktionen mit vollständiger IntelliSense-Unterstützung aufrufen, die die Parameter und Rückgabetypen unterstützt.
Abbildung 9 VBA-Editor (Klicken Sie zum Vergrößern auf das Bild)
Sie sehen, wie leicht Sie Ihren VBA-Code mit VSTO und verwaltetem Code erweitern können. Dies ist ein hervorragendes Verfahren, um Ihrer VBA-Lösung WPF-Dialogfelder hinzuzufügen oder um WCF-Dienste und andere Features von .NET Framework 3.5 aufzurufen. Sie können auch mit benutzerdefinierten Funktionen so verfahren, um verwalteten Code aufzurufen. Sie können diese Lösung sogar vollständig debuggen, indem Sie sowohl im VBA-Code als auch im VSTO-Code Haltepunkte festlegen, mit deren Hilfe Sie zwischen den beiden Entwicklungsumgebungen hin und her wechseln können.
Obwohl die VBA-Unterstützung nicht so bald eingestellt wird, ist jetzt der ideale Zeitpunkt für den Übergang zu verwalteter Office-Entwicklung mit VSTO. In der aktuellen Version von Office und VSTO sind viele neue Features verfügbar, dank derer diese Kombination die produktivste Möglichkeit für die Erstellung hochwertiger Office-Anwendungen darstellt. Weitere Informationen zu VSTO finden Sie im VSTO-Forum auf MSDN®online.

Paul Stubbs ist leitender Programmmanager im Team „Visual Studio-Tools für Office und Visual Tools for Applications“. Er hat gemeinsam mit Kathleen McGrath das Buch VSTO for Mere Mortals (Addison-Wesley, 2006) verfasst. Paul Stubbs war Referent bei der TechEd und der TechReady und beteiligt sich außerdem an der Entwicklercommunity in den Microsoft-Foren. Lesen Sie den Blog von Paul Stubbs unter blogs.msdn.com/pstubbs.

Kathleen McGrath arbeitet bei Microsoft als Redakteurin zum Thema Programmierung. Sie hat Dokumentation für Visual Studio 2005-Tools für Microsoft Office System (VSTO), Visual Studio Tools for Applications (VSTA) und Visual Basic geschrieben. In ihrem Blog unter blogs.msdn.com/kathleen finden Sie ihre Videos über die Features von VSTO und Visual Basic.

Page view tracker