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

Aktualisiert: Juli 2008

Betrifft

Die Informationen in diesem Thema gelten nur für die angegebenen Projekte und Versionen von Visual Studio Tools for Office von Microsoft Office.

Projekttyp

  • Projekte auf Anwendungsebene

Microsoft Office-Version

  • Excel 2007

Weitere Informationen hierzu finden Sie unter Verfügbare Features nach Anwendung und Projekttyp.

Sie können Steuerelemente jedem geöffneten Arbeitsblatt mit einem Excel 2007-Add-In hinzufügen. In dieser exemplarischen Vorgehensweise wird gezeigt, wie Sie den Benutzern mithilfe der Multifunktionsleiste 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.

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

Hinweis:

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:

  • Visual Studio Tools for Office (eine optionale Komponente von Visual Studio 2008 Professional und Visual Studio Team System).

  • Visual Studio 2008 Service Pack 1 (SP1).

  • Microsoft Office Excel 2007.

Erstellen eines neuen Excel-Add-In-Projekts

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

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

  1. Erstellen Sie in Visual Studio ein Excel 2007-Add-In-Projekt mit der Bezeichnung ExcelDynamicControls.

  2. Wählen Sie im Dialogfeld Neues Projekt die Option Projektmappenverzeichnis erstellen.

  3. Speichern Sie das Projekt an einem beliebigen Ort.

    Weitere Informationen hierzu finden Sie unter Gewusst wie: Erstellen von Visual Studio Tools for Office-Projekte.

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

Fügen Sie der Excel 2007-Multifunktionsleiste 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 Multifunktionsleiste (Visual Designer) aus, und klicken Sie auf Hinzufügen.

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

  3. Ziehen Sie von der Registerkarte Steuerelemente für Office-Multifunktionsleisten 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.

    Property

    Value

    Name

    Button

    Bezeichnung

    Button

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

    Property

    Value

    Name

    NamedRange

    Bezeichnung

    NamedRange

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

    Property

    Value

    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 Multifunktionsleisten-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 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)
    {
        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 Multifunktionsleisten-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 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)
    {
        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 Multifunktionsleisten-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 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)
    {
        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 Multifunktionsleisten-Codedatei die folgenden using-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 hierzu 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ü Code auf anzeigen.

  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 Visual Studio Tools for Office-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)
        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;
    
        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 Visual Studio Tools for Office. Ersetzen Sie die ThisAddIn_Startup-Methode durch den 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 der Multifunktionsleiste 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 2007-Add-In-Projekten:

Siehe auch

Konzepte

Entwicklung von Add-Ins auf Anwendungsebene für Excel

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

NamedRange-Steuerelement

ListObject-Steuerelement

Weitere Ressourcen

Steuerelemente für Office-Dokumente

Excel-Hoststeuerelemente

Änderungsprotokoll

Date

Versionsgeschichte

Grund

Juli 2008

Thema hinzugefügt.

SP1-Featureänderung.