[BUG: JScript からオートメーションで Quit メソッドを呼び出した後、Excel がシャットダウンしない

症状

Microsoft JScript から Microsoft Excel を自動化する場合、Internet Explorer を閉じるまで、または別のページに移動するまで、Excel は Quit メソッドを呼び出した後もメモリ内に留まります。

原因

JScript は Excel への参照を保持しています。 Quit コマンドの発行時に 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 を使用すると、Quit メソッドを呼び出して変数を解放した直後に Excel がシャットダウンします。 詳細については、この記事の「関連情報」を参照してください。

メモ非公開の CollectGarbage メソッドは ECMA-262 仕様の一部ではないため、スクリプトエンジンの今後のバージョンでは使用できない場合があります。 CollectGarbage を呼び出してガベージコレクターを強制的に実行すると、パフォーマンスに悪影響を及ぼす可能性があります。

状態

マイクロソフトは、この記事の冒頭に記載されているマイクロソフト製品のバグであることを確認しています。

詳細

問題の再現手順

  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> 
  1. ファイルを JScriptTest .HTM として保存し、メモ帳を終了します。
  2. JScriptTest .HTM ファイルをダブルクリックして、Internet Explorer にファイルを読み込みます。
  3. Windows タスクマネージャーを起動します。
  4. Internet Explorer の Web ページで [Excel を自動化する] ボタンをクリックします。 Windows タスクマネージャーを調べ、Excel が起動してメモリに置かれていることを確認します。
  5. 別のページに移動するか、Internet Explorer を終了します。 Excel が終了し、Windows タスクマネージャーに表示されなくなったことに注意してください。

References

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