JScript から自動化するときに、Quit メソッドを呼び出した後に Excel がシャットダウンしない
現象
Microsoft JScript から Microsoft Excel を自動化する場合、Internet Explorer を閉じるか別のページに移動するまで、Excel は Quit メソッドを呼び出した後もメモリに残ります。
原因
JScript は Excel への参照を保持しています。 終了コマンドを発行すると Excel に参照があるため、Excel はシャットダウンしません。 JScript はガベージ コレクト言語です。これは、変数を NULL に設定した場合ではなく、特定の時点でエンジンがそれ自体をクリーンアップすることを意味します。 Internet Explorer をシャットダウンするか、別のページに移動すると、エンジンは破棄されます。 この動作により、ガベージ コレクションが強制され、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 を使用すると、Excel は Quit メソッドを呼び出して変数を解放した直後にシャットダウンします。 詳細については、「 参照」 セクションを参照してください。
注:
文書化されていない 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 ファイルをダブルクリックして、Internet Explorer にファイルを読み込みます。
Windows タスク マネージャーを起動します。
Internet Explorer の Web ページの [Excel の自動化] ボタンをクリックします。 Windows タスク マネージャーを調べて、Excel が起動してメモリ内に留まる点に注意してください。
別のページに移動するか、Internet Explorer を終了します。 Excel が終了し、Windows タスク マネージャーに表示されなくなったことに注意してください。
関連情報
Automation to Excel を示す VBScript コード サンプルの詳細については、「 クライアント側の VBScript から Excel を自動化する方法」を参照してください。
フィードバック
フィードバックの送信と表示