【问题标题】:Excel is waiting for a Word document to complete an OLE actionExcel 正在等待 Word 文档完成 OLE 操作
【发布时间】:2020-11-09 01:21:24
【问题描述】:

我创建了一个宏来读取 Excel 源文件并将所有数据加载到数组中。然后它会打开一个用作模板的 Word 文档。模板中有 7 个书签。每个书签都使用数组中特定行的数据进行更新。接下来,使用“另存为”,以唯一的名称和 2 页保存模板。重复这些步骤,直到有 100 个唯一的 Word 文档。到目前为止一切顺利。

(旁注:由于我一直遇到的问题,宏目前停止在 100 个文档。我最初从 200 个文档开始但更改为 100,因为我认为这个数字(200 个文档/400 页)是问题所在。 )

接下来,宏关闭 Word 模板并打开另一个名为“MainDoc”的 Word 文档。这是以特定方式格式化的,因此宏可以将每个唯一的 Word 文档(2 页)插入到“MainDoc”文件中。然后宏使用“另存为”将“MainDoc”文件另存为PDF文档200页。

有时,并非每次,宏都会抛出一条错误消息:“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 & "传单行 " & FirstRec & ".doc" 文件名:=FilePath2 & "Flyers_" & PgCnt & ".pdf"

将 Word 文档保存为 PDF 文件时是否有 200 页或 400 页是否重要?我想要 400 页,因为客户想要 4 - 6 个 PDF 文件和 200 条记录 / 400 页让我们到达那里。

我在创建唯一 Word 文档时关闭和打开 DisplayAlets,但在创建 PDF 文件时我不使用它。我应该吗?

我还注意到 Word 的右下角有一条消息,上面写着“Word 正在发布”Flyer_(唯一编号).pdf,并且正在计算页码。这对我遇到的问题有影响吗?

有没有更好的方法来做我想要用 Excel、Word 和 PDF 做的事情?

任何有关让此代码不间断运行的建议将不胜感激。我当然想在晚上开始,并在我早上起床时创建所有 PDF 文件。

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

【问题讨论】:

    标签: excel vba ms-word pdf-generation ole


    【解决方案1】:

    作为@kamocyc 回答的补充:

    在实例化WrdApp 后,添加WrdApp.Options.SaveInterval = 0 以关闭自动恢复,否则随时可能启动。见Options.SaveInterval property (Word)

    如果您的“模板”文档托管在 OneDrive 或 SharePoint 中,则在实例化 WrdDoc 后,添加 WrdDoc.AutoSaveOn = False,以便 Word 在每次修改后不会保存它。见Document.AutoSaveOn property (Word)。请注意,您的 Word 版本可能不支持此属性。

    请注意,与 Excel 不同,Word 的撤消堆栈是在以编程方式进行修改时建立的。在自动化 Word 时,我经常打电话给WrdApp.ActiveDocument.UndoClear,但这可能有点矫枉过正(我认为它确实有帮助)。见Document.UndoClear method (Word)。在你的情况下,我会在WrdApp.Selection.InsertFileWrdApp.Selection.Delete 之后调用它。

    【讨论】:

      【解决方案2】:

      错误消息“Microsoft Excel 正在等待 xxx 完成 OLE 操作。”当另一个应用程序(在您的情况下是 Word)没有及时响应时发生。

      This answer是同一问题的解决方案。

      至于您的其他问题。

      我注意到每一行都有一个路径和一个文件名。我会是 最好在执行此行之前结合路径和文件名 代码?

      不,这没什么区别。

      Word文档保存时有200页还是400页有关系吗 转换成 PDF 文件?

      Word 和程序员更容易处理更少的页面。不过,Word 可以处理数百页的文档。

      当唯一的 Word 文档出现时,我会关闭和打开 DisplayAlets 正在创建,但在创建 PDF 文件时我不使用它。 我应该吗?

      也许吧。但是也有人说DisplayAlerts = False不行。

      我还注意到右下角有一条消息 显示“Word 正在发布”Flyer_(unique number).pdf 和 有页码的运行计数。这个有没有 与我遇到的问题有关。

      我认为这是正常行为。

      有没有更好的方法来做我正在尝试用 Excel、Word、 和PDF?

      也许,首先创建 2 页 PDF 文件,然后将它们组合起来是模块化和更快的方式。但是要合并PDF文件,需要第三方PDF工具。

      【讨论】:

      • @kamocyc............谢谢你的信息。我感谢您的帮助。我查看了您提供的链接,并在发布我的问题之前遇到了该链接,但尚未尝试过。我现在肯定会的。关于该链接的另外 1 个问题。函数说“....OLE32.dll .....”,这需要更改为 64 位机器吗?再次感谢您的帮助.....迈克
      • @excelosaurus............谢谢............我也会将这些建议合并到我的宏中。感谢您的帮助......刮胡子
      • @kamocyc ............我已将这些建议纳入解决方案,并有所帮助。宏已运行而未引发错误消息。我昨天下午 6:30 左右开始了它,预计它会在晚上 10:30 之前完成。今天早上我检查时,它仍在运行。但是,我注意到,大多数时候每分钟创建 3 或 4 个文件。有时,文件之间的时间会延长,例如一小时五分钟。知道发生了什么吗?谢谢.....刮胡子
      • @excelosaurus .....请参阅我上面对 kamocyc 的评论........知道发生了什么吗?感谢您的帮助............剃须
      • @Shaves 编辑 word 文档会随着文件大小的增加而变慢。另一方面,如果您为每个文件使用几乎相同数量的数据,则文件创建时间应该大致相同。我不知道为什么...如果您的问题无法解决,您可能想提出一个关于文件创建部分的新问题。
      猜你喜欢
      • 2014-10-30
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多