Oletame, et mingil põhjusel on sul vaja lugeda Exceli failist andmeid, mis arvutatakse välja Excelis kirjutatud macro poolt. Kuidas seda teha C#?
Esmalt on meil vaja lisada Reference sellisele assemblyle nagu Microsoft.Office.Interop.Excel. Juhul kui kompileerimisel saada hulk kummalisi vigu nagu 'Interop type Microsoft.Office.Interop.Excel.ApplicationClass cannot be embedded', siis tuleks selle assembly propertites muuta parameeter Embed Interop Types False peale.
Edasi ei ole juba midagi keerukat, loome ApplicationClass objekti:
var excelApp = new Excel.ApplicationClass();
Avame faili:
var workBook = excelApp.Workbooks.Open("faili nimi.xlsm", false, false, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, true, false, Missing.Value, false, true, Missing.Value);
Käivitame macro:
excelApp.Run("macro nimi");
Tähelepanu tuleb pöörata sellele, et sellisel moel macrot käivitades leitakse üles Module sees defineeritud Public Sub või Function. Parameetrid on teretulnud.
Selleks, et kontrollida, kas vastav fail sisaldab macrosid, on olemas property workBook.HasVBProject. Lisaks, kui soovitakse veenduda, kas soovitud macro on üldse olemas, siis seda saab teha järgmise meetodiga:
bool hasProcedure = false;
var project = workBook.VBProject;
foreach (var component in project.VBComponents) {
VBA.VBComponent vbComponent = component as VBA.VBComponent;
if (vbComponent != null) {
string componentName = vbComponent.Name;
var componentCode = vbComponent.CodeModule;
int componentCodeLines = componentCode.CountOfLines;
int line = 1;
var procedureType = VBA.vbext_ProcKind.vbext_pk_Proc;
while (line < componentCodeLine) {
string procedureName = componentCode.get_ProcOfLine(line, out procedureType);
if (!string.IsNullOrEmpty(procedureName)) {
if ((procedureName == "otsitava_macro_nimi") && (componentName == "Module1"))
hasProcedure = true;
}
}
}
}
Selleks, et kontrollida macro olemasolu, on vajalik lisada reference assemblyle Microsoft.Vbe.Interop. Samuti on vaja lubada Trust access to the VBA project object model oma Excelis, sest vastasel juhul visatakse programmi käivitamisel viga.
Vastav koht on leitav Excel 2010-s: File -> Options ->Trust Center -> Trust Center Settings -> Macro Settings. Selle linnukese panemisega kaasnevad omad ohud, seega mõtle enne, kui midagi teed.
Vastav koht on leitav Excel 2010-s: File -> Options ->Trust Center -> Trust Center Settings -> Macro Settings. Selle linnukese panemisega kaasnevad omad ohud, seega mõtle enne, kui midagi teed.
Näidisfaili on alla laetav siit.