Exemplarische Vorgehensweise: Hinzufügen von Steuerelementen zu einem Arbeitsblatt zur Laufzeit im VSTO-Add-in-ProjektWalkthrough: Add controls to a worksheet at run time in VSTO add-in project

Sie können einem beliebigen geöffneten Arbeitblatt Steuerelemente mithilfe eines Excel-VSTO-Add-In hinzufügen.You can add controls to any open worksheet by using an Excel VSTO Add-in. Diese exemplarische Vorgehensweise veranschaulicht, wie Benutzer einem Arbeitsblatt mithilfe des Menübands ein Button, NamedRange und ListObject hinzufügen können.This walkthrough demonstrates how to use the Ribbon to enable users to add a Button, a NamedRange, and a ListObject to a worksheet. Weitere Informationen finden Sie unter Hinzufügen von Steuerelementen zu Office-Dokumenten zur Laufzeit.For information, see Add controls to Office documents at run time.

Gilt für: Die Informationen in diesem Thema betreffen VSTO-Add-in-Projekte für Excel.Applies to: The information in this topic applies to VSTO Add-in projects for Excel. Weitere Informationen finden Sie unter Features Available by Office Application and Project Type.For more information, see Features Available by Office Application and Project Type.

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

  • Bereitstellen einer Benutzeroberfläche (UI) zum Hinzufügen von Steuerelementen zum ArbeitsblattProviding a user interface (UI) to add controls to the worksheet.

  • Hinzufügen von Steuerelementen zum ArbeitsblattAdding controls to the worksheet.

  • Entfernen von Steuerelementen aus dem ArbeitsblattRemoving controls from the worksheet.

    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 der IDE.For more information, see Personalize the IDE.

VoraussetzungenPrerequisites

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

Neues Excel-VSTO-Add-in-Projekt erstellenCreate a new Excel VSTO Add-in project

Beginnen Sie mit der Erstellung eines Excel VSTO-Add-In-Projekts.Start by creating an Excel VSTO Add-in project.

So erstellen Sie ein neues Excel-VSTO-Add-In-ProjektTo create a new Excel VSTO Add-in project

  1. Visual StudioVisual StudioErstellen Sie in ein Excel-VSTO-Add-in-Projekt mit dem Namen exceldynamiccontrols.In Visual StudioVisual Studio, create an Excel VSTO Add-in project with the name ExcelDynamicControls. Weitere Informationen finden Sie unter How to: Create Office Projects in Visual Studio.For more information, see How to: Create Office Projects in Visual Studio.

  2. Fügen Sie einen Verweis auf die Microsoft.Office.Tools.Excel.v4.0.Utilities.dll -Assembly hinzu.Add a reference to the Microsoft.Office.Tools.Excel.v4.0.Utilities.dll assembly. Dieser Verweis ist erforderlich, um einem Arbeitsblatt ein Windows Forms-Steuerelement in dieser exemplarischen Vorgehensweise später programmgesteuert hinzuzufügen.This reference is required to programmatically add a Windows Forms control to a worksheet later in this walkthrough.

Bereitstellen einer Benutzeroberfläche zum Hinzufügen von Steuerelementen zu einem ArbeitsblattProvide a UI to add controls to a worksheet

Fügen Sie dem Excel-Menüband eine benutzerdefinierte Registerkarte hinzu.Add a custom tab to the Excel Ribbon. Benutzer können Kontrollkästchen auf der Registerkarte aktivieren, um einem Arbeitsblatt Steuerelemente hinzuzufügen.Users can select check boxes on the tab to add controls to a worksheet.

So stellen Sie eine Benutzeroberfläche zum Hinzufügen von Steuerelementen zu einem Arbeitsblatt bereitTo provide a UI to add controls to a worksheet

  1. Klicken Sie im Menü Projekt auf Neues Element hinzufügen.On the Project menu, click Add New Item.

  2. Wählen Sie im Dialogfeld Neues Element hinzufügen die Option Menüband (visueller Designer) aus, und klicken Sie dann auf Hinzufügen.In the Add New Item dialog box, select Ribbon (Visual Designer), and then click Add.

    Eine Datei mit dem Namen Ribbon1.cs oder Ribbon1. vb wird im Menüband-Designer geöffnet und zeigt eine Standard Registerkarte und-Gruppe an.A file named Ribbon1.cs or Ribbon1.vb opens in the Ribbon Designer and displays a default tab and group.

  3. Ziehen Sie ein Kontrollkästchen -Steuerelement von der Registerkarte Steuerelemente für Office-Menübänder der Toolbox auf group1.From the Office Ribbon Controls tab of the Toolbox, drag a CheckBox control onto group1.

  4. Klicken Sie auf CheckBox1 , um dieses Steuerelement auszuwählen.Click CheckBox1 to select it.

  5. Ändern Sie im Fenster Eigenschaften die folgenden Eigenschaften:In the Properties window, change the following properties.

    EigenschaftProperty WertValue
    NameName SchaltflächeButton
    LabelLabel SchaltflächeButton
  6. Fügen Sie group1 ein zweites Kontrollkästchen hinzu, und ändern Sie dann die folgenden Eigenschaften.Add a second check box to group1, and then change the following properties.

    EigenschaftProperty WertValue
    NameName NamedRangeNamedRange
    LabelLabel NamedRangeNamedRange
  7. Fügen Sie group1 ein drittes Kontrollkästchen hinzu, und ändern Sie dann die folgenden Eigenschaften.Add a third check box to group1, and then change the following properties.

    EigenschaftProperty WertValue
    NameName ListObjectListObject
    LabelLabel ListObjectListObject

Hinzufügen von Steuerelementen zum ArbeitsblattAdd controls to the worksheet

Verwaltete Steuerelemente können nur Hostelementen hinzugefügt werden, die als Container fungieren.Managed controls can only be added to host items, which act as containers. Da VSTO-Add-in-Projekte mit allen geöffneten Arbeitsmappen funktionieren, konvertiert das VSTO-Add-In das Arbeitsblatt in ein Hostelement oder ruft ein vorhandenes Hostelement ab, bevor das Steuerelement hinzugefügt wird.Because VSTO Add-in projects work with any open workbook, the VSTO Add-in converts the worksheet into a host item, or gets an existing host item, before adding the control. Fügen Sie den Click-Ereignishandlern jedes Steuerelements Code hinzu, um ein auf dem geöffneten Arbeitsblatt basierendes Worksheet-Hostelement zu generieren.Add code to the click event handlers of each control to generate a Worksheet host item that is based on the open worksheet. Fügen Sie dann ein Button, NamedRange und ListObject an der aktuellen Auswahlposition in das Arbeitsblatt ein.Then, add a Button, a NamedRange, and a ListObject at the current selection in the worksheet.

So fügen Sie einem Arbeitsblatt Steuerelemente hinzuTo add controls to a worksheet

  1. Doppelklicken Sie im Menüband-Designer auf die Schaltfläche.In the Ribbon Designer, double-click Button.

    Der- Click Ereignishandler des Kontrollkästchens Schaltfläche wird im Code-Editor geöffnet.The Click event handler of the Button check box opens in the Code Editor.

  2. Ersetzen Sie den Button_Click -Ereignishandler durch den folgenden Code.Replace the Button_Click event handler with the following 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 dann ein Button-Steuerelement hinzu.This code uses the GetVstoObject method to get a host item that represents the first worksheet in the workbook, and then adds a Button control to the currently selected cell.

    private void Button_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        
        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);
        }
    }
    
    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)
    
        Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    
    
        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
    
  3. Wählen Sie in Projektmappen-Explorer die Option Ribbon1.cs oder Ribbon1. vb aus.In Solution Explorer, select Ribbon1.cs or Ribbon1.vb.

  4. Klicken Sie im Menü Ansicht auf Designer.On the View menu, click Designer.

  5. Doppelklicken Sie im Menüband-Designer auf NamedRange.In the Ribbon Designer, double-click NamedRange.

  6. Ersetzen Sie den NamedRange_Click -Ereignishandler durch den folgenden Code.Replace the NamedRange_Click event handler with the following code.

    Dieser Code verwendet die GetVstoObject-Methode, um ein Hostelement abzurufen, das das erste Arbeitsblatt in der Arbeitsmappe darstellt, und fügt der oder den aktuell ausgewählten Zellen dann ein NamedRange-Steuerelement hinzu.This code uses the GetVstoObject method to get a host item that represents the first worksheet in the workbook, and then defines a NamedRange control for the currently selected cell or cells.

    private void NamedRange_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
    
        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);
        }
    }
    
    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)
    
        Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    
        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
    
  7. Doppelklicken Sie im Menüband-Designer auf ListObject.In the Ribbon Designer, double-click ListObject.

  8. Ersetzen Sie den ListObject_Click -Ereignishandler durch den folgenden Code.Replace the ListObject_Click event handler with the following code.

    Dieser Code verwendet die GetVstoObject-Methode, um ein Hostelement abzurufen, das das erste Arbeitsblatt in der Arbeitsmappe darstellt, und fügt der oder den aktuell ausgewählten Zellen dann ein ListObject hinzu.This code uses the GetVstoObject method to get a host item that represents the first worksheet in the workbook, and then defines a ListObject for the currently selected cell or cells.

    private void ListObject_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
    
        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);
        }
    }
    
    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)
    
        Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
            Globals.Factory.GetVstoObject(NativeWorksheet)
    
    
        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
    
  9. Fügen Sie am Anfang der Menüband-Codedatei die folgenden Anweisungen hinzu.Add the following statements to the top of the Ribbon code file.

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

Entfernen von Steuerelementen aus dem ArbeitsblattRemove controls from the worksheet

Steuerelemente werden nicht beibehalten, wenn das Arbeitsblatt gespeichert und geschlossen wird.Controls are not persisted when the worksheet is saved and closed. Sie sollten alle generierten Windows Forms-Steuerelemente programmgesteuert entfernen, bevor das Arbeitsblatt gespeichert wird, ansonsten wird beim erneuten Öffnen der Arbeitsmappe nur ein Umriss des Steuerelements angezeigt.You should programmatically remove all generated Windows Forms controls before the worksheet is saved, or only an outline of the control will appear when the workbook is opened again. Fügen Sie dem WorkbookBeforeSave-Ereignis Code hinzu, durch den Windows Forms-Steuerelemente aus der Steuerelementauflistung des generierten Hostelements entfernt werden.Add code to the WorkbookBeforeSave event that removes Windows Forms controls from the controls collection of the generated host item. Weitere Informationen finden Sie unter persistente dynamische Steuerelemente in Office-Dokumenten.For more information, see Persist dynamic controls in Office documents.

So entfernen Sie Steuerelemente aus dem ArbeitsblattTo remove controls from the worksheet

  1. Wählen Sie in Projektmappen-Explorer die Option ThisAddIn.cs oder ThisAddIn. vb aus.In Solution Explorer, select ThisAddIn.cs or ThisAddIn.vb.

  2. Klicken Sie im Menü Ansicht auf Code.On the View menu, click Code.

  3. Füge der ThisAddIn-Klasse die folgende Methode hinzu.Add the following method to the ThisAddIn class. Durch diesen Code wird das erste Arbeitsblatt in der Arbeitsmappe abgerufen und dann anhand der HasVstoObject-Methode überprüft, ob das Arbeitsblatt über ein generiertes Arbeitsblattobjekt verfügt.This code gets the first worksheet in the workbook and then uses the HasVstoObject method to check whether the worksheet has a generated worksheet object. Wenn das generierte Arbeitsblattobjekt über Steuerelemente verfügt, ruft der Code das Arbeitsblattobjekt ab und durchläuft die Steuerelementauflistung, um Steuerelemente zu entfernen.If the generated worksheet object has controls, the code gets that worksheet object and iterates through the control collection, removing the controls.

           void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook workbook, 
               bool SaveAsUI, ref bool Cancel)
           {
               Excel.Worksheet worksheet =
                   workbook.Worksheets[1] as Excel.Worksheet;
               
               if (Globals.Factory.HasVstoObject(worksheet) && 
                   Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0)
               {
                   Worksheet vstoWorksheet = Globals.Factory.GetVstoObject(worksheet);
               
              
                   
                   while (vstoWorksheet.Controls.Count > 0)
                   {
                       object vstoControl = vstoWorksheet.Controls[0];
                       vstoWorksheet.Controls.Remove(vstoControl);
                   }
    
               }
           }
    
    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 Globals.Factory.HasVstoObject(worksheet) And
            Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0 Then
            Dim vstoWorksheet As Worksheet = Globals.Factory.GetVstoObject(worksheet)
    
            While vstoWorksheet.Controls.Count > 0
                Dim vstoControl As Object = vstoWorksheet.Controls(0)
                vstoWorksheet.Controls.Remove(vstoControl)
            End While
        End If
    End Sub
    
  4. In C# müssen Sie einen Ereignishandler für das WorkbookBeforeSave-Ereignis erstellen.In C#, you must create an event handler for the WorkbookBeforeSave event. Sie können diesen Code in der ThisAddIn_Startup-Methode positionieren.You can place this code in the ThisAddIn_Startup method. Weitere Informationen zum Erstellen von Ereignis Handlern finden Sie unter Gewusst wie: Erstellen von Ereignis Handlern in Office-Projekten.For more information about creating event handlers, see How to: Create event handlers in Office projects. Ersetzen Sie die ThisAddIn_Startup-Methode durch den folgenden Code.Replace the ThisAddIn_Startup method with the following code.

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

Testen der LösungTest the solution

Fügen Sie einem Arbeitsblatt Steuerelemente hinzu, indem Sie Sie auf einer benutzerdefinierten Registerkarte im Menüband auswählen.Add controls to a worksheet by selecting them from a custom tab on the ribbon. Diese Steuerelemente werden beim Speichern des Arbeitsblatts entfernt.When you save the worksheet, these controls are removed.

So testen Sie die ProjektmappeTo test the solution.

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

  2. Wählen Sie eine beliebige Zelle in Tabelle1 aus.Select any cell in Sheet1.

  3. Klicken Sie auf die Registerkarte Add-Ins .Click the Add-Ins tab.

  4. Klicken Sie in der Gruppe group1 auf Button.In the group1 group, click Button.

    In der ausgewählten Zelle wird eine Schaltfläche angezeigt.A button appears in the selected cell.

  5. Wählen Sie eine andere Zelle in Tabelle1 aus.Select a different cell in Sheet1.

  6. Klicken Sie in der Gruppe group1 auf NamedRange.In the group1 group, click NamedRange.

    Für die ausgewählte Zelle wird ein benannter Bereich definiert.A named range is defined for the selected cell.

  7. Wählen Sie eine Reihe von Zellen in Tabelle1 aus.Select a series of cells in Sheet1.

  8. Klicken Sie in der Gruppe group1 auf ListObject.In the group1 group, click ListObject.

    Für die ausgewählten Zellen wird ein Listenobjekt hinzugefügt.A list object is added for the selected cells.

  9. Speichern Sie das Arbeitsblatt.Save the worksheet.

    Die Steuerelemente, die Sie Tabelle1 hinzugefügt haben, werden nicht mehr angezeigt.The controls that you added to Sheet1 no longer appear.

Nächste SchritteNext steps

Im folgenden Thema erfahren Sie mehr über Steuerelemente in Excel-VSTO-Add-In-Projekten:You can learn more about controls in Excel VSTO Add-in projects from this topic:

Weitere InformationenSee also