Freigeben über


Exemplarische Vorgehensweise: Aufrufen von Code aus VBA in einem Visual C#-Projekt

In dieser Anleitung wird veranschaulicht, wie Sie eine Methode in einer Dokumentenanpassung für Microsoft Office Excel mit VBA-Code (Visual Basic for Applications) in der Arbeitsmappe aufrufen. Die Prozedur umfasst drei grundlegende Schritte: Hinzufügen einer Methode zur Sheet1 Host-Elementklasse, Zugänglichmachen der Methode für VBA-Code in der Arbeitsmappe, und danach Aufrufen der Methode aus VBA-Code in der Arbeitsmappe.

Gilt für: Die Informationen in diesem Thema gelten für Projekte auf Dokumentebene für Excel und Word. Weitere Informationen finden Sie unter Funktionen verfügbar nach Office-Anwendung und Projekttyp.

Obwohl diese exemplarische Vorgehensweise Excel speziell verwendet, gelten die konzepte, die durch die exemplarische Vorgehensweise veranschaulicht werden, auch für Projekte auf Dokumentebene für Word.

In dieser exemplarischen Vorgehensweise werden die folgenden Aufgaben veranschaulicht:

  • Erstellen einer Arbeitsmappe, die VBA-Code enthält.

  • Dem Speicherort der Arbeitsmappe mithilfe des Trust Centers in Excel vertrauen.

  • Hinzufügen einer Methode zur Sheet1 Hostelementklasse.

  • Extraktion einer Schnittstelle für die Sheet1 Host-Item-Klasse.

  • Verfügbarmachen der Methode für VBA-Code.

  • Aufrufen der Methode aus 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. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Personalisieren von Visual Studio-IDE.

Voraussetzungen

Sie benötigen die folgenden Komponenten, um diese Schritt-für-Schritt-Anleitung abzuschließen.

Erstellen einer Arbeitsmappe mit VBA-Code

Der erste Schritt besteht darin, eine Arbeitsmappe mit Makros zu erstellen, die ein einfaches VBA-Makro enthält. Bevor Sie Code in einer Anpassung für VBA verfügbar machen können, muss die Arbeitsmappe bereits VBA-Code enthalten. Andernfalls kann Visual Studio das VBA-Projekt nicht ändern, um VBA-Code zum Aufrufen der Anpassungsassembly zu aktivieren.

Wenn Sie bereits über eine Arbeitsmappe verfügen, die VBA-Code enthält, den Sie verwenden möchten, können Sie diesen Schritt überspringen.

So erstellen Sie eine Arbeitsmappe, die VBA-Code enthält

  1. Starten Sie Excel.

  2. Speichern Sie das aktive Dokument als Excel-Macro-Enabled Arbeitsmappe (*.xlsm) mit dem Namen WorkbookWithVBA. Speichern Sie es an einem praktischen Speicherort, z. B. auf dem Desktop.

  3. Klicken Sie im Menüband auf die Registerkarte " Entwicklertools ".

    Hinweis

    Wenn die Registerkarte " Entwicklertools " nicht angezeigt wird, müssen Sie sie zuerst anzeigen. Weitere Informationen finden Sie unter How to: Show the developer tab on the ribbon.

  4. Klicken Sie in der Gruppe "Code " auf Visual Basic.

    Der Visual Basic-Editor wird geöffnet.

  5. Doppelklicken Sie im Projektfenster auf ThisWorkbook.

    Die Codedatei für das ThisWorkbook Objekt wird geöffnet.

  6. Fügen Sie der Codedatei den folgenden VBA-Code hinzu. Dieser Code definiert eine einfache Funktion, die nichts bewirkt. Der einzige Zweck dieser Funktion besteht darin, sicherzustellen, dass ein VBA-Projekt in der Arbeitsmappe vorhanden ist. Dies ist für spätere Schritte in dieser exemplarischen Vorgehensweise erforderlich.

    Sub EmptySub()
    End Sub
    
  7. Speichern Sie das Dokument, und beenden Sie Excel.

Erstelle das Projekt

Jetzt können Sie ein Projekt auf Dokumentebene für Excel erstellen, das die zuvor erstellte Arbeitsmappe mit Makros verwendet.

So erstellen Sie ein neues Projekt

  1. Starten Sie Visual Studio.

  2. Zeigen Sie im Menü "Datei" auf "Neu", und klicken Sie dann auf "Projekt".

  3. Erweitern Sie im Vorlagenbereich Visual C#, und erweitern Sie dann Office/SharePoint.

  4. Wählen Sie den Knoten "Office-Add-Ins" aus.

  5. Wählen Sie in der Liste der Projektvorlagen das Excel 2010-Arbeitsmappen- oder Excel 2013-Arbeitsmappenprojekt aus.

  6. Geben Sie im Feld "Name " den Namen "CallingCodeFromVBA" ein.

  7. Klicke auf OK.

    Der Projektassistent von Visual Studio Tools für Office wird geöffnet.

  8. Wählen Sie Vorhandenes Dokument kopieren aus, und geben Sie im Feld "Vollständiger Pfad des vorhandenen Dokuments" den Speicherort der Arbeitsmappe WorkbookWithVBA an, die Sie zuvor erstellt haben. Wenn Sie ihre eigene Arbeitsmappe mit Makros verwenden, geben Sie stattdessen den Speicherort dieser Arbeitsmappe an.

  9. Klicken Sie auf Fertig stellen.

    Visual Studio öffnet die WorkbookWithVBA-Arbeitsmappe im Designer und fügt das CallingCodeFromVBA-Projekt dem Projektmappen-Explorer hinzu.

Dem Speicherort der Arbeitsmappe vertrauen.

Bevor Sie Code in Ihrer Lösung für VBA-Code in der Arbeitsmappe freigeben können, müssen Sie VBA in der Arbeitsmappe vertrauen, damit es ausgeführt werden kann. Hierfür gibt es mehrere Möglichkeiten. In dieser exemplarischen Vorgehensweise führen Sie diese Aufgabe aus, indem Sie dem Speicherort der Arbeitsmappe im Trust Center in Excel vertrauen.

Dem Speicherort der Arbeitsmappe vertrauen

  1. Starten Sie Excel.

  2. Klicken Sie auf die Registerkarte "Datei ".

  3. Klicken Sie auf die Schaltfläche "Excel-Optionen ".

  4. Klicken Sie im Bereich "Kategorien" auf "Trust Center".

  5. Klicken Sie im Detailbereich auf "Einstellungen für das Trust Center".

  6. Klicken Sie im Bereich "Kategorien" auf " Vertrauenswürdige Speicherorte".

  7. Klicken Sie im Detailbereich auf "Neuen Speicherort hinzufügen".

  8. Navigieren Sie im Dialogfeld "Vertrauenswürdiger Speicherort von Microsoft Office " zu dem Ordner, der das CallingCodeFromVBA-Projekt enthält.

  9. Die Auswahl von Unterordnern dieses Speicherorts ist ebenfalls vertrauenswürdig.

  10. Klicken Sie im Dialogfeld " Vertrauenswürdiger Speicherort von Microsoft Office " auf "OK".

  11. Klicken Sie im Dialogfeld "Trust Center " auf "OK".

  12. Klicken Sie im Dialogfeld "Excel-Optionen " auf "OK".

  13. Beenden Sie Excel.

Hinzufügen einer Methode zur Sheet1-Klasse

Nachdem das VBA-Projekt eingerichtet ist, fügen Sie der Sheet1 Hostelementklasse eine öffentliche Methode hinzu, die Sie aus VBA-Code aufrufen können.

So fügen Sie der Sheet1-Klasse eine Methode hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Sheet1.cs, und klicken Sie dann auf "Code anzeigen".

    Die Sheet1.cs Datei wird im Code-Editor geöffnet.

  2. Fügen Sie der Klasse den folgenden Code hinzu Sheet1 . Die CreateVstoNamedRange Methode erstellt ein neues NamedRange Objekt im angegebenen Bereich. Diese Methode erstellt auch einen Ereignishandler für das Selected Ereignis des NamedRange. Später in dieser Anleitung rufen Sie die CreateVstoNamedRange-Methode aus dem VBA-Code im Dokument auf.

    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. Diese Methode setzt die GetAutomationObject Methode außer Kraft, um die aktuelle Instanz der Sheet1 Klasse zurückzugeben.

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. Wenden Sie die folgenden Attribute vor der ersten Zeile der Sheet1 Klassendeklaration an. Diese Attribute machen die Klasse für COM sichtbar, ohne jedoch eine Klassenschnittstelle zu generieren.

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

Extrahieren einer Schnittstelle für die Sheet1-Klasse

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 Sie müssen diese Schnittstelle für COM verfügbar machen.

So extrahieren Sie eine Schnittstelle für die Sheet1-Klasse

  1. Klicken Sie in der codedatei Sheet1.cs auf eine beliebige Stelle in der Sheet1 Klasse.

  2. Klicken Sie im Menü «Umgestalten» auf «Interface extrahieren».

  3. Klicken Sie im Dialogfeld "Schnittstelle extrahieren" im Feld "Öffentliche Mitglieder auswählen, um Schnittstelle zu bilden" auf den Eintrag für die CreateVstoNamedRange Methode.

  4. Klicke auf OK.

    Visual Studio generiert eine neue Schnittstelle mit dem Namen ISheet1und ändert die Definition der Sheet1 Klasse so, dass sie die ISheet1 Schnittstelle implementiert. Visual Studio öffnet auch die ISheet1.cs-Datei im Code-Editor.

  5. Ersetzen Sie in der datei ISheet1.cs die ISheet1 Schnittstellendeklaration durch den folgenden Code. Dieser Code macht die ISheet1 Schnittstelle öffentlich und wendet das ComVisibleAttribute Attribut an, um die Schnittstelle auf COM sichtbar zu machen.

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

Verfügbarmachen der Methode für VBA-Code

Um die CreateVstoNamedRange Methode für VBA-Code in der Arbeitsmappe zugänglich zu machen, legen Sie die Eigenschaft ReferenceAssemblyFromVbaProject für das Sheet1 Hostelement auf True fest.

So machen Sie die Methode für VBA-Code verfügbar

  1. Doppelklicken Sie im Solution Explorer auf Sheet1.cs.

    Die WorkbookWithVBA-Datei wird im Designer geöffnet, wobei Sheet1 sichtbar ist.

  2. Wählen Sie im Eigenschaftenfenster die Eigenschaft "ReferenceAssemblyFromVbaProject " aus, und ändern Sie den Wert in "True".

  3. Klicken Sie in der angezeigten Nachricht auf "OK ".

  4. Projekt erstellen.

Aufrufen der Methode aus VBA-Code

Sie können die CreateVstoNamedRange Methode jetzt aus VBA-Code in der Arbeitsmappe aufrufen.

Hinweis

In dieser exemplarischen Vorgehensweise fügen Sie der Arbeitsmappe VBA-Code hinzu, während Sie das Projekt debuggen. Der VBA-Code, den Sie diesem Dokument hinzufügen, wird beim nächsten Erstellen des Projekts überschrieben, da Visual Studio das Dokument im Buildausgabeordner durch eine Kopie des Dokuments aus dem Hauptprojektordner ersetzt. Wenn Sie den VBA-Code speichern möchten, können Sie ihn in das Dokument im Projektordner kopieren. Weitere Informationen finden Sie unter Kombinieren von VBA- und Dokumentebenenanpassungen.

So rufen Sie die Methode aus VBA-Code auf

  1. Drücken Sie F5 , um Ihr Projekt auszuführen.

  2. Klicken Sie auf der Registerkarte " Entwicklertools " in der Gruppe "Code " auf Visual Basic.

    Der Visual Basic-Editor wird geöffnet.

  3. Klicken Sie im Menü "Einfügen " auf "Modul".

  4. Fügen Sie dem neuen Modul den folgenden Code hinzu.

    Dieser Code ruft die CreateTable Methode in der Anpassungsassembly auf. Das Makro greift mithilfe der globalen GetManagedClass-Methode auf diese Methode zu, um auf das für VBA-Code freigegebene Sheet1 Host-Klassenobjekt zuzugreifen. Die GetManagedClass Methode wurde automatisch generiert, wenn Sie die ReferenceAssemblyFromVbaProject-Eigenschaft weiter oben in dieser exemplarischen Vorgehensweise festlegen.

    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.

  6. Klicken Sie in der geöffneten Arbeitsmappe auf Zelle A1 in Sheet1. Stellen Sie sicher, dass das Meldungsfeld angezeigt wird.

  7. Beenden Sie Excel, ohne Ihre Änderungen zu speichern.

Nächste Schritte

Weitere Informationen zum Aufrufen von Code in Office-Lösungen aus VBA finden Sie in den folgenden Themen: