Exemplarische Vorgehensweise: Hinzufügen von Steuerelementen zu einem Arbeitsblatt zur Laufzeit in einem Projekt auf Anwendungsebene

Aktualisiert: April 2011

Sie können mit einem Excel-Add-In Steuerelemente jedem geöffneten Arbeitsblatt hinzufügen. In dieser exemplarischen Vorgehensweise wird gezeigt, wie Sie den Benutzern mithilfe des Menübands die Möglichkeit geben, einem Arbeitsblatt eine Button, einen NamedRange und ein ListObject hinzuzufügen. Weitere Informationen finden Sie unter Hinzufügen von Steuerelementen zu Office-Dokumenten zur Laufzeit.

Betrifft: Die Informationen in diesem Thema betreffen Projekte auf Anwendungsebene für Excel 2007 und Excel 2010. Weitere Informationen finden Sie unter Verfügbare Funktionen nach Office-Anwendung und Projekttyp.

In dieser exemplarischen Vorgehensweise werden die folgenden Aufgaben veranschaulicht:

  • Bereitstellen einer Benutzeroberfläche zum Hinzufügen von Steuerelementen zum Arbeitsblatt

  • Hinzufügen von Steuerelementen zum Arbeitsblatt

  • Entfernen von Steuerelementen aus dem Arbeitsblatt

Tipp

Ihr Computer zeigt möglicherweise für einige der Elemente der Visual Studio-Benutzeroberfläche in der folgenden Anleitung andere Namen oder Standorte an. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

Vorbereitungsmaßnahmen

Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie die folgenden Komponenten:

-

Eine Version von Visual Studio 2010, die die Microsoft Office-Entwicklungstools einschließt. Weitere Informationen finden Sie unter [Konfigurieren eines Computers zum Entwickeln von Office-Lösungen](bb398242\(v=vs.100\).md).
  • Microsoft Office Excel 2007 oder Excel 2010.

Erstellen eines neuen Excel-Add-In-Projekts

Erstellen Sie zunächst ein Excel-Add-In-Projekt.

So erstellen Sie ein neues Excel-Add-In-Projekt

  1. Erstellen Sie in Visual Studio ein Excel-Add-In-Projekt mit der Bezeichnung "ExcelDynamicControls". Weitere Informationen finden Sie unter Gewusst wie: Erstellen von Office-Projekten in Visual Studio.

  2. Wenn .NET Framework 4 als Zielversion für das Projekt festgelegt ist, fügen Sie einen Verweis auf die Microsoft.Office.Tools.Excel.v4.0.Utilities.dll-Assembly hinzu. Dieser Verweis ist erforderlich, um einem Arbeitsblatt später in dieser exemplarischen Vorgehensweise programmgesteuert ein Windows Forms-Steuerelement hinzuzufügen.

Bereitstellen einer Benutzeroberfläche zum Hinzufügen von Steuerelementen zu einem Arbeitsblatt

Fügen Sie dem Excel-Menüband eine benutzerdefinierte Registerkarte hinzu. Die Benutzer können Kontrollkästchen auf der Registerkarte aktivieren, um einem Arbeitsblatt Steuerelemente hinzuzufügen.

So stellen Sie eine Benutzeroberfläche zum Hinzufügen von Steuerelementen zu einem Arbeitsblatt bereit

  1. Klicken Sie im Menü Projekt auf Neues Element hinzufügen.

  2. Wählen Sie im Dialogfeld Neues Element hinzufügen die Option Menüband (Visual Designer) aus, und klicken Sie auf Hinzufügen.

    Eine Datei mit dem Namen Ribbon1.cs oder Ribbon1.vb wird im Menüband-Designer geöffnet. Sie enthält eine Standardregisterkarte und eine Gruppe.

  3. Ziehen Sie von der Registerkarte Steuerelemente für Office-Menübänder der Toolbox ein Kontrollkästchen auf group1.

  4. Klicken Sie auf CheckBox1, um das Element auszuwählen.

  5. Ändern Sie im Eigenschaftenfenster die folgenden Eigenschaften.

    Eigenschaft

    Wert

    Name

    Button

    Bezeichnung

    Button

  6. Fügen Sie ein zweites Kontrollkästchen zu group1 hinzu, und ändern Sie dann die folgenden Eigenschaften.

    Eigenschaft

    Wert

    Name

    NamedRange

    Bezeichnung

    NamedRange

  7. Fügen Sie ein drittes Kontrollkästchen zu group1 hinzu, und ändern Sie dann die folgenden Eigenschaften.

    Eigenschaft

    Wert

    Name

    ListObject

    Bezeichnung

    ListObject

Hinzufügen von Steuerelementen zum Arbeitsblatt

Verwaltete Steuerelemente können nur Hostelementen hinzugefügt werden, die als Container fungieren. Da Add-In-Projekte mit allen geöffneten Arbeitsmappen verwendet werden können, konvertiert das Add-In das Arbeitsblatt in ein Hostelement oder ruft ein vorhandenes Hostelement ab, bevor das Steuerelement hinzugefügt wird. Fügen Sie den Click-Ereignishandlern jedes Steuerelements Code hinzu, um ein Worksheet-Hostelement zu generieren, das auf dem geöffneten Arbeitsblatt beruht. Fügen Sie dann bei der aktuellen Auswahl im Arbeitsblatt eine Button, einen NamedRange und ein ListObject hinzu.

So fügen Sie einem Arbeitsblatt Steuerelemente hinzu

  1. Doppelklicken Sie im Menüband-Designer auf Button.

    Der Click-Ereignishandler des Kontrollkästchens Button wird im Code-Editor geöffnet.

  2. Ersetzen Sie den Button_Click-Ereignishandler durch folgenden Code.

    Dieser Code verwendet die GetVstoObject-Methode, um ein Hostelement abzurufen, das das erste Arbeitsblatt in der Arbeitsmappe darstellt, und fügt der aktuell ausgewählten Zelle anschließend ein Button-Steuerelement hinzu.

    Private Sub Button_Click(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
            Handles Button.Click
    
        Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1)
    
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    
        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1),  _
        '    Excel.Worksheet).GetVstoObject()
    
        Dim buttonName As String = "MyButton"
    
        If CType(sender, RibbonCheckBox).Checked Then
            Dim selection As Excel.Range = Globals.ThisAddIn.Application.Selection
            If Not (selection Is Nothing) Then
                Dim button As New Microsoft.Office.Tools.Excel.Controls.Button()
                worksheet.Controls.AddControl(button, selection, buttonName)
            End If
        Else
            worksheet.Controls.Remove(buttonName)
        End If
    End Sub
    
    private void Button_Click(object sender, RibbonControlEventArgs e)
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // Worksheet worksheet = 
        //     ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]).GetVstoObject();
    
        string buttonName = "MyButton";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                Microsoft.Office.Tools.Excel.Controls.Button button =
                    new Microsoft.Office.Tools.Excel.Controls.Button();
                worksheet.Controls.AddControl(button, selection, buttonName);
            }
        }
        else
        {
            worksheet.Controls.Remove(buttonName);
        }
    }
    
  3. Wählen Sie im Projektmappen-Explorer die Datei Ribbon1.cs oder Ribbon1.vb aus.

  4. Klicken Sie im Menü Ansicht auf Designer.

  5. Doppelklicken Sie im Menüband-Designer auf NamedRange.

  6. Ersetzen Sie den NamedRange_Click-Ereignishandler durch folgenden Code.

    Dieser Code verwendet die GetVstoObject-Methode, um ein Hostelement abzurufen, das das erste Arbeitsblatt in der Arbeitsmappe darstellt, und definiert anschließend ein NamedRange-Steuerelement für die aktuell ausgewählte(n) Zelle(n).

    Private Sub NamedRange_Click(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
            Handles NamedRange.Click
    
        Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1)
    
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    
        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1),  _
        '    Excel.Worksheet).GetVstoObject()
    
        Dim rangeName As String = "MyNamedRange"
    
        If CType(sender, RibbonCheckBox).Checked Then
            Dim selection As Excel.Range = Globals.ThisAddIn.Application.Selection
            If Not (selection Is Nothing) Then
                Dim namedRange As NamedRange = _
                    worksheet.Controls.AddNamedRange(selection, rangeName)
            End If
        Else
            worksheet.Controls.Remove(rangeName)
        End If
    End Sub
    
    private void NamedRange_Click(object sender, RibbonControlEventArgs e)
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // Worksheet worksheet = 
        //     ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]).GetVstoObject();
    
        string Name = "MyNamedRange";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddNamedRange(selection, Name);
            }
        }
        else
        {
            worksheet.Controls.Remove(Name);
        }
    }
    
  7. Doppelklicken Sie im Menüband-Designer auf ListObject.

  8. Ersetzen Sie den ListObject_Click-Ereignishandler durch folgenden Code.

    Dieser Code verwendet die GetVstoObject-Methode, um ein Hostelement abzurufen, das das erste Arbeitsblatt in der Arbeitsmappe darstellt, und definiert anschließend ein ListObject für die aktuell ausgewählte(n) Zelle(n).

    Private Sub ListObject_Click(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
            Handles ListObject.Click
    
        Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1)
    
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    
        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1),  _
        '    Excel.Worksheet).GetVstoObject()
    
        Dim listObjectName As String = "MyListObject"
    
        If CType(sender, RibbonCheckBox).Checked Then
            Dim selection As Excel.Range = _
                Globals.ThisAddIn.Application.Selection
            If Not (selection Is Nothing) Then
                worksheet.Controls.AddListObject(selection, listObjectName)
            End If
        Else
            worksheet.Controls.Remove(listObjectName)
        End If
    End Sub
    
    private void ListObject_Click(object sender, RibbonControlEventArgs e)
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // Worksheet worksheet = 
        //     ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]).GetVstoObject();
    
        string listObjectName = "MyListObject";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddListObject(selection, listObjectName);
            }
        }
        else
        {
            worksheet.Controls.Remove(listObjectName);
        }
    }
    
  9. Fügen Sie am Anfang der Menüband-Codedatei die folgenden Anweisungen hinzu.

    Imports Excel = Microsoft.Office.Interop.Excel
    Imports Microsoft.Office.Tools.Excel
    Imports Microsoft.Office.Tools.Excel.Extensions
    
    using Excel = Microsoft.Office.Interop.Excel;
    using Microsoft.Office.Tools.Excel;
    using Microsoft.Office.Tools.Excel.Extensions;
    

Entfernen von Steuerelementen aus dem Arbeitsblatt

Steuerelemente bleiben beim Speichern und Schließen des Arbeitsblatts nicht erhalten. Sie sollten alle generierten Windows Forms-Steuerelemente programmgesteuert entfernen, bevor das Arbeitsblatt gespeichert wird, da andernfalls beim erneuten Öffnen der Arbeitsmappe nur eine Kontur des Steuerelements angezeigt wird. Fügen Sie dem WorkbookBeforeSave-Ereignis Code hinzu, mit dem Windows Forms-Steuerelemente aus der Steuerelementauflistung des generierten Hostelements entfernt werden. Weitere Informationen finden Sie unter Beibehalten von dynamischen Steuerelementen in Office-Dokumenten.

So entfernen Sie Steuerelemente aus dem Arbeitsblatt

  1. Wählen Sie im Projektmappen-Explorer die Datei ThisAddIn.cs oder ThisAddIn.vb aus.

  2. Klicken Sie im Menü Ansicht auf Code.

  3. Fügen Sie der ThisAddIn-Klasse die folgende Methode hinzu. Dieser Code ruft das erste Arbeitsblatt in der Arbeitsmappe ab und prüft anschließend mithilfe der HasVstoObject-Methode, ob das Arbeitsblatt ein Arbeitsblattobjekt generiert hat. Wenn das generierte Arbeitsblattobjekt Steuerelemente enthält, ruft der Code dieses Arbeitsblattobjekt, durchläuft die Steuerelementauflistung und entfernt die Steuerelemente.

    Sub Application_WorkbookBeforeSave _
        (ByVal workbook As Microsoft.Office.Interop.Excel.Workbook, _
         ByVal SaveAsUI As Boolean, ByRef Cancel As Boolean) _
         Handles Application.WorkbookBeforeSave
    
        Dim worksheet As Excel.Worksheet = workbook.Worksheets(1)
    
        ' Use the following code in projects that target the .NET Framework 4.
        If Globals.Factory.HasVstoObject(worksheet) And
            Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0 Then
            Dim vstoWorksheet As Worksheet = Globals.Factory.GetVstoObject(worksheet)
    
            ' In projects that target the .NET Framework 3.5, use the following code.
            ' If worksheet.HasVstoObject() And worksheet.GetVstoObject().Controls.Count > 0 Then
            ' Dim vstoWorksheet As Worksheet = worksheet.GetVstoObject()
    
            While vstoWorksheet.Controls.Count > 0
                Dim vstoControl As Object = vstoWorksheet.Controls(0)
                vstoWorksheet.Controls.Remove(vstoControl)
            End While
        End If
    End Sub
    
    void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook workbook, 
        bool SaveAsUI, ref bool Cancel)
    {
        Excel.Worksheet worksheet =
            workbook.Worksheets[1] as Excel.Worksheet;
    
        // Use the following lines of code in projects that target the .NET Framework 4.
        if (Globals.Factory.HasVstoObject(worksheet) && 
            Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0)
        {
            Worksheet vstoWorksheet = Globals.Factory.GetVstoObject(worksheet);
    
        // In projects that target the .NET Framework 3.5, use the following line of code.
        // if (worksheet.HasVstoObject() && worksheet.GetVstoObject().Controls.Count > 0)
        // {
        //     Worksheet vstoWorksheet = worksheet.GetVstoObject();               
    
            while (vstoWorksheet.Controls.Count > 0)
            {
                object vstoControl = vstoWorksheet.Controls[0];
                vstoWorksheet.Controls.Remove(vstoControl);
            }
    
        }
    }
    
  4. In C# müssen Sie einen Ereignishandler für das WorkbookBeforeSave-Ereignis erstellen. Sie können diesen Code in die ThisAddIn_Startup-Methode einfügen. Weitere Informationen zum Erstellen von Ereignishandlern finden Sie unter Gewusst wie: Erstellen von Ereignishandlern in Office-Projekten. Ersetzen Sie die ThisAddIn_Startup-Methode durch folgenden Code:

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        this.Application.WorkbookBeforeSave += 
            new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler
                (Application_WorkbookBeforeSave);
    }
    

Testen der Projektmappe

Fügen Sie Steuerelemente einem Arbeitsblatt hinzu, indem Sie sie auf einer benutzerdefinierten Registerkarte des Menübands auswählen. Beim Speichern des Arbeitsblatts werden diese Steuerelemente entfernt.

So testen Sie die Projektmappe

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

  2. Wählen Sie jede Zelle in Sheet1 aus.

  3. Klicken Sie auf die Registerkarte Add-Ins.

  4. Klicken Sie in der Gruppe group1 auf Button.

    In der ausgewählten Zelle wird eine Schaltfläche angezeigt.

  5. Wählen Sie in Sheet1 eine andere Zelle aus.

  6. Klicken Sie in der Gruppe group1 auf NamedRange.

    Für die ausgewählte Zelle wird ein benannter Bereich definiert.

  7. Wählen Sie in Sheet1 eine Reihe von Zellen aus.

  8. Klicken Sie in der Gruppe group1 auf ListObject.

    Den ausgewählten Zellen wird ein Listenobjekt hinzugefügt.

  9. Speichern Sie das Arbeitsblatt.

    Die Steuerelemente, die Sie Sheet1 hinzugefügt haben, werden nicht mehr angezeigt.

Nächste Schritte

Unter folgendem Thema erfahren Sie mehr über Steuerelemente in Excel-Add-In-Projekten:

Siehe auch

Konzepte

Verwenden von Windows Forms-Steuerelementen in Excel-Arbeitsblättern

NamedRange-Steuerelement

ListObject-Steuerelement

Weitere Ressourcen

Excel-Projektmappen

Steuerelemente für Office-Dokumente

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

April 2011

Es wurde eine Beschreibung eines Assemblyverweises hinzugefügt, der für Projekte mit der Zielversion .NET Framework 4 hinzugefügt werden muss.

Korrektur inhaltlicher Fehler.