当使用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
中。然而,这似乎是一个可怕的想法,因为在某些情况下,我确实需要得到提醒。
发布于 2017-05-31 15:35:04
我将在注释中添加@德黑兰脚本链接到的代码。
您可以通过使用COM来删除VBA的消息过滤器来解决这个问题。这将阻止COM在VBA认为正在调用的进程阻塞时告诉VBA显示消息框。请注意,如果进程由于某种原因而真的阻塞了,这将阻止您收到任何通知。[来源]
我认为这是我在2006年为同样的问题使用的代码(它成功了)。
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
发布于 2020-08-26 11:21:46
我也尝试了COM API代码,它可以工作。但是,只有在你没有看到错误的情况下,它才是有用的--每次错误触发时,30秒的延迟仍在发生,这使我无法操作。
我所做的更好的改变是关闭驱动文件流( google产品)中的“Microsoft中的实时存在”。(到目前为止!)帮我解决了这个问题。我猜这和另一个excel加载项之间有某种冲突。
https://stackoverflow.com/questions/44288799
复制相似问题