C# - Office makrók futtatása alkalmazásainkból

forráskód letöltése
A Microsoft Office programcsomag elemei – hála kidolgozott objektummodelljének – elérhetők alkalmazásainkból, egy sor feladat elvégzéséhez vehetjük igénybe a beépített képességeiket. Mindezeken túl képesek vagyunk lefuttatni az alkalmazásokban megírt makrókat is, csupán az adott makró ismeretére van szükségünk. Cikkünkben bemutatjuk, hogyan valósítható meg ez.
A mellékelt példában egy Word makrót futtatunk le. Az alkalmazás mappájában megtalálható Dok1.doc nevű Word dokumentumról van szó, mely az egyszerűség kedvéért csak egy üzenetablakot jelenít meg.
Public Sub SampleMacro()
   MsgBox "Macro üzenetablak...."
End Sub
A Word alkalmazás eléréséhez csupán referenciaként meg kell adnunk az alkalmazás objektumait tartalmazó COM komponenst. Ehhez válasszuk a Project - Add reference menüpontot. A megjelenő ablakban a COM lapon keressük elő a Microsoft Word 10.0 Object Library elemet (a verziószám függ a feltelepített Word verziójától).
A Word alkalmazást az Application objektum reprezentálja, mely rendelkezik egy Run nevű metódussal a dokumentumban megírt makrók futtatásához. Amennyiben a metódust közvetlenül akarjuk meghívni, akkor meg kell adni a függvény végtelennek tűnő paraméterlistáját.
Ez azonban igen körülményes, mert – az objektummodell C#-ból történő elérésének dokumentálatlansága miatt – egy sor paraméter funkcióját homály fedi. Van azonban egyszerűbb módszer is.
Az alkalmazás Form-ján egyetlen nyomógombot találunk, mellyel megnyithatjuk a Word dokumentumot, és futtathatjuk a makró egyetlen moduljában megtalálható SampleMacro nevű függvényt.
Első lépésben felvesszük a kapcsolatot a Word alkalmazással, majd láthatóvá is tesszük azt.
Word.ApplicationClass wa = new Word.ApplicationClass();
wa.Visible = true;
Egy object típusú objektumban megadjuk a megnyitandó Word dokumentum elérési útvonalát.
object file = Application.StartupPath + "\\Dok1.doc";
A Word Application osztálya rendelkezik egy Documents nevű kollekcióval, mely a dokumentumok objektumait tartalmazza. A dokumentum megnyitásához a kollekció Open metódusát kell a megfelelő paraméterekkel meghívni.
Word.Document wd = wa.Documents.Open(ref file, ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref m);
A makró futtatásához lekérdezzük a Word alkalmazást reprezentáló objektum típusát. Erre szolgál a GetType metódus. Majd rögtön meghívjuk az InvokeMember metódust is, hogy az osztály Run metódusát meghívhassuk.
wa.GetType().InvokeMember("Run", BindingFlags.Default | BindingFlags.InvokeMethod,null, wa, new object[]{"SampleMacro"});
A metódus első paraméterében kell megadni a meghívandó tag nevét. A második paraméterben bináris értékek kombinációját találjuk, melyek megadják, hogy milyen típusú tagról van szó, jelen esetben ez egy metódus. Ezt jelezzük a BindingFlags.InvokeMethod értékkel.
A negyedik paraméter tartalmazza az objektumot, melynek tagját elérjük. Az utolsó paraméterben megadhatjuk a meghívandó metódus paramétereit. Jelen esetben csak egy paramétert kell megadnunk, mégpedig a makró moduljában található egyetlen függvény nevét.
A művelet végén megjelenik a kis üzenetablak. Mindezek után bezárjuk a dokumentumot, majd felszabadítjuk a Word.Document objektum által foglalt memóriaterületet.
wd.Close(ref m, ref m, ref m);
Marshal.ReleaseComObject(wd);
wd = null;
Ugyanezt tesszük az alkalmazás objektumával is.
wa.Quit(ref m, ref m, ref m);
Marshal.ReleaseComObject(wa);
wa = null;