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.
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.
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
Dans le menu Projet, cliquez sur Ajouter un nouvel élément.
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.
Sous l'onglet Contrôles de ruban Office de la Boîte à outils, faites glisser un contrôle CheckBox sur group1.
Cliquez sur CheckBox1 afin de le sélectionner.
Dans la fenêtre Propriétés, modifiez les propriétés suivantes.
Propriété
Valeur
Nom
Button
Étiquette
Button
Ajoutez une deuxième case à cocher dans group1, puis modifiez les propriétés suivantes.
Propriété
Valeur
Nom
NamedRange
Étiquette
NamedRange
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
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.
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); } }
Dans l'Explorateur de solutions, sélectionnez Ribbon1.cs ou Ribbon1.vb.
Dans le menu Affichage, cliquez sur Concepteur.
Dans le Concepteur de ruban, double-cliquez sur NamedRange.
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); } }
Dans le Concepteur de ruban, double-cliquez sur ListObject.
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); } }
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
Dans l'Explorateur de solutions, sélectionnez ThisAddIn.cs ou ThisAddIn.vb.
Dans le menu Affichage, cliquez sur Code.
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); } } }
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.
Appuyez sur F5 pour exécuter votre projet.
Sélectionnez n'importe quelle cellule dans Sheet1.
Cliquez sur l'onglet Compléments.
Dans le groupe group1, cliquez sur Bouton.
Un bouton apparaît dans la cellule sélectionnée.
Sélectionnez une cellule différente dans Sheet1.
Dans le groupe group1, cliquez sur NamedRange.
Une plage nommée est définie pour la cellule sélectionnée.
Sélectionnez une série de cellules dans Sheet1.
Dans le groupe group1, cliquez sur ListObject.
Un objet de liste est ajouté pour les cellules sélectionnées.
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 :
- Pour en savoir plus sur l'enregistrement de contrôles dans une feuille de calcul, consultez l'exemple de contrôles dynamiques de complément Excel dans Exemples et procédures pas à pas relatifs au développement Office.
Voir aussi
Concepts
Utilisation de contrôles Windows Forms sur des feuilles de calcul Excel
Autres ressources
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. |