Ler em inglês

Compartilhar via


O Excel não é desligado depois de chamar o método Quit ao automatizar do JScript

Sintomas

Ao automatizar o Microsoft Excel do Microsoft JScript, o Excel permanece na memória depois de chamar o método Quit até fechar a Internet Explorer ou navegar até outra página.

Motivo

O JScript está segurando uma referência ao Excel. Como há uma referência no Excel quando você emite o comando Quit, o Excel não é desligado. JScript é uma linguagem de coleta de lixo, o que significa que o mecanismo limpa depois de si mesmo em um determinado ponto e não quando você define as variáveis como NULL. Quando você fecha o Explorer da Internet ou passa para outra página, o mecanismo é destruído. Esse comportamento força a coleta de lixo e libera a referência ao Excel.

Resolução

Para resolver esse problema, você pode chamar o método CollectGarbage. Isso força a coleta de lixo do JScript a ocorrer imediatamente, o que libera a referência ao Excel. O snippet de código a seguir ilustra como usar o método CollectGarbage:

HTML
<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> 

Observe que o método CollectGarbage não é chamado diretamente após o método Quit do Excel. Você precisa dar ao JScript um pouco de tempo antes de chamar CollectGarbage. Um temporizador é usado neste exemplo para mostrar como esperar brevemente antes de forçar a coleta de lixo.

Outra solução alternativa é usar o VBScript para Automação do Microsoft Excel. Ao contrário do JScript, o VBScript não é uma linguagem de coleta de lixo. Portanto, as referências são lançadas quando você define as variáveis como Nothing. Usando o VBScript, o Excel é desligado imediatamente após chamar o método Quit e liberar as variáveis. Para obter mais informações, confira a seção Referências .

Observação

O método CollectGarbage não documentado não faz parte da especificação ECMA-262 e pode não estar disponível em versões futuras do mecanismo de script. Quando você força o coletor de lixo a ser executado chamando CollectGarbage, isso também pode afetar negativamente o desempenho.

Status

A Microsoft confirmou que esse é um bug nos produtos da Microsoft listados no início deste artigo.

Etapas para reproduzir

  1. Inicie o Bloco de Notas e cole o seguinte código no editor:

    HTML
     <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. Salve o arquivo como JScriptTest.HTM e saia do Bloco de Notas.

  3. Clique duas vezes no arquivo JScriptTest.HTM para carregar o arquivo na Internet Explorer.

  4. Inicie o Gerenciador de Tarefas do Windows.

  5. Clique no botão Automatizar Excel na página da Web na Internet Explorer. Examine o Gerenciador de Tarefas do Windows e observe que o Excel inicia e permanece na memória.

  6. Navegue até outra página ou saia da Internet Explorer. Observe que o Excel desiste e não aparece mais no Gerenciador de Tarefas do Windows.

Referências

Para obter mais informações sobre um exemplo de código VBScript que demonstra a Automação no Excel, consulte Como automatizar o Excel de um VBScript do lado do cliente.