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: che le informazioni contenute in questo argomento si applicano ai progetti a livello di applicazione per Excel 2010.Per ulteriori informazioni, vedere Funzionalità disponibili in base ai tipi di progetto e applicazioni di Office.

In questa procedura dettagliata 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 2012 che include gli strumenti per sviluppatori di Microsoft Office. Per ulteriori informazioni, vedere [Configurazione di un computer per sviluppare soluzioni Office](bb398242\(v=vs.110\).md).
  • Excel 2013 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. 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)
    
        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
    
    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. 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)
    
        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
    
    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. 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)
    
        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
    
    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. 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 dalla raccolta 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 la raccolta 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)
    
        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
    
    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. 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

Cenni preliminari sui controlli Windows Form nei documenti di Office

Controllo NamedRange

Controllo ListObject

Altre risorse

Soluzioni Excel

Controlli nei documenti di Office