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.