none
VB2010からWord2010を開き、処理後削除しようとすると「別のプロセスで使用されているため、プロセスはファイル○○○にアクセスできません」となる。 RRS feed

  • 質問

  • いつもお世話になっています。

    VB2010からWORD2010ファイルのコピーを作業ファイルとして、開き、処理終了後

    削除したいのですが、標記の例外が出て困っています。

    WinWord.EXEと同期をすることは出来ないのでしょうか?

    ちなみにWord文書は最大250ファイルほどあります。

    <例外の出るプログラム>

    Imports Word = Microsoft.Office.Interop.Word Imports System.Windows.Forms Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim wdApp As Word.Application Dim wdDoc As Word.Document '作業ファイルを作成する。 Dim workoutf As String = "c:\test\testx.docx" Dim inf As String = "c:\test\test.docx" '旧ファイルを削除、元ファイルをコピー System.IO.File.Delete(workoutf) System.IO.File.Copy("c:\test\test.docx", workoutf, True) 'WORDを開く wdApp = CreateObject("Word.Application") wdDoc = wdApp.Documents.Open(workoutf) wdApp.Visible = False '記号を削除する。 With wdApp.Selection.Find .ClearFormatting() .Text = "☆" With .Replacement .ClearFormatting() .Text = "" End With .Execute(Replace:=Word.WdReplace.wdReplaceAll) End With With wdApp.Selection.Find .ClearFormatting() .Text = "★" With .Replacement .ClearFormatting() .Text = "" End With .Execute(Replace:=Word.WdReplace.wdReplaceAll) End With 'その他の処理(省略) 'ファイルを閉じて、削除 wdApp.Quit(SaveChanges:=True) wdDoc = Nothing System.IO.File.Delete(workoutf) '<--ここで例外が発生 End Sub End Class


    2013年10月9日 5:14

回答

  • 以下のコードで、COMの参照カウントを解放してみて下さい。

    Imports System.Runtime.InteropServices
       ・
       ・
       ・
    Marshal.ReleaseComObject(wdDoc)
    Marshal.ReleaseComObject(wdApp)


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク MitsuoTAKEI 2013年10月9日 7:58
    2013年10月9日 6:06
    モデレータ

すべての返信

  • 以下のコードで、COMの参照カウントを解放してみて下さい。

    Imports System.Runtime.InteropServices
       ・
       ・
       ・
    Marshal.ReleaseComObject(wdDoc)
    Marshal.ReleaseComObject(wdApp)


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク MitsuoTAKEI 2013年10月9日 7:58
    2013年10月9日 6:06
    モデレータ
  • trapemiya様

    ご回答ありがとうございました。

    ご指摘の行の追加で、ファイル削除が無事出来るようになりました。

    ありがとうございます。

    尚、WinWord.EXEがCOMを解放するまでAPは待たされること

    になるのでしょうか?

    2013年10月9日 8:11
  • 尚、WinWord.EXEがCOMを解放するまでAPは待たされること

    になるのでしょうか?

    スレッドは一つで並行に動いているわけではないですから、逐次処理が進んでいくだけです。ReleaseComObjectメソッドが実行中は、そこでプログラムが止まっています。止まっているといいますか、ReleaseComObjectメソッドを実行している最中です。このメソッドの実行が終われば、新しい参照カウントの値が返されます。
    ご質問の意味がはっきりわからなかったのですが、こういうことでしょうか?

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年10月9日 8:42
    モデレータ
  • trapemiya様

    ご回答ありがとうございます。

    WinWord.EXEはAPと非同期で動いていて、同期を取るために、ReleaseComObjectメソッドを

    実行する必要があったということですね。

    どうもありがとうございました。

    2013年10月9日 9:03