Logo NEBELIS

NEBELIS

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 :

Objectifs du cours :

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 ?

1.2. Présentation de VSTO (Visual Studio Tools for Office)

1.3. Introduction à VB.NET pour les développeurs VBA


' 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

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`

2.2. Le Modèle Objet de Word en .NET


' 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

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

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

3.2. Utilisation du Concepteur de Ruban

Concepteur de Ruban dans Visual Studio
Exemple du Concepteur de Ruban dans Visual Studio.

3.3. Utilisation du Ruban XML

3.3.1. Principes du Ruban XML

3.3.2. Le Fichier de Code-Behind du Ruban (Ribbon Class)




  
    
      
        
          

' 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

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é ?

4.2. Création d'un Volet de Tâches avec Windows Forms

4.3. Afficher et Gérer le Volet de Tâches


' 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


' 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

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

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 :

Pour Aller Plus Loin :

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.