Otse põhisisu juurde

Exceli macro käivitamine oma programmist

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.

Näidisfaili on alla laetav siit.

Populaarsed postitused sellest blogist

Vahvad ütlused....

Minu ema on väga kannatlik. Viie lapse, nelja koera ja kahe töökohaga läheb tal seda vaja.   Iga ema tuleks raskusteta toime mitme lennudišpetseri tööga.   Õige naine armastab ja mõistab mees liigagi hästi... Ta teab, et ilma temata on mees vaene, nõrk, õnnetu, nööpideta olend.   Mehed on nagu rakud pihkudes. Nad ilmuvad välja siis, kui töö on tehtud.   "Mitu meest läheb vaja WC-paberi rulli vahetamiseks? – Ei tea. Seda pole kunagi juhtunud.“   Tema külmkapist leidsin jogurti, mille säilivusaja lõpp oli „Dinosauruste ajal“.   „Lahkem jumal oleks hoolitsenud selle eest, et emale kasvaks peale iga sünnitust lisakätepaar.“   Ma ei mõista, kuidas lapsed suudavad näha šokolaaditahvlit kolme miili kauguselt, aga ei näe meeter korda poolteist vaipa, mis on nende  jalge all kortsu läinud ja läbi kahe toa lohisenud.   Kodu koristamine, kui lapsed alles kasvavad, on nagu lume rookimine, kui sadu pole veel lõppenud. ...

Aforismid, mõtteterad....

Naudi elu; on juba hiljem kui sa arvad. Hiina vanasõna -------- Seda, kes ei võta nõu kuulda, ei saa ka aidata. Benjamin Franklin -------- Räägi tõtt ja sul ei ole vaja midagi meeles pidada! Mark Twain -------- Kel pole julgust rannikuid silmist kaotada, see maailmajagusid ei avasta! -------- Elu maa peal on kallis, kuid see sisaldab ka iga-aastase tasuta reisi ümber päikese. -------- Kõige kallemaid asju antakse inimesele muidu. -------- Ka pimedus liigub valguse kiirusega. -------- Käsikäes käib ämbrissegi astumine kergelt ja kui juba kukkuda, siis ühekoos ja kõrgelt. Ott Arder ------- Põruta kuu poole. Isegi kui Sa mööda lendad, maandud Sa tähtede seas. -------- Lapsed peavad suurte inimestega väga kannatlikud olema Antoine de Saint-Exupery -------- Mitte ükski vihmapiisk ei pea ennast uputuse eest vastutavaks. ------- Sünni eest tuleb maksta surmaga. ------ Kui hoiad korras pisiasjad, siis suured korraldavad end ise. H. Harrison --...

Luuletusi vol.1

Vaata ema, olen tuul - mängin sinu juustes. Sosistan sul kõrva tasa: "Olen sinu juures." Vaata ema, olen kuu - öösel sind ma paitan. Naeratus on sinu suul, unenäos sind aitan. Vaata ema, olen päike - sinu silmis säran. Näen seal hulga pisaraid, pühi need nüüd ära. Vaata ema, olen lumi - nõnda külm ja valge. Akna taha teen sul kohe hästi mitu hange. Vaata ema, olen vihm - märjaks teen su põsed. Kui vaid saaks, siis uhuks ära kõik su suured mured. Vaata ema, olen siin, sinu südames ja hinges. Olen sinu lähedal - SINU VÄIKE INGEL. (autor teadmata, pärit ühest foorumist) ----------------------------------------------------------------------------------- kes peaks koldest kustutama tule kui me rõõmu aeg saab täis kui me varje   seintel enam pole kui me vahel valu käib kes peaks laualt koristama   killud puruneb kui lootus meis kelle hinge saatus riismed   pillub kõigest olnust vabaks meid keegi alati me ööd lööb   kokku salamisi mured viib alles hiljem näed...