首页 > 解决方案 > 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 文件。

感谢您的帮助和建议。如果您有任何问题或需要我提供任何其他信息,请告诉我.....

标签: excelvbams-wordpdf-generationole

解决方案


作为@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


推荐阅读