Condividi tramite


Procedura dettagliata: aggiunta di controlli a un foglio di lavoro in fase di esecuzione in un progetto a livello di applicazione

È possibile aggiungere controlli a qualsiasi foglio di lavoro aperto utilizzando un componente aggiuntivo di Excel. In questa procedura dettagliata viene illustrato come utilizzare la barra multifunzione per consentire agli utenti l'aggiunta degli oggetti Button, NamedRange e ListObject a un foglio di lavoro. Per informazioni, vedere Aggiunta di controlli ai documenti di Office in fase di esecuzione.

Si applica a: le informazioni fornite in questo argomento sono valide per i progetti a livello di applicazione per Excel 2007 ed Excel 2010. Per ulteriori informazioni, vedere Funzionalità disponibili in base ai tipi di progetto e applicazioni di Office.

Vengono illustrate le attività seguenti:

  • Creazione di un'interfaccia utente per l'aggiunta di controlli al foglio di lavoro.

  • Aggiunta di controlli al foglio di lavoro.

  • Rimozione di controlli dal foglio di lavoro.

Nota

Nel computer in uso è possibile che vengano visualizzati nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per ulteriori informazioni vedere Impostazioni di Visual Studio.

Prerequisiti

Per completare la procedura dettagliata, è necessario disporre dei componenti seguenti:

-

Una versione di Visual Studio 2010 che include gli strumenti per sviluppatori di Microsoft Office. Per ulteriori informazioni, vedere [Configurazione di un computer per sviluppare soluzioni Office](bb398242\(v=vs.100\).md).
  • Microsoft Office Excel 2007 o Excel 2010.

Creazione di un nuovo progetto componente aggiuntivo per Excel

Creare innanzitutto un progetto componente aggiuntivo di Excel.

Per creare un nuovo progetto componente aggiuntivo per Excel

  1. In Visual Studio creare un progetto componente aggiuntivo di Excel denominato ExcelDynamicControls. Per ulteriori informazioni, vedere Procedura: creare progetti di Office in Visual Studio.

  2. Se il progetto è destinato a .NET Framework 4, aggiungere un riferimento all'assembly Microsoft.Office.Tools.Excel.v4.0.Utilities.dll. Tale riferimento è necessario per aggiungere a livello di codice un controllo Windows Form alla cartella di lavoro più avanti nella procedura dettagliata.

Creazione di un'interfaccia utente per l'aggiunta di controlli a un foglio di lavoro

Aggiungere una scheda personalizzata alla barra multifunzione di Excel. Gli utenti possono selezionare caselle di controllo nella scheda per aggiungere i controlli a un foglio di lavoro.

Per creare un'interfaccia utente per l'aggiunta di controlli a un foglio di lavoro

  1. Scegliere Aggiungi nuovo elemento dal menu Progetto.

  2. Nella finestra di dialogo Aggiungi nuovo elemento, selezionare Barra multifunzione (finestra di progettazione visiva), quindi scegliere Aggiungi.

    Nella finestra di progettazione della barra multifunzione viene aperto un file denominato Ribbon1.cs o Ribbon1.vb in cui vengono visualizzati una scheda e un gruppo predefiniti.

  3. Dalla scheda Controlli barra multifunzione di Office della Casella degli strumenti, trascinare un controllo CheckBox a group1.

  4. Fare clic su CheckBox1 per selezionarlo.

  5. Nella finestra Proprietà modificare le proprietà riportate di seguito.

    Proprietà

    Valore

    Nome

    Button

    Etichetta

    Button

  6. Aggiungere una seconda casella di controllo a group1 e modificare le seguenti proprietà.

    Proprietà

    Valore

    Nome

    NamedRange

    Etichetta

    NamedRange

  7. Aggiungere una terza casella di controllo a group1 e modificare le seguenti proprietà.

    Proprietà

    Valore

    Nome

    ListObject

    Etichetta

    ListObject

Aggiunta di controlli al foglio di lavoro

I controlli gestiti possono essere aggiunti soltanto agli elementi host che fungono da contenitori. Dal momento che i progetti componente aggiuntivo funzionano con qualsiasi cartella di lavoro aperta, il componente aggiuntivo converte il foglio di lavoro in un elemento host oppure ottiene un elemento host esistente, prima di aggiungere il controllo. Aggiungere ai gestori eventi Click di ciascun controllo il codice per generare un elemento host Worksheet basato sul foglio di lavoro aperto. Quindi, aggiungere gli oggetti Button, NamedRange e ListObject in corrispondenza della selezione corrente nel foglio di lavoro.

Per aggiungere controlli a un foglio di lavoro

  1. Nella finestra di progettazione della barra multifunzione, fare doppio clic su Pulsante.

    Il gestore eventi Click della casella di controllo Pulsante viene aperto nell'editor di codice.

  2. Sostituire il gestore eventi Button_Click con il codice riportato di seguito.

    In questo codice viene utilizzato il metodo GetVstoObject per ottenere un elemento host che rappresenta il primo foglio di lavoro della cartella di lavoro, quindi viene aggiunto un controllo Button alla cella attualmente selezionata.

    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. In Esplora soluzioni, selezionare Ribbon1.cs o Ribbon1.vb.

  4. Scegliere Finestra di progettazione dal menu Visualizza.

  5. Nella finestra di progettazione della barra multifunzione, fare doppio clic su NamedRange.

  6. Sostituire il gestore eventi NamedRange_Click con il codice riportato di seguito.

    In questo codice viene utilizzato il metodo GetVstoObject per ottenere un elemento host che rappresenta il primo foglio di lavoro della cartella di lavoro, quindi viene definito un controllo NamedRange per le celle attualmente selezionate.

    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. Nella finestra di progettazione della barra multifunzione, fare doppio clic su ListObject.

  8. Sostituire il gestore eventi ListObject_Click con il codice riportato di seguito.

    In questo codice viene utilizzato il metodo GetVstoObject per ottenere un elemento host che rappresenta il primo foglio di lavoro della cartella di lavoro, quindi viene definito un oggetto ListObject per le celle attualmente selezionate.

    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. Aggiungere le seguenti istruzioni all'inizio del file di codice della barra multifunzione.

    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;
    

Rimozione di controlli dal foglio di lavoro

I controlli non sono resi permanenti quando il foglio di lavoro viene salvato e chiuso. È necessario rimuovere a livello di codice tutti i controlli Windows Form generati prima che il foglio di lavoro venga salvato, altrimenti quando la cartella di lavoro viene nuovamente aperta, verrà visualizzata solo una struttura del controllo. Aggiungere all'evento WorkbookBeforeSave il codice per rimuovere i controlli Windows Form dall'insieme di controlli dell'elemento host generato. Per ulteriori informazioni, vedere Persistenza dei controlli dinamici nei documenti di Office.

Per rimuovere i controlli dal foglio di lavoro

  1. In Esplora soluzioni, selezionare ThisAddIn.cs o ThisAddIn.vb.

  2. Scegliere Codice dal menu Visualizza.

  3. Aggiungere il metodo seguente alla classe ThisAddIn. In questo codice si ottiene il primo foglio di lavoro della cartella di lavoro e viene utilizzato il metodo HasVstoObject per controllare se il foglio di lavoro dispone di un oggetto foglio di lavoro generato. Se l'oggetto Worksheet generato dispone di controlli, il codice ottiene tale oggetto Worksheet e scorre l'insieme di controlli rimuovendo questi ultimi.

    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#, è necessario creare un gestore eventi per l'evento WorkbookBeforeSave. Questo codice può essere inserito nel metodo ThisAddIn_Startup. Per ulteriori informazioni sulla creazione di gestori eventi, vedere Procedura: creare gestori eventi in progetti di Office. Sostituire il metodo ThisAddIn_Startup con il codice seguente.

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

Verifica della soluzione

Aggiungere controlli a un foglio di lavoro selezionandoli da una scheda personalizzata sulla barra multifunzione. Quando si salva il foglio di lavoro, questi controlli vengono rimossi.

Per verificare la soluzione.

  1. Premere F5 per eseguire il progetto.

  2. Selezionare una qualsiasi cella di Sheet1.

  3. Fare clic sulla scheda Componenti aggiuntivi.

  4. Nel gruppo group1, scegliere Pulsante.

    Nella cella selezionata viene visualizzato un pulsante.

  5. Selezionare un'altra cella di Sheet1.

  6. Nel gruppo group1, scegliere NamedRange.

    Per la cella selezionata viene definito un intervallo denominato.

  7. Selezionare una serie di celle di Sheet1.

  8. Nel gruppo group1, scegliere ListObject.

    Per le celle selezionate viene aggiunto un oggetto elenco.

  9. Salvare il foglio di lavoro.

    I controlli aggiunti a Sheet1 non vengono più visualizzati.

Passaggi successivi

In questo argomento vengono fornite ulteriori informazioni sui controlli nei progetti componente aggiuntivo di Excel:

Vedere anche

Concetti

Utilizzo di controlli Windows Form nei fogli di lavoro di Excel

Controllo NamedRange

Controllo ListObject

Altre risorse

Soluzioni Excel

Controlli nei documenti di Office

Cronologia delle modifiche

Data

Cronologia

Motivo

Aprile 2011

Aggiunto testo che descrive un riferimento ad assembly che è necessario aggiungere se il progetto è destinato a .NET Framework 4.0.

Correzione di bug nel contenuto.