|
■No83317 (おん さん) に返信 > 最初に対象ファイルのプロセスを終了する処理を入れました。
プロセスごと終了させずとも、開いているブックだけ閉じてもらえば 良いと思うのですが、それでは駄目でしょうか。たとえばこんな感じ。
Dim oBook As Object = Nothing Try oBook = GetObject(strExcelBookPath) CallByName(oBook, "Close", CallType.Method, False) Catch ex As Exception
Finally If oBook IsNot Nothing Then Marshal.ReleaseComObject(oBook) End If End Try System.IO.File.Delete(strExcelBookPath)
GetObject により、既に開かれている Excel.Workbook オブジェクトのインスタンスを 取得できるため、それを oBook.Close(False) メソッドで閉じるという処理です。
ただし該当ファイルが開かれていなかった場合には、GetObject によって 無駄に開かれてしまうことになるのが欠点にもなります。
無駄に開くことでパフォーマンス上の問題が生じる場合は、 開いているワークブックのパスの一覧を調査するために、 GetRunningObjectTable API を用いて、 System.Runtime.InteropServices.ComTypes.IRunningObjectTable から 既存の Excel インタンスを列挙してみるという手法があります。 あるいは手抜き実装として、とにかく削除してみて、それがエラーになったら GetObject & Close を行ってから再削除してみるという力技とか。
ただ、該当ブックが直接開かれているのではなく、他のワークシート上から "=SUM([Budget.xlsx]Annual!C10:C25)" のようにワークシート関数で参照されているケースもありえますし、 Microsoft Excel 以外のソフトウェア、たとえば Excel ODBC Driver や アンチウィルスソフトの検閲動作などによって開かれている可能性も あるかも知れませんね。そこまで対処するのは実装コストが跳ね上がりそうですが…。
|