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 製品のバグであることを確認しました。

再現する手順

  1. メモ帳を起動し、エディターに次のコードを貼り付けます。

     <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. ファイルを JScriptTest.HTM として保存し、メモ帳を終了します。

  3. JScriptTest.HTM ファイルをダブルクリックして、インターネット エクスプローラーにファイルを読み込みます。

  4. Windows タスク マネージャーを起動します。

  5. インターネット エクスプローラーの Web ページで [Excel の自動化] ボタンをクリックします。 Windows タスク マネージャーを調べて、Excel が起動してメモリ内に留まることに注意してください。

  6. 別のページに移動するか、インターネット エクスプローラーを終了します。 Excel が終了し、Windows タスク マネージャーに表示されなくなります。

関連情報

Excel へのオートメーションを示す VBScript コード サンプルの詳細については、「 クライアント側の VBScript から Excel を自動化する方法」を参照してください。