Exemplarische Vorgehensweise: Abrufen von Code aus VBA in einem Visual c#-ProjektWalkthrough: Call code from VBA in a Visual C# project

Diese exemplarische Vorgehensweise veranschaulicht, wie eine Methode in einer Anpassung auf Dokumentebene für Microsoft Office Excel aus VBA-Code (Visual Basic for Applications) in der Arbeitsmappe aufgerufen wird.This walkthrough demonstrates how to call a method in a document-level customization for Microsoft Office Excel from Visual Basic for Applications (VBA) code in the workbook. Das Verfahren umfasst drei grundlegende Schritte: Hinzufügen einer Methode zur Sheet1 -Hostelementklasse, Verfügbarmachen der Methode für VBA-Code und Aufrufen der Methode aus VBA-Code in der Arbeitsmappe.The procedure involves three basic steps: add a method to the Sheet1 host item class, expose the method to VBA code in the workbook, and then call the method from VBA code in the workbook.

Gilt für: Die Informationen in diesem Thema betreffen Projekte auf Dokumentebene für Excel und Word.-Applies to: The information in this topic applies to document-level projects for Excel and Word. Weitere Informationen finden Sie unter verfügbare Funktionen nach Office-Anwendung und Projekttyp.For more information, see Features available by Office application and project type.

Obwohl in dieser exemplarischen Vorgehensweise speziell Excel verwendet wird, gelten die Konzepte in dieser exemplarischen Vorgehensweise auch für Word-Projekte auf Dokumentebene.Although this walkthrough uses Excel specifically, the concepts demonstrated by the walkthrough are also applicable to document-level projects for Word.

In dieser exemplarischen Vorgehensweise werden die folgenden Aufgaben veranschaulicht:This walkthrough illustrates the following tasks:

  • Erstellen einer Arbeitsmappe, die VBA-Code enthältCreating a workbook that contains VBA code.

  • Festlegen des Arbeitsmappenspeicherorts als vertrauenswürdig im Trust Center in ExcelTrusting the location of the workbook by using the Trust Center in Excel.

  • Hinzufügen einer Methode, zur Sheet1 -HostelementklasseAdding a method to the Sheet1 host item class.

  • Extrahieren einer Schnittstelle für die Sheet1 -HostelementklasseExtracting an interface for the Sheet1 host item class.

  • Verfügbarmachen der Methode für VBA-CodeExposing the method to VBA code.

  • Aufrufen der Methode aus VBA-CodeCalling the method from VBA code.

Hinweis

Auf Ihrem Computer werden möglicherweise andere Namen oder Speicherorte für die Benutzeroberflächenelemente von Visual Studio angezeigt als die in den folgenden Anweisungen aufgeführten.Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig.The Visual Studio edition that you have and the settings that you use determine these elements. Weitere Informationen finden Sie unter Personalisieren von Visual Studio-IDE.For more information, see Personalize the Visual Studio IDE.

VoraussetzungenPrerequisites

Zum Abschließen dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:You need the following components to complete this walkthrough:

Erstellen einer Arbeitsmappe, die VBA-Code enthältCreate a workbook that contains VBA code

Im ersten Schritt wird eine Arbeitsmappe mit Makros erstellt, die ein einfaches VBA-Makro enthält.The first step is to create a macro-enabled workbook that contains a simple VBA macro. Bevor Sie Code in einer Anpassung für VBA verfügbar machen können, muss die Arbeitsmappe bereits VBA-Code enthalten.Before you can expose code in a customization to VBA, the workbook must already contain VBA code. Andernfalls kann Visual Studio das VBA-Projekt nicht ändern, um dem VBA-Code das Aufrufen der Anpassungsassembly zu ermöglichen.Otherwise, Visual Studio cannot modify the VBA project to enable VBA code to call into the customization assembly.

Wenn Sie bereits über eine Arbeitsmappe mit VBA-Code verfügen, den Sie verwenden möchten, können Sie diesen Schritt überspringen.If you already have a workbook that contains VBA code that you want to use, you can skip this step.

So erstellen Sie eine Arbeitsmappe, die VBA-Code enthältTo create a workbook that contains VBA code

  1. Starten Sie Excel.Start Excel.

  2. Speichern Sie das aktive Dokument als Excel-Macro-Enabled Arbeitsmappe ( * . xlsm) mit dem Namen WorkbookWithVBA.Save the active document as an Excel Macro-Enabled Workbook (*.xlsm) with the name WorkbookWithVBA. Speichern Sie es an einem geeigneten Speicherort, z. B. auf dem Desktop.Save it to a convenient location, such as the desktop.

  3. Klicken Sie im Menüband auf die Registerkarte Entwickler .On the Ribbon, click the Developer tab.

    Hinweis

    Wenn die Registerkarte Entwickler nicht sichtbar ist, müssen Sie diese zuerst anzeigen.If the Developer tab is not visible, you must first show it. Weitere Informationen finden Sie unter Gewusst wie: Anzeigen der Registerkarte "Entwickler" im Menüband.For more information, see How to: Show the developer tab on the ribbon.

  4. Klicken Sie in der Gruppe Code auf Visual Basic.In the Code group, click Visual Basic.

    Der Visual Basic-Editor wird geöffnet.The Visual Basic Editor opens.

  5. Doppelklicken Sie im Projektfenster auf DieseArbeitsmappe.In the Project window, double-click ThisWorkbook.

    Die Codedatei für das ThisWorkbook -Objekt wird geöffnet.The code file for the ThisWorkbook object opens.

  6. Fügen Sie der Codedatei den folgenden VBA-Code hinzu.Add the following VBA code to the code file. Dieser Code definiert eine einfache Funktion, die keine Aktion ausführt.This code defines a simple function that does nothing. Diese Funktion soll lediglich sicherstellen, dass ein VBA-Projekt in der Arbeitsmappe vorhanden ist.The only purpose of this function is to ensure that a VBA project exists in the workbook. Dies ist für spätere Schritte in dieser exemplarischen Vorgehensweise erforderlich.This is required for later steps in this walkthrough.

    Sub EmptySub()
    End Sub
    
  7. Speichern Sie das Dokument, und beenden Sie Excel.Save the document and exit Excel.

Erstellen des ProjektsCreate the project

Jetzt können Sie ein Projekt auf Dokumentebene für Excel erstellen, das die zuvor erstellte Arbeitsmappe mit Makros verwendet.Now you can create a document-level project for Excel that uses the macro-enabled workbook you created earlier.

So erstellen Sie ein neues ProjektTo create a new project

  1. Starten Sie Visual StudioVisual Studio.Start Visual StudioVisual Studio.

  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.On the File menu, point to New, and then click Project.

  3. Erweitern Sie im Vorlagenbereich Visual C# und dann Office/SharePoint.In the templates pane, expand Visual C#, and then expand Office/SharePoint.

  4. Wählen Sie den Knoten Office-Add-Ins aus.Select the Office Add-ins node.

  5. Wählen Sie in der Liste der Projektvorlagen das Projekt Excel 2010-Arbeitsmappe oder Excel 2013-Arbeitsmappe aus.In the list of project templates, select the Excel 2010 Workbook or Excel 2013 Workbook project.

  6. Geben Sie im Feld Name die Zeichenfolge CallingCodeFromVBA ein.In the Name box, type CallingCodeFromVBA.

  7. Klicken Sie auf OK.Click OK.

    Der Projekt-Assistent aus Visual Studio Tools for Office wird geöffnet.The Visual Studio Tools for Office Project Wizard opens.

  8. Wählen Sie Vorhandenes Dokument kopieren aus, und geben Sie im Feld Vollständiger Pfad zum vorhandenen Dokument den Speicherort der zuvor erstellten Arbeitsmappe WorkbookWithVBA an.Select Copy an existing document, and, in the Full path of the existing document box, specify the location of the WorkbookWithVBA workbook that you created earlier. Wenn Sie Ihre eigene Arbeitsmappe mit Makros verwenden, geben Sie stattdessen den Speicherort dieser Arbeitsmappe an.If you are using your own macro-enabled workbook, specify the location of that workbook instead.

  9. Klicken Sie auf Fertig stellen.Click Finish.

    Visual StudioVisual StudioÖffnet die Arbeitsmappe WorkbookWithVBA im Designer und fügt Projektmappen-Explorer das Projekt CallingCodeFromVBA hinzu.opens the WorkbookWithVBA workbook in the designer and adds the CallingCodeFromVBA project to Solution Explorer.

Vertrauensstellung des Speicher Orts der ArbeitsmappeTrust the location of the workbook

Bevor Sie Code in der Projektmappe für VBA-Code in der Arbeitsmappe verfügbar machen können, müssen Sie VBA in der Arbeitsmappe als vertrauenswürdig festlegen, damit es ausgeführt werden kann.Before you can expose code in your solution to VBA code in the workbook, you must trust VBA in the workbook to run. Hierzu stehen mehrere Vorgehensweisen zur Verfügung.There are several ways to do this. In dieser exemplarischen Vorgehensweise führen Sie diese Aufgabe aus, indem Sie den Speicherort der Arbeitsmappe im Trust Center in Excel als vertrauenswürdig festlegen.In this walkthrough, you will accomplish this task by trusting the location of the workbook in the Trust Center in Excel.

So legen Sie den Arbeitsmappenspeicherort als vertrauenswürdig festTo trust the location of the workbook

  1. Starten Sie Excel.Start Excel.

  2. Klicken Sie auf die Registerkarte Datei .Click the File tab.

  3. Klicken Sie auf die Schaltfläche Excel-Optionen .Click the Excel Options button.

  4. Klicken Sie im Bereich "Kategorien" auf Trust Center.In the categories pane, click Trust Center.

  5. Klicken Sie im Detailbereich auf Einstellungen für das Trust Center.In the details pane, click Trust Center Settings.

  6. Klicken Sie im Bereich "Kategorien" auf Vertrauenswürdige Speicherorte.In the categories pane, click Trusted Locations.

  7. Klicken Sie im Detailbereich auf Neuen Speicherort hinzufügen.In the details pane, click Add new location.

  8. Navigieren Sie im Dialogfeld Vertrauenswürdiger Microsoft Office-Speicherort zu dem Ordner mit dem Projekt CallingCodeFromVBA .In the Microsoft Office Trusted Location dialog box, browse to the folder that contains the CallingCodeFromVBA project.

  9. Wählen Sie Unterordner dieses Speicherorts sind ebenfalls vertrauenswürdig aus.Select Subfolders of this location are also trusted.

  10. Klicken Sie im Dialogfeld Vertrauenswürdiger Microsoft Office-Speicherort auf OK.In the Microsoft Office Trusted Location dialog box, click OK.

  11. Klicken Sie im Dialogfeld Trust Center auf OK.In the Trust Center dialog box, click OK.

  12. Klicken Sie im Dialogfeld Excel-Optionen auf OK.In the Excel Options dialog box, click OK.

  13. Beenden Sie Excel.Exit Excel.

Hinzufügen einer Methode zur Sheet1-KlasseAdd a method to the Sheet1 class

Nun, da das VBA-Projekt eingerichtet ist, fügen Sie der Sheet1 -Hostelementklasse eine öffentliche Methode hinzu, die Sie aus VBA-Code aufrufen können.Now that the VBA project is set up, add a public method to the Sheet1 host item class that you can call from VBA code.

So fügen Sie der Sheet1-Klasse eine Methode hinzuTo add a method to the Sheet1 class

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Sheet1.cs, und klicken Sie dann auf Code anzeigen.In Solution Explorer, right-click Sheet1.cs, and then click View Code.

    Die Datei Sheet1.cs wird im Code-Editor geöffnet.The Sheet1.cs file opens in the Code Editor.

  2. Fügen Sie der Sheet1 -Klasse den folgenden Code hinzu.Add the following code to the Sheet1 class. Die CreateVstoNamedRange -Methode erstellt ein neues NamedRange -Objekt im angegebenen Bereich.The CreateVstoNamedRange method creates a new NamedRange object at the specified range. Durch diese Methode wird auch ein Ereignishandler für das Selected -Ereignis von NamedRangeerstellt.This method also creates an event handler for the Selected event of the NamedRange. Weiter unten in dieser exemplarischen Vorgehensweise rufen Sie die CreateVstoNamedRange -Methode aus VBA-Code im Dokument auf.Later in this walkthrough, you will call the CreateVstoNamedRange method from VBA code in the document.

    private Microsoft.Office.Tools.Excel.NamedRange namedRange1;
    
    public void CreateVstoNamedRange(Excel.Range range, string name)
    {
        if (!this.Controls.Contains(name))
        {
            namedRange1 = this.Controls.AddNamedRange(range, name);
            namedRange1.Selected += new Excel.DocEvents_SelectionChangeEventHandler(
                    namedRange1_Selected);
        }
        else
        {
            MessageBox.Show("A named range with this specific name " +
                "already exists on the worksheet.");
        }
    }
    
    private void namedRange1_Selected(Microsoft.Office.Interop.Excel.Range Target)
    {
        MessageBox.Show("This named range was created by Visual Studio " +
            "Tools for Office.");
    }
    
  3. Füge der Sheet1-Klasse die folgende Methode hinzu.Add the following method to the Sheet1 class. Mit dieser Methode wird die GetAutomationObject -Methode überschrieben, um die aktuelle Instanz der Sheet1 -Klasse zurückzugeben.This method overrides the GetAutomationObject method to return the current instance of the Sheet1 class.

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. Wenden Sie die folgenden Attribute vor der ersten Zeile der Sheet1 -Klassendeklaration an.Apply the following attributes before the first line of the Sheet1 class declaration. Diese Attribute machen die Klasse für COM sichtbar, generieren aber keine Klassenschnittstelle.These attributes make the class visible to COM, but without generating a class interface.

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    

Extrahieren einer Schnittstelle für die Sheet1-KlasseExtract an interface for the Sheet1 class

Bevor Sie die CreateVstoNamedRange -Methode für VBA-Code verfügbar machen können, müssen Sie eine öffentliche Schnittstelle erstellen, die diese Methode definiert, und diese Schnittstelle für COM verfügbar machen.Before you can expose the CreateVstoNamedRange method to VBA code, you must create a public interface that defines this method, and you must expose this interface to COM.

So extrahieren Sie eine Schnittstelle für die Sheet1-KlasseTo extract an interface for the Sheet1 class

  1. Klicken Sie in der Codedatei Sheet1.cs in der Sheet1 -Klasse auf eine beliebige Stelle.In the Sheet1.cs code file, click anywhere in the Sheet1 class.

  2. Klicken Sie im Menü Umgestalten auf Schnittstelle extrahieren.On the Refactor menu, click Extract Interface.

  3. Klicken Sie im Dialogfeld Schnittstelle extrahieren im Feld Öffentliche Member zum Bilden einer Schnittstelle auswählen auf den Eintrag für die CreateVstoNamedRange -Methode.In the Extract Interface dialog box, in the Select public members to form interface box, click the entry for the CreateVstoNamedRange method.

  4. Klicken Sie auf OK.Click OK.

    Visual StudioVisual Studio generiert die neue Schnittstelle ISheet1und ändert die Definition der Sheet1 -Klasse, damit die ISheet1 -Schnittstelle implementiert wird.generates a new interface named ISheet1, and it modifies the definition of the Sheet1 class so that it implements the ISheet1 interface. Visual StudioVisual Studio öffnet außerdem die Datei ISheet1.cs im Code-Editor.also opens the ISheet1.cs file in the Code Editor.

  5. Ersetzen Sie in der Datei ISheet1.cs die ISheet1 -Schnittstellendeklaration durch den folgenden Code.In the ISheet1.cs file, replace the ISheet1 interface declaration with the following code. Dieser Code macht ISheet1 zu einer öffentlichen Schnittstelle und wendet das ComVisibleAttribute -Attribut an, um die Schnittstelle für COM sichtbar zu machen.This code makes the ISheet1 interface public, and it applies the ComVisibleAttribute attribute to make the interface visible to COM.

    [System.Runtime.InteropServices.ComVisible(true)]
    public interface ISheet1
    {
        void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
    }
    
  6. Erstellen Sie das Projekt.Build the project.

Verfügbar machen der Methode für VBA-CodeExpose the method to VBA code

Zum Verfügbarmachen der CreateVstoNamedRange -Methode für VBA-Code in der Arbeitsmappe legen Sie die ReferenceAssemblyFromVbaProject -Eigenschaft für das Sheet1 -Hostelement auf True fest.To expose the CreateVstoNamedRange method to VBA code in the workbook, set the ReferenceAssemblyFromVbaProject property for the Sheet1 host item to True.

So machen Sie die Methode für VBA-Code verfügbarTo expose the method to VBA code

  1. Doppelklicken Sie im Projektmappen-Explorer auf Sheet1.cs.In Solution Explorer, double-click Sheet1.cs.

    Die Datei WorkbookWithVBA wird im Designer mit "Sheet1" geöffnet.The WorkbookWithVBA file opens in the designer, with Sheet1 visible.

  2. Wählen Sie im Fenster Eigenschaften die ReferenceAssemblyFromVbaProject -Eigenschaft aus, und ändern Sie den Wert in True.In the Properties window, select the ReferenceAssemblyFromVbaProject property, and change the value to True.

  3. Klicken Sie in der Meldung, die angezeigt wird, auf OK .Click OK in the message that is displayed.

  4. Erstellen Sie das Projekt.Build the project.

Abrufen der Methode aus VBA-CodeCall the method from VBA code

Jetzt können Sie die CreateVstoNamedRange -Methode aus dem VBA-Code in der Arbeitsmappe aufrufen.You can now call the CreateVstoNamedRange method from VBA code in the workbook.

Hinweis

In dieser exemplarischen Vorgehensweise fügen Sie der Arbeitsmappe VBA-Code beim Debuggen des Projekts hinzu.In this walkthrough, you will add VBA code to the workbook while debugging the project. Der VBA-Code, den Sie diesem Dokument hinzufügen, wird beim nächsten Erstellen des Projekts überschrieben. Visual Studio ersetzt das Dokument im Buildausgabeordner durch eine Kopie des Dokuments aus dem Hauptordner des Projekts.The VBA code you add to this document will be overwritten the next time that you build the project, because Visual Studio replaces the document in the build output folder with a copy of the document from the main project folder. Wenn Sie den VBA-Code speichern möchten, können Sie ihn in das Dokument im Projektordner kopieren.If you want to save the VBA code, you can copy it into the document in the project folder. Weitere Informationen finden Sie unter Kombinieren von VBA und Anpassungen auf Dokument Ebene.For more information, see Combine VBA and document-level customizations.

So rufen Sie die Methode aus VBA-Code aufTo call the method from VBA code

  1. Drücken Sie F5 , um das Projekt auszuführen.Press F5 to run your project.

  2. Klicken Sie auf der Registerkarte Entwickler in der Gruppe Code auf Visual Basic.On the Developer tab, in the Code group, click Visual Basic.

    Der Visual Basic-Editor wird geöffnet.The Visual Basic Editor opens.

  3. Klicken Sie im Menü Einfügen auf Modul.On the Insert menu, click Module.

  4. Fügen Sie dem neuen Modul den folgenden Code hinzu.Add the following code to the new module.

    Dieser Code Ruft die CreateTable -Methode in der Anpassungsassembly auf.This code calls the CreateTable method in the customization assembly. Das Makro greift auf diese Methode zu, indem es die globale GetManagedClass -Methode für den Zugriff auf die Sheet1 -Hostelementklasse verwendet, die Sie für VBA-Code verfügbar gemacht haben.The macro accesses this method by using the global GetManagedClass method to access the Sheet1 host item class that you exposed to VBA code. Die GetManagedClass -Methode wurde beim Festlegen der ReferenceAssemblyFromVbaProject -Eigenschaft weiter oben in dieser exemplarischen Vorgehensweise automatisch generiert.The GetManagedClass method was automatically generated when you set the ReferenceAssemblyFromVbaProject property earlier in this walkthrough.

    Sub CallVSTOMethod()
        Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
        Set VSTOSheet1 = GetManagedClass(Sheet1)
        Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
    End Sub
    
  5. Drücken Sie F5.Press F5.

  6. Klicken Sie in der geöffneten Arbeitsmappe in Sheet1 auf die Zelle A1.In the open workbook, click cell A1 on Sheet1. Vergewissern Sie sich, dass das Meldungsfeld angezeigt wird.Verify that the message box appears.

  7. Beenden Sie Excel, ohne Ihre Änderungen zu speichern.Exit Excel without saving your changes.

Nächste SchritteNext steps

In den folgenden Themen erfahren Sie mehr über das Aufrufen von Code in Office-Projektmappen aus VBA:You can learn more about calling code in Office solutions from VBA in these topics:

Weitere InformationenSee also