C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■83319 / )  Re[1]: VB.NET プログラムからのプロセス終了とファイル削除
□投稿者/ 魔界の仮面弁士 (1197回)-(2017/03/17(Fri) 10:39:09)
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 や
アンチウィルスソフトの検閲動作などによって開かれている可能性も
あるかも知れませんね。そこまで対処するのは実装コストが跳ね上がりそうですが…。
返信 編集キー/


管理者用

- Child Tree -