Partager via


Procédure pas à pas : ajout de contrôles à une feuille de calcul au moment de l'exécution dans un projet d'application

Vous pouvez ajouter des contrôles à n'importe quelle feuille de calcul ouverte à l'aide d'un complément Excel. Cette procédure pas à pas explique comment utiliser le ruban pour permettre aux utilisateurs d'ajouter Button, NamedRange et ListObject à une feuille de calcul. Pour plus d'informations, consultez Ajout de contrôles à des documents Office au moment de l'exécution.

S'applique à : Les informations contenues dans cette rubrique s'appliquent aux projets de niveau application pour Excel 2007 et Excel 2010. Pour en savoir plus, consultez Fonctionnalités disponibles par type d'application et de projet Office.

Cette procédure pas à pas décrit les tâches suivantes :

  • Fourniture d'une interface utilisateur (IU) permettant d'ajouter des contrôles à la feuille de calcul.

  • Ajout de contrôles à la feuille de calcul.

  • Suppression de contrôles de la feuille de calcul.

Notes

Il est possible que votre ordinateur affiche des noms ou des emplacements différents pour certains des éléments d'interface utilisateur de Visual Studio dans les instructions suivantes. L'édition de Visual Studio dont vous disposez et les paramètres que vous utilisez déterminent ces éléments. Pour plus d'informations, consultez Paramètres Visual Studio.

Composants requis

Pour exécuter cette procédure pas à pas, vous devez disposer des composants suivants :

-

Une édition de Visual Studio 2010 qui inclut les outils de développement Microsoft Office. Pour plus d'informations, consultez [Configuration d'un ordinateur pour développer des solutions Office](bb398242\(v=vs.100\).md).
  • Microsoft Office Excel 2007 ou Excel 2010.

Création d'un projet de complément Excel.

Démarrez en créant un projet de complément Excel.

Pour créer un projet de complément Excel.

  1. Dans Visual Studio, créez un projet de complément Excel et nommez-le ExcelDynamicControls. Pour plus d'informations, consultez Comment : créer des projets Office dans Visual Studio.

  2. Si votre projet cible .NET Framework 4, ajoutez une référence à l'assembly Microsoft.Office.Tools.Excel.v4.0.Utilities.dll. Cette référence est obligatoire pour ajouter par programmation ultérieurement dans cette procédure un contrôle Windows Forms à la feuille de calcul.

Fourniture d'une interface utilisateur permettant l'ajout de contrôles à une feuille de calcul

Ajoutez un onglet personnalisé au ruban Excel. Les utilisateurs peuvent activer des cases à cocher sous l'onglet afin d'ajouter des contrôles à une feuille de calcul.

Pour fournir une interface utilisateur permettant l'ajout de contrôles à une feuille de calcul

  1. Dans le menu Projet, cliquez sur Ajouter un nouvel élément.

  2. Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez Ruban (Concepteur visuel), puis cliquez sur Ajouter.

    Un fichier nommé Ribbon1.cs ou Ribbon1.vb s'ouvre dans le Concepteur de ruban et affiche un onglet et un groupe par défaut.

  3. Sous l'onglet Contrôles de ruban Office de la Boîte à outils, faites glisser un contrôle CheckBox sur group1.

  4. Cliquez sur CheckBox1 afin de le sélectionner.

  5. Dans la fenêtre Propriétés, modifiez les propriétés suivantes.

    Propriété

    Valeur

    Nom

    Button

    Étiquette

    Button

  6. Ajoutez une deuxième case à cocher dans group1, puis modifiez les propriétés suivantes.

    Propriété

    Valeur

    Nom

    NamedRange

    Étiquette

    NamedRange

  7. Ajoutez une troisième case à cocher dans group1, puis modifiez les propriétés suivantes.

    Propriété

    Valeur

    Nom

    ListObject

    Étiquette

    ListObject

Ajout de contrôles à la feuille de calcul

Les contrôles gérés peuvent être ajoutés uniquement aux éléments hôtes, qui agissent comme des conteneurs. Comme les projets de complément fonctionnent avec n'importe quel classeur ouvert, le complément convertit la feuille de calcul en un élément hôte ou obtient un élément hôte existant, avant d'ajouter le contrôle. Ajoutez le code aux gestionnaires d'événements Click de chaque contrôle pour générer un élément hôte Worksheet basé sur la feuille de calcul ouverte. Ensuite, ajoutez un Button, un NamedRangeet un ListObject à la sélection actuelle dans la feuille de calcul.

Pour ajouter des contrôles à une feuille de calcul

  1. Dans le Concepteur de ruban, double cliquez sur Bouton.

    Le gestionnaire d'événements Click de la case à cocher Bouton s'ouvre dans l'Éditeur de code.

  2. Remplacez le gestionnaire d'événements Button_Click par le code suivant.

    Ce code utilise la méthode GetVstoObject pour obtenir un élément hôte qui représente la première feuille de calcul dans le classeur, puis ajoute un contrôle Button à la cellule actuellement sélectionnée.

    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. Dans l'Explorateur de solutions, sélectionnez Ribbon1.cs ou Ribbon1.vb.

  4. Dans le menu Affichage, cliquez sur Concepteur.

  5. Dans le Concepteur de ruban, double-cliquez sur NamedRange.

  6. Remplacez le gestionnaire d'événements NamedRange_Click par le code suivant.

    Ce code utilise la méthode GetVstoObject pour obtenir un élément hôte qui représente la première feuille de calcul dans le classeur, puis définit un contrôle NamedRange pour la ou les cellules actuellement sélectionnées.

    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. Dans le Concepteur de ruban, double-cliquez sur ListObject.

  8. Remplacez le gestionnaire d'événements ListObject_Click par le code suivant.

    Ce code utilise la méthode GetVstoObject pour obtenir un élément hôte qui représente la première feuille de calcul dans le classeur, puis définit un ListObject pour la ou les cellules actuellement sélectionnées.

    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. Ajoutez les instructions suivantes au début du fichier de code du ruban.

    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;
    

Suppression de contrôles de la feuille de calcul

Les contrôles ne sont pas rendus persistants lorsque la feuille de calcul est enregistrée et fermée. Vous devez supprimer par programmation tout contrôle Windows Forms généré avant que la feuille de calcul soit enregistrée, sinon, seul un contour du contrôle apparaît lorsque le classeur est rouvert. Ajoutez du code à l'événement WorkbookBeforeSave qui supprime des contrôles Windows Forms de la collection de contrôles de l'élément hôte généré. Pour plus d'informations, consultez Rendre des contrôles dynamiques persistants dans des documents Office.

Pour supprimer des contrôles de la feuille de calcul

  1. Dans l'Explorateur de solutions, sélectionnez ThisAddIn.cs ou ThisAddIn.vb.

  2. Dans le menu Affichage, cliquez sur Code.

  3. Ajoutez la méthode suivante à la classe ThisAddIn. Ce code prend la première feuille de calcul du classeur, puis utilise la méthode HasVstoObject pour vérifier si la feuille de calcul possède un objet de feuille de calcul généré. Si la feuille de calcul générée possède des contrôles, le code obtient cet objet de feuille de calcul et itère au sein de la collection de contrôles, en supprimant les contrôles.

    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. Dans C#, vous devez créer un gestionnaire d'événements pour l'événement WorkbookBeforeSave. Vous pouvez placer ce code dans la méthode ThisAddIn_Startup. Pour plus d'informations sur la création de gestionnaires d'événements, consultez Comment : créer des gestionnaires d'événements dans les projets Office. Remplacez la méthode ThisAddIn_Startup par le code suivant.

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

Test de la solution

Ajoutez des contrôles à une feuille de calcul en les sélectionnant à partir d'un onglet personnalisé sur le ruban. Lorsque vous enregistrez la feuille de calcul, ces contrôles sont supprimés.

Pour tester la solution.

  1. Appuyez sur F5 pour exécuter votre projet.

  2. Sélectionnez n'importe quelle cellule dans Sheet1.

  3. Cliquez sur l'onglet Compléments.

  4. Dans le groupe group1, cliquez sur Bouton.

    Un bouton apparaît dans la cellule sélectionnée.

  5. Sélectionnez une cellule différente dans Sheet1.

  6. Dans le groupe group1, cliquez sur NamedRange.

    Une plage nommée est définie pour la cellule sélectionnée.

  7. Sélectionnez une série de cellules dans Sheet1.

  8. Dans le groupe group1, cliquez sur ListObject.

    Un objet de liste est ajouté pour les cellules sélectionnées.

  9. Enregistrez la feuille de calcul.

    Les contrôles que vous avez ajoutés à Sheet1 n'apparaissent plus.

Étapes suivantes

Pour en savoir plus sur les contrôles des projets de complément Excel, consultez la rubrique suivante :

Voir aussi

Concepts

Utilisation de contrôles Windows Forms sur des feuilles de calcul Excel

NamedRange, contrôle

ListObject, contrôle

Autres ressources

Solutions Excel

Contrôles sur des documents Office

Historique des modifications

Date

Historique

Motif

Avril 2011

Ajout d'une description de la référence d'assembly à ajouter si votre projet cible .NET Framework 4.0.

Résolution des bogues de contenu.