2017-01-09 84 views
0

我想通过宏将电子邮件保存为Word文件,然后通过Word将其替换为转换后的PDF文件。转换部分工作正常 - 问题是当我尝试删除原始.doc文件。关闭后立即删除文件 - '权限被拒绝'错误

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',否则循环,而不是''睡眠'一段固定的时间。 –

+0

如果我不是元帅,我总是有问题。你需要改变变量以使它适合你,但这里是我所有互操作函数中“finally”块的一个例子:[Begin Block] oBook.Close(False) oApp.Quit() Marshal .ReleaseComObject(oRange) Marshal.ReleaseComObject(oSheet) Marshal.ReleaseComObject(oBook) Marshal.ReleaseComObject(oBooks) Marshal.FinalReleaseComObject(oApp)[End Block]。我会从那里开始,看看它是否得到纠正。我刚刚看到它是vba标记 - 对不起,如果没有帮助 – Aaron

+0

您应该用F8逐步测试代码。它会显示是否尝试访问该文件太快是问题所在。我曾经有一个删除只读文件的问题,所以如果是这种情况,那么在杀死之前使用这个:'如果GetAttr(filePath&fileName)和vbReadOnly然后SetAttr(filePath&fileName),vbNormal' –

回答

0

我已经能够得到这个通过完全退出Word之前简单地关闭Word文档工作始终:

objWrdDoc.Close 
objWrd.Quit 
Set objWrd = Nothing 

错误一直没有出现,因为加入这一行,并与各种电子邮件测试。