Votre Partenaire en Solutions Numériques, Formation et Assistance
Bureautique Expert Confirmé
Développement d'Add-ins (Compléments) Word avec Visual Studio et VB.NET
Passez au niveau supérieur dans l'automatisation et la personnalisation de Microsoft Word en créant des compléments professionnels et robustes.
Introduction et Objectifs du Cours
Bienvenue dans cette formation avancée destinée aux experts de la bureautique souhaitant maîtriser la création de compléments Word modernes. Nous délaisserons VBA pour explorer la puissance de l'écosystème .NET avec Visual Studio et VB.NET, ouvrant la voie à des solutions plus intégrées, performantes et distribuables.
Prérequis :
Excellente maîtrise de Microsoft Word et de ses fonctionnalités.
Solide expérience en programmation VBA pour Word (variables, boucles, conditions, modèle objet Word).
Connaissances de base en programmation orientée objet (concepts de classes, objets, méthodes, propriétés).
Volonté d'apprendre un nouvel environnement de développement (Visual Studio) et un langage proche mais distinct (VB.NET).
Avoir Visual Studio installé (Community Edition suffit) avec les outils de développement Office/VSTO.
Objectifs du cours :
Comprendre l'architecture des compléments VSTO (Visual Studio Tools for Office).
Maîtriser l'environnement de développement Visual Studio pour les projets Office.
Développer des interfaces utilisateur personnalisées dans le ruban Word avec Ribbon XML ou le concepteur.
Interagir avec le document Word en utilisant le modèle objet Word via VB.NET.
Créer des volets de tâches personnalisés (Custom Task Panes).
Gérer les événements de l'application et du document.
Déployer un complément Word.
Comprendre les différences fondamentales entre VBA et VSTO/VB.NET.
Note Importante : Ce cours se concentre sur les compléments VSTO. Les nouvelles approches basées sur les "Office Add-ins" (JavaScript API) sont une alternative moderne mais sortent du cadre de cette formation axée sur VB.NET.
Module 1 : De VBA à VSTO et VB.NET - Introduction
1.1. Pourquoi aller au-delà de VBA ?
Limitations de VBA (performance, déploiement, sécurité, intégration .NET).
Avantages des compléments VSTO :
Accès à l'ensemble du Framework .NET.
Meilleures performances et robustesse.
Options de déploiement plus professionnelles (ClickOnce, MSI).
Sécurité améliorée (signature de code).
Intégration native avec Visual Studio.
1.2. Présentation de VSTO (Visual Studio Tools for Office)
Qu'est-ce que VSTO ? Architecture générale.
Types de projets Office (Compléments applicatifs, Personnalisations au niveau du document).
Le rôle du PIA (Primary Interop Assemblies) pour Word.
1.3. Introduction à VB.NET pour les développeurs VBA
Similitudes et différences syntaxiques clés (déclaration de variables, types, boucles, conditions).
' Exemple de syntaxe VB.NET vs VBA
' Déclaration en VB.NET
Dim userName As String = "Nebelis"
Dim count As Integer = 10
' Boucle en VB.NET
For i As Integer = 0 To count - 1
Console.WriteLine(i)
Next
' Condition en VB.NET
If count > 5 Then
MessageBox.Show("Supérieur à 5")
Else
MessageBox.Show("Inférieur ou égal à 5")
End If
1.4. Configuration de l'Environnement de Développement
Installation de Visual Studio (Community/Professional/Enterprise).
Installation de la charge de travail "Développement Office/SharePoint".
Créer un premier projet de complément Word VSTO.
Explorer l'interface de Visual Studio (Explorateur de solutions, Fenêtre Propriétés, Éditeur de code).
Exercice 1 : Créer un nouveau projet de complément Word VSTO dans Visual Studio. Explorer la structure du projet généré (ThisAddIn.vb). Ajouter un simple `MessageBox.Show("Mon premier Add-in VSTO !")` dans l'événement `ThisAddIn_Startup` et exécuter le complément pour le voir apparaître au démarrage de Word.
Module 2 : Interagir avec Word en VB.NET
2.1. L'Objet `Globals.ThisAddIn.Application`
Accéder à l'instance de l'application Word.
Similitudes avec l'objet `Application` en VBA.
2.2. Le Modèle Objet de Word en .NET
Utilisation des PIA (Primary Interop Assemblies) de Word.
Ajouter la référence `Microsoft.Office.Interop.Word`.
Importer le namespace `Imports Word = Microsoft.Office.Interop.Word`.
Manipulation des objets courants : `Document`, `Range`, `Selection`, `Paragraph`, `Table`, etc.
Différences de syntaxe et de types par rapport à VBA (ex: paramètres optionnels, gestion des objets COM).
' Dans ThisAddIn.vb ou une autre classe
Imports Word = Microsoft.Office.Interop.Word
Public Sub InsertTextAtCursor()
Try
Dim app As Word.Application = Globals.ThisAddIn.Application
If app.Selection IsNot Nothing AndAlso app.Selection.Type <> Word.WdSelectionType.wdSelectionIP Then
app.Selection.TypeText("Texte inséré par VB.NET VSTO! ")
Else
Dim doc As Word.Document = app.ActiveDocument
If doc IsNot Nothing Then
Dim para As Word.Paragraph = doc.Paragraphs.Add()
para.Range.Text = "Texte inséré en fin de document. "
End If
End If
Catch ex As Exception
MessageBox.Show("Erreur : " & ex.Message)
Finally
' Nettoyage des objets COM si nécessaire (moins critique dans VSTO que dans des applis .NET pures)
End Try
End Sub
2.3. Gestion des Objets COM et Libération des Ressources
Le problème des références persistantes aux objets COM.
Utilisation de `System.Runtime.InteropServices.Marshal.ReleaseComObject()` (quand et pourquoi).
Le Garbage Collector de .NET et son interaction avec les objets COM.
Bonnes pratiques pour éviter les fuites de mémoire ou Word qui ne se ferme pas.
Conseil : VSTO gère beaucoup de la complexité de la libération des objets COM pour vous par rapport à l'automation Office depuis une application .NET standard. Cependant, être conscient de ces mécanismes reste important pour les scénarios complexes.
2.4. Parcourir les Collections
Utiliser les boucles `For Each` pour itérer sur `Documents`, `Paragraphs`, `Tables`, etc.
Exercice 2 : Créer une méthode dans votre Add-in qui, sur un document actif, compte le nombre de mots de chaque paragraphe et affiche le résultat dans une `MessageBox` ou écrit ces informations dans un nouveau document.
Module 3 : Personnalisation de l'Interface Utilisateur - Le Ruban (Ribbon)
3.1. Options pour Personnaliser le Ruban
Concepteur de Ruban (Ribbon Designer) : approche visuelle.
Ruban XML : approche plus flexible et puissante, basée sur du XML.
3.2. Utilisation du Concepteur de Ruban
Ajouter un élément "Ruban (Visuel)" au projet.
Ajouter des onglets, groupes, boutons, cases à cocher, menus déroulants, etc.
Lier les événements des contrôles du ruban à des méthodes VB.NET.
Exemple du Concepteur de Ruban dans Visual Studio.
3.3. Utilisation du Ruban XML
3.3.1. Principes du Ruban XML
Ajouter un élément "Ruban (XML)" au projet.
Structure du fichier XML (customUI, ribbon, tabs, group, button, etc.).
3.3.2. Le Fichier de Code-Behind du Ruban (Ribbon Class)
Implémenter l'interface `IRibbonExtensibility`.
La méthode `GetCustomUI` pour charger le XML.
Méthodes de rappel (callbacks) pour les actions et les états des contrôles.
Signature des méthodes de rappel (ex: `Sub MyButton_OnAction(control As IRibbonControl)`).
Invalider des contrôles pour mettre à jour leur état (`IRibbonUI.InvalidateControl`).
' Extrait du code-behind VB.NET pour le Ruban XML
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices
Public Class NebelisRibbon
Implements IRibbonExtensibility
Private ribbon As IRibbonUI
Public Function GetCustomUI(ByVal ribbonID As String) As String Implements IRibbonExtensibility.GetCustomUI
' Lire et retourner le contenu du fichier XML du ruban
Return My.Resources.NebelisRibbonXml ' Supposant que le XML est une ressource
End Function
Public Sub Ribbon_Load(ByVal ribbonUI As IRibbonUI)
Me.ribbon = ribbonUI
MessageBox.Show("Ruban Nebelis chargé !")
End Sub
Public Sub OnSayHello_Click(ByVal control As IRibbonControl)
MessageBox.Show("Bonjour de la part de Nebelis Add-in !", "Salutations")
End Sub
Public Sub OnInsertText_Click(ByVal control As IRibbonControl)
Dim addIn As ThisAddIn = Globals.ThisAddIn
' Appeler une méthode de ThisAddIn ou une autre classe
' par exemple : addIn.InsertCustomText()
Try
Globals.ThisAddIn.Application.Selection.TypeText("Texte via Ruban XML! ")
Catch ex As Exception
MessageBox.Show("Erreur : " & ex.Message, "Erreur d'insertion")
End Try
End Sub
' Autres callbacks (getEnabled, getVisible, etc.) peuvent être ajoutés ici
End Class
3.4. Images Personnalisées pour les Contrôles du Ruban
Utiliser `imageMso` pour les icônes Office intégrées.
Utiliser `image` et la méthode de rappel `getImage` pour des images personnalisées.
Exercice 3 : En utilisant le Ruban XML, créez un nouvel onglet "Mes Outils Experts" avec un groupe. Dans ce groupe, ajoutez un bouton qui, lorsqu'on clique dessus, insère la date et l'heure actuelles dans le document Word à la position du curseur.
Module 4 : Volets de Tâches Personnalisés (Custom Task Panes)
4.1. Qu'est-ce qu'un Volet de Tâches Personnalisé ?
Panneau ancrable dans l'interface Word.
Permet d'afficher des interfaces utilisateur plus riches (contrôles Windows Forms ou WPF).
4.2. Création d'un Volet de Tâches avec Windows Forms
Ajouter un "User Control (Windows Forms)" au projet.
Concevoir l'interface du User Control avec des contrôles WinForms (TextBox, Button, ListBox, etc.).
Programmer la logique du User Control.
4.3. Afficher et Gérer le Volet de Tâches
Utiliser la collection `Globals.ThisAddIn.CustomTaskPanes`.
Méthode `Add(userControl, title)`.
Gérer la visibilité du volet (afficher/masquer via un bouton du ruban).
Interactions entre le volet de tâches et le document Word.
' Dans ThisAddIn.vb
Private myTaskPane As Microsoft.Office.Tools.CustomTaskPane
Private myUserControl As MyUserControl ' Suppose que vous avez un UserControl nommé MyUserControl
Public Sub ShowMyTaskPane()
If myTaskPane Is Nothing Then
myUserControl = New MyUserControl()
myTaskPane = Me.CustomTaskPanes.Add(myUserControl, "Mon Volet Nebelis")
myTaskPane.Visible = True
AddHandler myTaskPane.VisibleChanged, AddressOf MyTaskPane_VisibleChanged
Else
myTaskPane.Visible = Not myTaskPane.Visible
End If
End Sub
Private Sub MyTaskPane_VisibleChanged(sender As Object, e As EventArgs)
' Mettre à jour l'état d'un bouton du ruban pour refléter la visibilité du volet, par exemple
' Globals.Ribbons.NebelisRibbon.InvalidateControl("tglShowTaskPane") ' Si vous avez un ToggleButton
End Sub
' Pour supprimer le volet quand il n'est plus nécessaire (ex: fermeture de Word)
Public Sub RemoveMyTaskPane()
If myTaskPane IsNot Nothing Then
Me.CustomTaskPanes.Remove(myTaskPane)
myTaskPane = Nothing
myUserControl.Dispose() ' Important de libérer les ressources du UserControl
myUserControl = Nothing
End If
End Sub
Private Sub ThisAddIn_Shutdown(sender As Object, e As System.EventArgs) Handles Me.Shutdown
RemoveMyTaskPane()
End Sub
Exercice 4 : Créez un User Control simple avec un TextBox et un Button. Ajoutez un bouton à votre ruban qui affiche/masque ce volet de tâches. Lorsque l'utilisateur tape du texte dans le TextBox du volet et clique sur le Button, ce texte doit être inséré dans le document Word actif.
Module 5 : Gestion des Événements et Déploiement
5.1. Gestion des Événements de l'Application Word
Événements disponibles sur `Globals.ThisAddIn.Application` (ex: `DocumentOpen`, `DocumentBeforeSave`, `WindowActivate`).
S'abonner et se désabonner aux événements.
' Dans ThisAddIn_Startup
AddHandler Me.Application.DocumentOpen, AddressOf Application_DocumentOpen
AddHandler Me.Application.DocumentBeforeClose, AddressOf Application_DocumentBeforeClose
' Dans ThisAddIn_Shutdown
RemoveHandler Me.Application.DocumentOpen, AddressOf Application_DocumentOpen
RemoveHandler Me.Application.DocumentBeforeClose, AddressOf Application_DocumentBeforeClose
' ... Méthodes de gestion des événements ...
Private Sub Application_DocumentOpen(Doc As Word.Document)
MessageBox.Show($"Document ouvert : {Doc.Name}")
End Sub
Private Sub Application_DocumentBeforeClose(Doc As Word.Document, ByRef Cancel As Boolean)
Dim result As DialogResult = MessageBox.Show($"Sauvegarder les modifications de {Doc.Name} avant de fermer ?",
"Confirmation", MessageBoxButtons.YesNoCancel)
If result = DialogResult.Yes Then
If Not Doc.Saved Then Doc.Save()
ElseIf result = DialogResult.Cancel Then
Cancel = True ' Annuler la fermeture
End If
' Si No, ne rien faire, le document se fermera sans sauvegarder (si pas de prompt Word natif)
End Sub
5.2. Déploiement d'un Complément VSTO
Options de déploiement : ClickOnce, Windows Installer (MSI).
Prérequis pour l'ordinateur client (Framework .NET, VSTO Runtime, PIA Office).
Publication avec ClickOnce :
Configuration des propriétés du projet (Signature, Publication).
Génération des fichiers de déploiement.
Installation et mise à jour par l'utilisateur.
Signature du code pour la confiance et la sécurité.
Déploiement : Le déploiement ClickOnce est le plus simple pour commencer. Les déploiements MSI offrent plus de contrôle mais sont plus complexes à mettre en place.
5.3. Débogage et Gestion des Erreurs
Utilisation du débogueur de Visual Studio.
Points d'arrêt, Espion, Fenêtre Exécution.
Blocs `Try...Catch...Finally` pour une gestion robuste des erreurs.
Journalisation des erreurs (ex: `System.Diagnostics.Trace` ou des bibliothèques de logging).
Exercice 5 :
1. Ajoutez un gestionnaire d'événements pour `Application.DocumentBeforeSave` qui demande à l'utilisateur s'il souhaite ajouter une propriété de document personnalisée "RéviséPar" avec son nom d'utilisateur avant chaque sauvegarde.
2. Explorez les options de publication ClickOnce de votre projet de complément. Essayez de publier une version simple de votre Add-in.
Conclusion et Prochaines Étapes
Félicitations ! Vous avez exploré les fondations du développement de compléments Word professionnels avec Visual Studio et VB.NET. Vous disposez maintenant des compétences pour créer des solutions bien plus puissantes et intégrées que ce qui est possible avec VBA seul.
Résumé des Acquis :
Compréhension de l'architecture VSTO et des avantages par rapport à VBA.
Navigation dans Visual Studio et création de projets de compléments Word.
Interaction avec le modèle objet Word en VB.NET.
Personnalisation du ruban Word via le concepteur et XML.
Création et gestion de volets de tâches personnalisés.
Bases du déploiement d'un complément VSTO.
Pour Aller Plus Loin :
Approfondir WPF pour des interfaces utilisateur encore plus riches dans les volets de tâches.
Interaction avec des sources de données externes (bases de données, services web).
Utilisation avancée du Framework .NET (LINQ, Tâches asynchrones, etc.).
Développement de compléments pour d'autres applications Office (Excel, Outlook).
Explorer les "Office Add-ins" modernes basés sur JavaScript/HTML5 si vos besoins évoluent vers des solutions multiplateformes.
Techniques de déploiement avancées et gestion centralisée (pour les entreprises).
Pratiquez, pratiquez, pratiquez ! La meilleure façon de maîtriser ces concepts est de les appliquer à des projets concrets qui répondent à des besoins réels. N'hésitez pas à consulter la documentation MSDN de Microsoft pour VSTO.