JScript から自動化するときに Quit メソッドを呼び出した後に Excel がシャットダウンしない
現象
Microsoft JScript から Microsoft Excel を自動化する場合、インターネット エクスプローラーを閉じるか、別のページに移動するまで、Quit メソッドを呼び出した後、Excel はメモリ内にとどまります。
原因
JScript は Excel への参照を保持しています。 [終了] コマンドを発行すると Excel に参照があるため、Excel はシャットダウンしません。 JScript はガベージ コレクション言語です。これは、変数を NULL に設定した場合ではなく、特定の時点でエンジンがそれ自体の後でクリーンアップすることを意味します。 インターネット エクスプローラーをシャットダウンしたり、別のページに移動したりすると、エンジンが破棄されます。 この動作により、ガベージ コレクションが強制され、Excel への参照が解放されます。
解決方法
この問題を回避するには、CollectGarbage メソッドを呼び出します。 これにより、JScript のガベージ コレクションが直ちに実行され、Excel への参照が解放されます。 次のコード スニペットは、CollectGarbage メソッドを使用する方法を示しています。
<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>
CollectGarbage メソッドは、Excel の Quit メソッドの直後には呼び出されません。 CollectGarbage を呼び出す前に、JScript に少量の時間を与える必要があります。 この例ではタイマーを使用して、ガベージ コレクションを強制する前に短時間待機する方法を示します。
もう 1 つの回避策は、Microsoft Excel のオートメーションに VBScript を使用することです。 JScript とは異なり、VBScript はガベージ コレクション言語ではありません。 そのため、変数を Nothing に設定すると、参照が解放されます。 VBScript を使用すると、Quit メソッドを呼び出して変数を解放した直後に、Excel がシャットダウンします。 詳細については、「 参照 」セクションを参照してください。
注:
文書化されていない CollectGarbage メソッドは ECMA-262 仕様の一部ではなく、スクリプト エンジンの将来のバージョンでは使用できない可能性があります。 CollectGarbage を呼び出してガベージ コレクターを強制的に実行すると、パフォーマンスにも悪影響を与える可能性があります。
状態
Microsoft は、この記事の冒頭に記載されている Microsoft 製品のバグであることを確認しました。
再現する手順
メモ帳を起動し、エディターに次のコードを貼り付けます。
<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>
ファイルを JScriptTest.HTM として保存し、メモ帳を終了します。
JScriptTest.HTM ファイルをダブルクリックして、インターネット エクスプローラーにファイルを読み込みます。
Windows タスク マネージャーを起動します。
インターネット エクスプローラーの Web ページで [Excel の自動化] ボタンをクリックします。 Windows タスク マネージャーを調べて、Excel が起動してメモリ内に留まることに注意してください。
別のページに移動するか、インターネット エクスプローラーを終了します。 Excel が終了し、Windows タスク マネージャーに表示されなくなります。
関連情報
Excel へのオートメーションを示す VBScript コード サンプルの詳細については、「 クライアント側の VBScript から Excel を自動化する方法」を参照してください。