Excel stängs inte av när du anropar metoden Avsluta när du automatiserar JScript

Anteckning

Office 365 ProPlus byter namn till Microsoft 365-appar för företag. Mer information om den här ändringen finns i det här blogginlägget.

Symptom

När du automatiserar Microsoft Excel från Microsoft JScript finns Excel kvar i minnet när du anropar metoden Avsluta tills du stänger Internet Explorer eller navigerar till en annan sida.

Orsak

JScript på en referens till en Excel. Eftersom det finns en Excel referens när du kör kommandot Avsluta stängs Excel inte av. JScript är ett skräpinsamlingsspråk, vilket innebär att motorn rensar efter sig själv vid en viss punkt, och inte när du ställer in variablerna på NULL. När du stänger av Internet Explorer eller flyttar till en annan sida, förstörs motorn. Det här beteendet tvingar papperssamling och frigör referensen till Excel.

Lösning

Du kan komma runt det här problemet genom att anropa CollectGarbage-metoden. Det här JScript att papperskorgen ska ske omedelbart, vilket släpper referensen till Excel. Följande kodavsnitt visar hur du använder CollectGarbage-metoden:

<HTML> 
<BODY> 
<INPUT type="button" value="Automate Excel" name=AutomateExcel onclick="StartExcel()"> 
<SCRIPT LANGUAGE=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> 

Observera att CollectGarbage-metoden inte anropas direkt Excel metoden Avsluta. Du måste ge JScript lite tid innan du ringer CollectGarbage. En timer används i det här exemplet för att visa hur du väntar en kort stund innan du tvingar papperssamling.

En annan lösning är att använda VBScript för automatisering av Microsoft Excel. Till JScript är VBScript inte ett skräpinsamlingsspråk. Därför släpps referenser när du ställer in variablerna på Ingenting. Med VBScript avslutas Excel omedelbart efter att metoden Avsluta anropas och variablerna släppts. Mer information finns i avsnittet Referenser.

Anteckning

Den ångrade CollectGarbage-metoden ingår inte i ECMA-262-specifikationen och kanske inte är tillgänglig i framtida versioner av skriptmotorn. När du tvingar papperssamlaren att köra genom att ringa CollectGarbage kan det här också påverka prestanda negativt.

Status

Microsoft har bekräftat att det är ett fel i de Microsoft-produkter som listas i början av den här artikeln.

Steg för reproducering

  1. Starta Anteckningar och klistra in följande kod i redigeraren:

     <HTML> 
     <BODY> 
     <INPUT type="button" value="Automate Excel" name=AutomateExcel onclick="StartExcel()"> 
     <SCRIPT LANGUAGE=Javascript> 
       function StartExcel() { 
         var oExcel; 
    
     oExcel = new ActiveXObject("Excel.Application"); 
         oExcel.Quit(); 
         oExcel = null; 
       } 
     </SCRIPT> 
     </BODY> 
     </HTML> 
    
  2. Spara filen som JScriptTest.HTM och avsluta den Anteckningar.

  3. Dubbelklicka på filen JScriptTest.HTM för att läsa in filen i Internet Explorer.

  4. Starta Windows Aktivitetshanteraren.

  5. Klicka på knappen Excel På webbsidan i Internet Explorer. Undersök Windows och observera att den Excel och finns kvar i minnet.

  6. Gå till en annan sida eller avsluta Internet Explorer. Observera att Excel och inte längre visas i Windows Aktivitetshanteraren.

Referenser

Mer information om ett VBScript-kodexempel som demonstrerar automation för Excel finns i Automatisera Excel från vbscript på klientsidan.