Exécution de macro dans Word depuis du C#

Voici un petit bout de code qui vous permettra d’appeler des macro dans un document, par exemple pour remplir une template.

Tout d’abord il faut rajouter une référence vers la librairie Microsoft.Office.Interop.Word
Ensuite on ouvre le document, la méthode open prend beaucoup d’arguments mais il ne faut pas être effrayé par la quantité, en effet il s’agit entre autre des user/pwd, read-only et ce genre de chose. De plus une description dans l’IntelliSense est disponible, so don’t worry be happy.

object filePath = @"C:\Users\Manu\Documents\Visual Studio 2010\Projects\MacroCall\MacroCall\bin\Debug\mondoc.docm";
object typeMissing = Type.Missing;
_Application application = new Microsoft.Office.Interop.Word.Application();
Documents documents = application.Documents;
_Document document = documents.Open
                    (ref filePath, ref typeMissing, ref typeMissing, ref typeMissing,
                    ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing,
                    ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing,
                    ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing);

Le document ouvert on vas créer une copie en l’enregistrant sous, les opérations suivantes s’exécuteront sur la copie et non sur l’original. La encore, la methode SaveAs est equivalente a la méthode Open.

object newFilePath = @"C:\Users\Manu\Documents\Visual Studio 2010\Projects\MacroCall\MacroCall\bin\Debug\mondoc2.docm";

document.SaveAs2(ref newFilePath, ref typeMissing, ref typeMissing, ref typeMissing,
                    ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing,
                    ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing,
                    ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing);

Notre documenté chargé et un copie faite, nous allons passer a l’appel de nos macros.
Voici leur code :

Sub Macro1()
    Label1.Caption = "De la macro"
End Sub

Sub Macro2(p As String)
    Label1.Caption = p
End Sub

Sub AddProducts(productName As String, quantity As String, unitPrice As String)
    Dim oTable As Table
    Dim oCell As Cell
    Dim oNewRow As Row

    Set oTable = ActiveDocument.Tables(1)
    oTable.Rows.Add
    Set oNewRow = oTable.Rows(oTable.Rows.Count)

    oNewRow.Cells(0).Range = productName
    oNewRow.Cells(1).Range = quantity
    oNewRow.Cells(2).Range = unitPrice
End Sub

La première vas juste remplir un label avec « De la macro » et la seconde vas rajouter dans un autre label le texte passé en argument, la dernière rajoute une ligne a un tableau et y insère les éléments passé en argument.

L’appel de macro s’exécute via la méthode InvokeMember. Les arguments sont le nom de la méthode à appeler suivi des BindingFlags, le binder a utiliser, la cible de l’invoke et enfin les arguments sous forme d’un tableau d’objet.
Basiquement, seul le tableau d’objet différera d’un appel de macro a l’autre.
Il suffit de mettre en première position le nom de la macro et rajouter ensuite un élément pour chaque argument nécessaire a la macro.
Voici nos 3 tableaux pour les 3 macros

Object[] Macro1 = new Object[] { "Macro1" };
Object[] Macro2 = new Object[] { "Macro2", "Mon Texte A Afficher" };
Object[] AddProducts = new Object[] { "AddProducts", "C# 4.0 - Ref Book", "1", "45€"};

Maintenant on les appels

application.GetType().InvokeMember
(
    "Run",
    System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod,
    null,
    application,
    Macro1
);
application.GetType().InvokeMember
(
    "Run",
    System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod,
    null,
    application,
    Macro2
);
            application.GetType().InvokeMember
(
    "Run",
    System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod,
    null,
    application,
    AddProducts
);

Et c’est fini, quand nous allons voir notre document, les macros se sont bien executés.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s