excel - Excel 正在等待 Word 文档完成 OLE 操作
问题描述
我创建了一个宏,它读取 Excel 源文件并将所有数据加载到数组中。然后它会打开一个用作模板的 Word 文档。模板中有 7 个书签。每个书签都使用数组中特定行的数据进行更新。接下来,使用“另存为”,以唯一的名称和 2 页保存模板。重复这些步骤,直到有 100 个唯一的 Word 文档。到目前为止,一切都很好。
(旁注:由于我遇到的问题,宏目前停止在 100 个文档。我最初从 200 个文档开始,但改为 100,因为我认为这个数字(200 个文档/400 页)是问题所在。)
接下来,宏关闭 Word 模板并打开另一个名为“MainDoc”的 Word 文档。这是以特定方式格式化的,因此宏可以将每个唯一的 Word 文档(2 页)插入“MainDoc”文件中。然后宏使用“另存为”将“MainDoc”文件保存为200页的PDF文档。
有时,并非每次,宏都会抛出一条错误消息:“Microsoft Excel 正在等待“MainDoc.doc - Word”完成 OLE 操作。”
它不会每次或在代码中的同一位置发生。有时它根本不会抛出错误,而是继续处理下一批 100 条记录。
当我在错误消息上单击“确定”时,宏会继续运行,直到它再次抛出它或宏完成。
目前,宏重复此过程并创建 13 个唯一的 PDF 文件。目标是让宏在完成之前没有任何问题地运行。
这是显示错误消息的代码:
Sub Create_PDF_File()
Set WrdApp = CreateObject("Word.Application")
WrdApp.Visible = True
vTmp2 = ""
vTmp2 = FilePath1 & "MainDoc.doc"
Set WrdDoc = WrdApp.Documents.Open(vTmp2)
FirstRecHolder = 0
FirstRecHolder = FirstRec
Z = 1
Do Until FirstRec > LastRec
DoEvents
WrdDoc.Activate
' FIRST LINE WHERE THE ERROR MESSAGE IS DISPLAYED
WrdApp.Selection.InsertFile Filename:=FilePath2 & "Flyer Row " & FirstRec & ".doc", Range:="", _
ConfirmConversions:=False, Link:=False, Attachment:=False
Z = Z + 1
FirstRec = FirstRec + 1
Loop
Z = Z - 1
PageCount = 0
PageCount = (Z * 2)
PageCount = PageCount + 1
WrdApp.Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=PageCount
WrdApp.Selection.Delete
WrdApp.DisplayAlerts = wdAlertsNone
' SECOND LINE WHERE THE ERROR MESSAGE IS DISPLAYED
WrdApp.ActiveDocument.SaveAs2 Filename:=FilePath2 & "Flyers_" & PgCnt & ".pdf", _
FileFormat:=wdFormatPDF, LockComments:=False, Password:="", _
AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _
EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _
:=False, SaveAsAOCELetter:=False, CompatibilityMode:=14
WrdDoc.Close (False)
FirstRec = 0
FirstRec = FirstRecHolder
Do Until FirstRec > LastRec
DoEvents
Kill FilePath2 & "Flyer Row " & FirstRec & ".doc"
FirstRec = FirstRec + 1
Loop
FirstRec = LastRec + 1
End Sub
我注意到每一行都有一个路径和一个文件名。在执行这行代码之前结合路径和文件名会更好吗?
文件名:=FilePath2 & “Flyer Row” & FirstRec & “.doc” 文件名:=FilePath2 & “Flyers_” & PgCnt & “.pdf”
将 Word 文档保存为 PDF 文件时,它是否有 200 页或 400 页?我想要 400 页,因为客户想要 4 - 6 个 PDF 文件和 200 条记录 / 400 页让我们到达那里。
我在创建唯一的 Word 文档时关闭和打开 DisplayAlets,但在创建 PDF 文件时我不使用它。我是不是该?
我还注意到 Word 的右下角有一条消息,上面写着“Word 正在发布”Flyer_(unique number).pdf,并且正在计算页码。这对我遇到的问题有任何影响吗?
有没有更好的方法来做我想要用 Excel、Word 和 PDF 做的事情?
任何有关让此代码不间断运行的建议将不胜感激。我当然想在晚上开始,并在我早上起床时创建所有 PDF 文件。
感谢您的帮助和建议。如果您有任何问题或需要我提供任何其他信息,请告诉我.....
解决方案
作为@kamocyc 回答的补充:
实例化后WrdApp
,添加WrdApp.Options.SaveInterval = 0
以关闭 AutoRecover,否则可能随时启动。请参阅Options.SaveInterval 属性 (Word)。
如果您的“模板”文档托管在 OneDrive 或 SharePoint 中,则在实例化WrdDoc
后添加,WrdDoc.AutoSaveOn = False
以便 Word 在每次修改后不会保存它。请参阅Document.AutoSaveOn 属性 (Word)。请注意,您的 Word 版本可能不支持此属性。
请注意,与 Excel 不同的是,Word 的撤消堆栈是在以编程方式进行修改时建立的。我在自动化 Word 时经常打电话WrdApp.ActiveDocument.UndoClear
,但这可能有点矫枉过正(我认为它确实有帮助)。请参阅Document.UndoClear 方法 (Word)。在你的情况下,我会在 afterWrdApp.Selection.InsertFile
和 after 之后调用它WrdApp.Selection.Delete
。
推荐阅读
- excel-addins - excel网页插件如何设置页眉页脚?
- android - 在 ViewPager 中提交表单
- android - 具有持久片段的颤振模块
- django - Django-allauth 最初创建了一个用户——为什么?
- java - java.util.ArrayList 无法转换为 org.testng.xml.XmlClass - 运行脚本时抛出此错误
- azure-devops - 直接从测试结果中添加带有重现步骤的错误
- mbed - 如何访问 MBED 中的设备特定功能?
- c# - C# - 屏幕截图源过滤器 - 直接显示
- node.js - SAML 注销失败:颁发者不匹配(NodeJS + Okta)
- php - 如何在 shell 中检查正确数量的 STDIN 用户输入?