O Excel não é desligado depois de chamar o método Quit ao automatizar do JScript
Artigo
Aplica-se a:
Microsoft Excel
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><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>
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
Inicie o Bloco de Notas e cole o seguinte código no editor:
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>
Salve o arquivo como JScriptTest.HTM e saia do Bloco de Notas.
Clique duas vezes no arquivo JScriptTest.HTM para carregar o arquivo na Internet Explorer.
Inicie o Gerenciador de Tarefas do Windows.
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.
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.
In diesem Modul werden Entwickler darin geschult, allgemeine Techniken zur Automatisierung von Geschäftsprozessflows mit Client-Skripts anzuwenden. Darüber hinaus wird der Kontext erläutert, in dem diese Szenarien angewendet werden können.