私のコードで作成された COM オブジェクトが適切に破棄されていないため、Excel が完全に終了できないと考えるようになりました。私は彼らの解放を強制しようとしましたが、この質問につながりました: Excel 2007 VBAモジュール内からSystem.Runtime.InteropServices.Marshal.ReleaseComObjectを呼び出すにはどうすればよいですか?
Excel を終了するときに、COM オブジェクトへの参照をすべて削除していますか? COM オブジェクトへの参照を保持するたびに、次のような行を配置してください。
obj = Nothing ' Where "obj" is a reference to the COM object
それでも解決しない場合は、問題が循環参照である可能性もあります。COM オブジェクトは、COM オブジェクトへの参照を保持する VBA オブジェクトへの参照を保存しますか? その場合、循環参照が作成され、オブジェクトは解放されません。
私は今、循環参照を疑っています。ワークブックのクローズ イベントでNothing
オブジェクト自体を設定する前に、特定の COM オブジェクト プロパティを設定すると問題が解決した場合は、戻ってきて、これを受け入れられた回答としてマークします。Nothing
アップデート
オブジェクト参照を慎重に設定してNothing
も、問題は解決しませんでした。最終的に、.NET 用のCOM 可視 dll ラッパーを System.Runtime.InteropServices.Marshal.FinalReleaseComObject
作成しました。Workbook BeforeClose イベントで COM オブジェクトに対して dispose を呼び出すと、問題が解決したようです。