Tutorial: Agregar controles a una hoja de cálculo en tiempo de ejecución en el proyecto de complemento de VSTO

Puede agregar controles a cualquier hoja de cálculo abierta mediante el uso de un complemento de VSTO de Excel. Este tutorial muestra cómo usar la cinta para permitir a los usuarios agregar un Button, NamedRange y ListObject a una hoja de cálculo. Para obtener información, vea Agregar controles a documentos de Office en tiempo de ejecución.

Se aplica a: La información de este tema se aplica a los proyectos de complementos de VSTO para Excel. Para obtener más información, consulta Features Available by Office Application and Project Type.

En este tutorial se muestran las tareas siguientes:

  • Proporcionar una interfaz de usuario (UI) para agregar controles a la hoja de cálculo.

  • Agregar controles a la hoja de cálculo.

  • Quitar controles de la hoja de cálculo.

    Nota:

    Es posible que tu equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la configuración que se utilice determinan estos elementos. Para obtener más información, vea Personalizar el IDE.

Requisitos previos

Necesitará los componentes siguientes para completar este tutorial:

Crear un nuevo proyecto de complemento de VSTO de Excel

Comience creando un proyecto de complemento de VSTO de Excel.

Para crear un nuevo proyecto de complemento de VSTO de Excel

  1. En Visual Studio, cree un proyecto de complemento de VSTO de Excel con el nombre ExcelDynamicControls. Para obtener más información, consulta How to: Create Office Projects in Visual Studio.

  2. Agregue una referencia al ensamblado Microsoft.Office.Tools.Excel.v4.0.Utilities.dll . Esta referencia es obligatoria para agregar mediante programación un control de Windows Forms a una hoja de cálculo más adelante en este tutorial.

Proporcionar una interfaz de usuario para agregar controles a una hoja de cálculo

Agregue una pestaña personalizada a la cinta de Excel. Los usuarios pueden seleccionar las casillas en la pestaña para agregar controles a una hoja de cálculo.

Para proporcionar una interfaz de usuario para agregar controles a una hoja de cálculo

  1. En el menú Proyecto , haga clic en Agregar nuevo elemento.

  2. En el cuadro de diálogo Agregar nuevo elemento , seleccione Cinta de opciones (Diseñador visual) y, a continuación, haga clic en Agregar.

    Se abre un archivo denominado Ribbon1.cs o Ribbon1.vb en el Diseñador de cintas y muestra una pestaña y un grupo predeterminados.

  3. En la pestaña Controles de cinta de Office del Cuadro de herramientas, arrastre un control CheckBox al grupo1.

  4. Haga clic en CheckBox1 para seleccionarlo.

  5. En la ventana Propiedades , cambie las siguientes propiedades:

    Propiedad Valor
    Nombre Botón
    Label Botón
  6. Agregue una segunda casilla a group1, y, a continuación, cambie las siguientes propiedades.

    Propiedad Valor
    Nombre NamedRange
    Label NamedRange
  7. Agregue una tercera casilla a group1 y, a continuación, cambie las siguientes propiedades.

    Propiedad Valor
    Nombre Listobject
    Label Listobject

Agregar controles a la hoja de cálculo

Los controles administrados solo pueden agregarse a elementos host, que actúan como contenedores. Dado que los proyectos de complemento de VSTO funcionan con cualquier libro abierto, el complemento de VSTO convierte la hoja de cálculo en un elemento host u obtiene un elemento de host existente antes de agregar el control. Agregue código a los controladores de eventos de clic de cada control para generar un elemento host Worksheet que se basa en la hoja de cálculo abierta. A continuación, agregue un Button, NamedRange y ListObject en la selección actual en la hoja de cálculo.

Para agregar controles a una hoja de cálculo

  1. En el Diseñador de la cinta de opciones, haga doble clic en Botón.

    El Click controlador de eventos de la casilla Botón se abre en el Editor de código.

  2. Reemplace el controlador de eventos Button_Click por el siguiente código:

    Este código usa el método GetVstoObject para obtener un elemento host que representa la primera hoja de cálculo del libro y, a continuación, agrega un control Button a la celda seleccionada actualmente.

    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);
        }
    }
    
  3. En Explorador de soluciones, seleccione Ribbon1.cs o Ribbon1.vb.

  4. En el menú Ver , haga clic en Diseñador.

  5. En el Diseñador de la cinta de opciones, haga doble clic en NamedRange.

  6. Reemplace el controlador de eventos NamedRange_Click por el siguiente código:

    Este código usa el método GetVstoObject para obtener un elemento host que representa la primera hoja de cálculo del libro y, a continuación, define un control NamedRange para la celda o celdas seleccionadas actualmente.

    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);
        }
    }
    
  7. En el Diseñador de la cinta de opciones, haga doble clic en ListObject.

  8. Reemplace el controlador de eventos ListObject_Click por el siguiente código:

    Este código usa el método GetVstoObject para obtener un elemento host que representa la primera hoja de cálculo del libro y, a continuación, define un ListObject para la celda o celdas seleccionadas actualmente.

    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);
        }
    }
    
  9. Agregue las siguientes instrucciones a la parte superior del archivo de código de la cinta.

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

Quitar controles de la hoja de cálculo

Los controles no se conservan cuando se guarda y se cierra la hoja de cálculo. Debería quitar mediante programación todos los controles de Windows Forms generados antes de que se guarde la hoja de cálculo o solo aparecerá un contorno del control cuando se vuelva a abrir el libro. Agregue código al evento WorkbookBeforeSave que quita los controles de Windows Forms de la colección de controles del elemento host generado. Para obtener más información, vea Conservar controles dinámicos en documentos de Office.

Para quitar controles de la hoja de cálculo

  1. En Explorador de soluciones, seleccione ThisAddIn.cs o ThisAddIn.vb.

  2. En el menú Ver , haga clic en Código.

  3. Agrega el método siguiente a la clase ThisAddIn: Este código obtiene la primera hoja de cálculo del libro y, a continuación, usa el método HasVstoObject para comprobar si la hoja de cálculo tiene un objeto de hoja de cálculo generado. Si el objeto de hoja de cálculo generado tiene controles, el código obtiene ese objeto de hoja de cálculo y recorre en iteración la colección de controles, quitando los controles.

           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);
                   }
    
               }
           }
    
  4. En C# debe crear un controlador de eventos para el evento WorkbookBeforeSave. Puede colocar este código en el método ThisAddIn_Startup. Para obtener más información sobre cómo crear controladores de eventos, vea How to: Create event handlers in Office projects. Reemplace el método ThisAddIn_Startup por el código siguiente.

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

Probar la solución

Para agregar controles a una hoja de cálculo, selecciónelos en una pestaña personalizada de la cinta de opciones. Cuando guarde la hoja de cálculo, se quitarán estos controles.

Para probar la solución.

  1. Presione F5 para ejecutar el proyecto.

  2. Seleccione cualquier celda de Hoja1.

  3. Haga clic en la pestaña Complementos .

  4. En el grupo group1 , haga clic en Botón.

    Se mostrará un botón en la celda seleccionada.

  5. Seleccione otra celda en Hoja1.

  6. En el grupo group1 , haga clic en NamedRange.

    Se define un rango con nombre para la celda seleccionada.

  7. Seleccione una serie de celdas en Hoja1.

  8. En el grupo group1 , haga clic en ListObject.

    Se agrega un objeto de lista para las celdas seleccionadas.

  9. Guarde la hoja de cálculo.

    Los controles que agregó a Hoja1 ya no aparecen.

Pasos siguientes

Puede obtener más información acerca de los controles en proyectos de complemento de Excel de VSTO en este tema: