【发布时间】:2019-07-16 11:56:44
【问题描述】:
我一直在尝试解决这个错误,但我在网上找到的任何东西似乎都没有帮助。基本上,我在 excel VBA 中运行一个脚本,该脚本打开一个 word 文档,然后打开“另存为”对话框,以便我可以使用我选择的名称/位置保存文件。正是在这一点上,我得到了运行时错误 5。
我正在使用 Do Loop 来尝试绕过错误,并且它工作了一段时间。但由于某种原因,问题又回来了,我不知道为什么。
我添加了一个 Do 循环,它可以阻止代码向前移动,直到文件有了名称。这工作了一段时间,但几个小时后神秘地停止工作
Dim wdApp As Word.Application
Dim wdDoc As Word.Document
Set wdApp = GetObject(, "Word.Application")
If Err.Number <> 0 Then 'Word isn't already running
Set wdApp = CreateObject("Word.Application")
End If
On Error GoTo 0
Set wdDoc = wdApp.Documents.Open(OFile)
'Clear the variable that contains the file path/name
SveReportName = ""
'Save word document as a new file
Set SveReport = wdApp.ActiveDocument.Application.FileDialog(msoFileDialogSaveAs)
With SveReport
' 3 is for 97-2003 - include for 2010, remove for 2003
.FilterIndex = 3
.Show
SveReportName = SveReport.SelectedItems.Item(1)
'This Do statement is here so that VBA just keeps adding 1+1 until the user has had time to name the tech report file, it should stop Run Time Error 5 from appearing
Do
a = 1 + 1
Loop Until IsNull(SveReportName) = False
wdDoc.SaveAs SveReportName
End With
知道还会发生什么吗?
提前致谢!
【问题讨论】:
-
我不知道你期望
Do a = 1 + 1完成什么,但它并没有做任何可能的事情。在您访问SelectedItems之前,您也没有检查用户是否取消了对话框 -
@KenWhite 1+1 本身并不意味着做任何事情,它只是运行一些代码,直到 IsNull(SveReportName) = False。这个想法是,这会阻止下一行运行,直到我为文件命名。
-
不,它不是这样做的。对话框上的
.Show阻止代码继续执行,直到用户选择文件或取消对话框。在您可以使用SeReportName =命名文件并调用wdDoc.SaveAs之前,没有任何进展。你只是无缘无故地旋转轮子(或者如果用户选择文件名,什么也不做)。当您在调试器中单步执行代码时,具体是哪一行导致了错误? -
@KenWhite 感谢您的注意,我不知道这一点。当我逐行运行代码时,我从未收到错误,一切顺利。仅当我一起运行这批代码时,在“另存为”对话框出现之后,并且在我能够命名和保存文件之前,才会出现该错误。这就是为什么我假设在我完成文件命名之前代码试图继续前进。
-
@KenWhite 我又试了一次,通过在每一行之前放置一个停止命令,并能够找出错误发生在 SveReportName = SveReport.SelectedItems.Item(1) 处。我修改了代码并能够修复它。谢谢您的帮助!这是修改后的代码:'''Set SveReport = wdApp.ActiveDocument.Application.FileDialog(msoFileDialogSaveAs) With SveReport .FilterIndex = 3 If .Show = -1 Then .Execute End With SveReportName = wdDoc.Path & "\" & wdDoc .Name Sheets("Start").Range("C13").Value = SveReportName'''