Le ruban d’action office se présente sous la forme d’un panneau latéral, par défaut à droite, et qui permet de rajouter des actions personnalisées. Ainsi, nous pouvons rajouter à Excel, Word… nos propres UI. Ainsi, des actions répétitives peuvent être codées en VSTO et permettre à l’utilisateur de cliquer sur un bouton et d’insérer dans une feuille Excel des données provenant d’une base de données SQL, par exemple.
Le problème ici, se situe dans le fait que l’utilisateur peut ouvrir plusieurs Excel, plusieurs classeurs Excel contenant plusieurs feuilles. Or, dans certains cas, l’affichage de notre UI dans le panneau d’actions doit différer suivant le fichier Excel ouvert ou la feuille Excel en cours d’édition.
Pour cela, il va falloir s’appuyer sur le nom de la feuille Excel. Or ce nom peut être changer par l’utilisateur. Il faut donc récupérer son nom de code, qui n’est accessible que si le VBA est exécutable sous Excel. Voici la méthode à suivre pour activer ce code VBA, récupérer le nom de code de la feuille et afficher la bonne UI suivant la feuille active dans le classeur Excel.
Tout d’abord, il faut commencer par afficher le panneau d’actions et lui lier un User Control qui hébergera notre UI.
2: /// Create the task panel
4: public void CreateTaskPanel()
6: // Création de notre panneau UI
7: _taskPaneControl = new TaskPaneControl();
8: // Assigne le panneau a notre panneau d'action Office, ici celui d'Excel
9: _customTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(_taskPaneControl,
"My panel control");
10: _customTaskPane.Width = 350;
11: _customTaskPane.Visible = true;
12: //Récupère la version d'Excel
13: string version =
Globals.ThisAddIn.Application.GetType().InvokeMember("Version",
System.Reflection.BindingFlags.GetProperty, null,
Globals.ThisAddIn.Application, null,
new CultureInfo("en-US")).ToString();
14: SetVBTrusting(version);
Nous allons maintenant voir comment rendre exécutable du VBA sous Excel. Pour cela, il va falloir attaquer le registre de Windows pour créer une clé si elle n’existe pas et lui passer une valeur “1”. Voici comment faire :
2: /// Customise le registre Windows pour permettre l'exécution VBA sous Office.
4: /// <param name="excelVersion">Excel version</param>
5: public static void SetVBTrusting(string excelVersion)
7: if (string.IsNullOrEmpty(excelVersion))
throw new ArgumentNullException("excelVersion");
8: string keyPath = string.Format(
@"Software\Microsoft\Office\{0}\Excel\Security", excelVersion);
9: RegistryKey key = null;
12: key = Registry.CurrentUser.OpenSubKey(keyPath, true);
14: key.SetValue("AccessVBOM", 1);
16: throw new Exception("La clé VBOM ne peut être trouvé.");
18: catch (SecurityException e)
20: throw new Exception("La clé VBOM ne peut être mis a jour.", e);
La ligne 12 permet de tenter de récupérer la clé “VBOM” sur laquelle se base Excel pour rendre exécutable du code VBA, puis la ligne 14 rend cette fonction utilisable.
Enfin, nous avons rajouter dans notre UI un simple label qui va nous permettre de rendre visible le nom de code de la feuille Excel en cours d’exécution. A chaque changement de feuille, il faut donc rafraichir ce label. Voici comment procédé :
2: /// Rafraichit notre UI dans le panneau de control
4: /// <param name="currentSheet">Feuille Excel en cours d édition</param>
5: private void RefreshTaskPanel(Excel.Worksheet currentSheet)
7: if (currentSheet != null)
9: string codeName =
currentSheet.Application.ActiveWorkbook.VBProject.VBComponents.Item
(currentSheet.CodeName).Name;
10: _taskPaneControl.lblSheetName.Text = codeName;
Bien sûr, toutes ces méthodes doivent être appelées dans les bons évènements d’Excel tel que l’évènement d’activation de la feuille Excel.
La capture d’écran suivante montre bien que notre panneau d’action appelé “My panel control”, qui contient notre User Control qui comprend lui même notre label, affiche bien le nom de code de la première feuille, qui est “Feuil1”, alors que l’utilisateur à renommer cette feuille “Tableau1”.

Vous pouvez donc maintenant créer une UI différentes suivant la feuille sélectionnée par l’utilisateur, rendant ainsi votre AddIn plus flexible aux exigences de vos clients. Vous trouverez, joins à cet article, tout le code source.
VSTOTaskPane.zip (85,12 kb)