首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理"Microsoft正在等待另一个应用程序完成OLE操作“

如何处理"Microsoft正在等待另一个应用程序完成OLE操作“
EN

Stack Overflow用户
提问于 2017-05-31 15:25:10
回答 2查看 9.2K关注 0票数 6

当使用excel自动化其他MS应用程序时,我经常会收到只对Microsoft Excel is waiting for another application to complete an OLE action.的提示

只有在自动执行冗长的任务时才会发生这种情况。

我如何以适当的方式处理这件事?

最近的两个例子(我重申代码不太重要):

  • 使用Access.Application从Excel创建accdb-数据库,并通过对大量数据运行相当复杂的SQL-查询来填充数据库。 createDB(pathDB为String,pathSQL为String)为String,DAO.Database为String语句为变体,文件为变体Dim sErr为String,iErr为Integer与.DBEngine.CreateDatabase(pathDB,dbLangGeneral)以.DBEngine.CreateDatabase(pathDB,dbLangGeneral)作为拆分中的每个文件(pathSQL,";) sql = fetchSQL( file )中的Split( sql,“);“& vbNewLine)如果Len(语句)<5,那么错误恢复下一个.Execute语句上的GoTo skpStatement Debug.Print语句,dbFailOnError,如果.Number <> 0,则iErr = iErr +1 sErr = sErr & vbCrLf & "Error“& .Number &.Number&替换(.Description,vbCrLf,vbNullString ( .Clear End如果以On 0 skpStatement结尾: Next语句下一个文件以.Quit acQuitSaveAll结束,dTime = Now() -如果sErr =vbNullString,sErr ="Keine“createDB = "Zeit:”& Now &:& Format(dTime,公司名称: iErr & vbCrLf & sErr‘’.Saved =具有端函数的真.Save端
  • Word.Application中的Excel创建邮件合并,使用现有的和相当大的.docm-templates和返回接收方的动态SQL查询。 设置rst = GetRecordset(ThisWorkbook.Sheets("Parameter").Range("A1:S100")) With New Word.Application .Visible = False,而不是rst.EOF,如果rst!Verarbeiten,而不是IsNull(rst!Verarbeiten),则Debug.Print rst!Sql .Documents.Open rst!inpath & Application.PathSeparator & rst!infile stroutfile = fCheckPath(rst!outpath ),& Application.PathSeparator &rst!Application.PathSeparator&rst!.Run "quelle_aendern",rst!DataSource,rst!Sql .Run Application.DisplayAlerts = False .ActiveDocument.ExportAsFixedFormat _ OutputFileName:=stroutfile _,ExportFormat:=wdExportFormatPDF _,OpenAfterExport:=False _,OptimizeFor:=wdExportOptimizeForPrint _,Range:=wdExportAllDocument _,From:=1,To:=1 _,Item:=wdExportDocumentContent _,IncludeDocProps:=False _,KeepIRM:=True _,CreateBookmarks:=wdExportCreateNoBookmarks _,DocStructureTags:=False _,BitmapMissingFonts:=True __UseISO19005_1:=False Application.DisplayAlerts = True对于.Documents中的每个文档,.Saved = True .Close SaveChanges:=wdDoNotSaveChanges结束,如果rst.MoveNext Wend .Quit以

备注:

  • 当以较小的规模运行时(例如,当查询较少的记录或使用较少复杂的模板时),这两种代码都会顺利运行。
  • 在这两种情况下,当我通过所有重新出现的提示进行OK时,代码最终将以所需的结果结束。因此,我想我没有遇到错误(它也不会触发错误处理程序),而是类似于超时。

正如其他来源所建议的,我确实将代码包装到Application.DisplayAlerts = False中。然而,这似乎是一个可怕的想法,因为在某些情况下,我确实需要得到提醒。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-31 15:35:04

我将在注释中添加@德黑兰脚本链接到的代码。

您可以通过使用COM来删除VBA的消息过滤器来解决这个问题。这将阻止COM在VBA认为正在调用的进程阻塞时告诉VBA显示消息框。请注意,如果进程由于某种原因而真的阻塞了,这将阻止您收到任何通知。[来源]

我认为这是我在2006年为同样的问题使用的代码(它成功了)。

代码语言:javascript
运行
复制
Private Declare Function _
    CoRegisterMessageFilter Lib "OLE32.DLL" _
    (ByVal lFilterIn As Long, _
    ByRef lPreviousFilter) As Long

Sub KillMessageFilter()  
    '''Original script Rob Bovey  

    '''https://groups.google.com/forum/?hl=en#!msg/microsoft.public.excel.programming/ct8NRT-o7rs/jawi42S8Ci0J
    '''http://www.appspro.com/

    Dim lMsgFilter As Long

    ''' Remove the message filter before calling Reflections.
    CoRegisterMessageFilter 0&, lMsgFilter

    ''' Call your code here....

    ''' Restore the message filter after calling Reflections.
    CoRegisterMessageFilter lMsgFilter, lMsgFilter

End Sub
票数 10
EN

Stack Overflow用户

发布于 2020-08-26 11:21:46

我也尝试了COM API代码,它可以工作。但是,只有在你没有看到错误的情况下,它才是有用的--每次错误触发时,30秒的延迟仍在发生,这使我无法操作。

我所做的更好的改变是关闭驱动文件流( google产品)中的“Microsoft中的实时存在”。(到目前为止!)帮我解决了这个问题。我猜这和另一个excel加载项之间有某种冲突。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44288799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档