2017-01-09 13 views
0

電子メールをWordファイルとしてマクロに保存し、Wordで変換したPDFファイルに置き換えます。変換部分は正常に動作しています - 問題は、元の.docファイルを削除しようとしたときです。ファイルを閉じた直後にファイルを削除する - 「Permission Denied」エラー

Dim objWrd As Object 
Dim objWrdDoc As Object 
Dim wrdCurrentPrinter As String 

Set objWrd = CreateObject("Word.Application") 
Set objWrdDoc = objWrd.Documents.Open(filePath & fileName) 

''Print' file as PDF - current printer is stored so it can be reverted back afterwards 
wrdCurrentPrinter = objWrd.ActivePrinter 
objWrd.ActivePrinter = "Microsoft Print To PDF" 

'File name is specified here to avoid Save As prompt. PrintToFile property is 'True' 
objWrd.PrintOut , , , filePath & Replace(fileName, ".doc", ".pdf"), , , , , , , True 

objWrd.ActivePrinter = wrdCurrentPrinter 

objWrd.Quit 
Set objWrd = Nothing 

Kill filePath & fileName 

Kill filePath & fileName私はエラー70 - 許可が拒否されます。

ファイルを手動で削除することはできますが、ブレークポイントを追加して 'Kill'行をステップ実行すると、Wordの終了とKillコマンドの間にわずかな遅延があっても機能します。したがって、コードが非常に速く処理されているため、コマンド実行時にファイルが開かれている可能性があります。

私はOutlookで問題を抱えている遅延を作成するルートを下げる必要があると感じています。これは可能性の高い解決策ですか、私が見逃したことがありますか?

+0

企業ネットワーク内のサーバーで作業することはありますか?クローズ後にファイルがロックされている時間が変わる可能性があるので、 'objWrdDoc.Documents.Count = 0'をチェックするハンドラを追加することができます。そうでなければ' sleep'ではなく一定時間ループします。 –

+0

私がマーシャルしなければ、私はいつも問題を抱えてきました。変数を変更して機能させる必要がありますが、ここでは私のinterop関数の "finally"ブロックの例を示します:[Begin Block] oBook.Close(False) oApp.Quit() マーシャル.ReleaseComObject(oRange) Marshal.ReleaseComObject(oSheet) Marshal.ReleaseComObject(oBook) Marshal.ReleaseComObject(oBooks) Marshal.FinalReleaseComObject(oApp)[終了ブロック]。私はそこから始めて、それが正しいかどうかを見ます。そして、私はちょうどそれがvbaタグであることを見ました - 役に立たない場合は申し訳ありません – Aaron

+0

あなたはF8でそれを踏んでコードをテストする必要があります。速すぎるファイルにアクセスしようとすると問題が発生した場合に表示されます。私は一度だけ読み込み専用ファイルを削除することに問題があるので、それが殺人の前にこれを使うと、 'GetAttr(filePath&fileName)And vbReadOnly Then SetAttr(filePath&fileName)、vbNormal' –

答えて

0

私は、これは単に完全にWordを終了する前に、Word文書を閉じることにより、一貫して動作するために取得することができました:

objWrdDoc.Close 
objWrd.Quit 
Set objWrd = Nothing 

エラーは、この行を追加し、さまざまな電子メールでテスト以来現れていません。

関連する問題