Excel avsluttes ikke når du kaller avslutt-metoden når du automatiserer fra JScript
Artikkel
Gjelder for:
Microsoft Excel
Symptomer
Når du automatiserer Microsoft Excel fra Microsoft JScript, forblir Excel i minnet etter at du har kalt Avslutt-metoden til du lukker Internet Explorer eller går til en annen side.
Årsak
JScript holder fast på en referanse til Excel. Fordi det finnes en referanse i Excel når du utsteder kommandoen Avslutt, avsluttes ikke Excel. JScript er et søppelinnsamlingsspråk, noe som betyr at motoren rydder opp etter seg selv på et bestemt tidspunkt, og ikke når du angir variablene til NULL. Når du slår av Internet Explorer eller flytter til en annen side, ødelegges motoren. Denne virkemåten tvinger søppelinnsamling og frigjør referansen til Excel.
Løsning
Hvis du vil omgå dette problemet, kan du kalle collectgarbage-metoden. Dette tvinger JScripts søppelsamling til å skje umiddelbart, noe som frigir referansen til Excel. Følgende kodesnutt illustrerer hvordan du bruker CollectGarbage-metoden:
HTML
<HTML><BODY><INPUTtype="button"value="Automate Excel"name=AutomateExcelonclick="StartExcel()"><SCRIPTLANGUAGE=Javascript>var idTmr = "";
function StartExcel() {
var oExcel;
oExcel = new ActiveXObject("Excel.Application");
oExcel.Quit();
oExcel = null;
idTmr = window.setInterval("Cleanup();",1);
}
function Cleanup() {
window.clearInterval(idTmr);
CollectGarbage();
}
</SCRIPT></BODY></HTML>
Legg merke til at CollectGarbage-metoden ikke kalles direkte etter Excels Avslutning-metode. Du må gi JScript litt tid før du ringer CollectGarbage. En tidtaker brukes i dette eksemplet til å vise hvordan du venter en kort stund før du tvinger søppelinnsamling.
En annen løsning er å bruke VBScript for automatisering av Microsoft Excel. I motsetning til JScript er ikke VBScript et søppelinnsamlingsspråk. Referanser utgis derfor når du angir variablene til Ingenting. Ved hjelp av VBScript avsluttes Excel umiddelbart etter at du har kalt avslutt-metoden og sluppet variablene. Hvis du vil ha mer informasjon, kan du se Referanser-delen .
Obs!
Den udokumenterte CollectGarbage-metoden er ikke en del av ECMA-262-spesifikasjonen, og er kanskje ikke tilgjengelig i fremtidige versjoner av skriptmotoren. Når du tvinger søppelsamleren til å kjøre ved å ringe CollectGarbage, kan dette også påvirke ytelsen negativt.
Status
Microsoft har bekreftet at dette er en feil i Microsoft-produktene som er oppført i begynnelsen av denne artikkelen.
Trinn for å reprodusere
Start Notisblokk, og lim inn følgende kode i redigeringsprogrammet:
HTML
<HTML><BODY><INPUTtype="button"value="Automate Excel"name=AutomateExcelonclick="StartExcel()"><SCRIPTLANGUAGE=Javascript>function StartExcel() {
var oExcel;
oExcel = new ActiveXObject("Excel.Application");
oExcel.Quit();
oExcel = null;
}
</SCRIPT></BODY></HTML>
Lagre filen som JScriptTest.HTM, og avslutt notisblokken.
Dobbeltklikk på JScriptTest.HTM-filen for å laste inn filen i Internet Explorer.
Start Windows Oppgavebehandling.
Klikk Automatiser Excel-knappen på nettsiden i Internet Explorer. Undersøk Windows Oppgavebehandling, og vær oppmerksom på at Excel starter og forblir i minnet.
Gå til en annen side, eller avslutt Internet Explorer. Vær oppmerksom på at Excel avsluttes og ikke lenger vises i Windows Oppgavebehandling.
This module focuses on educating developers on how to perform common techniques in regard to automating business processes using client scripting, along with explaining the context of when these scenarios might be applied.