Excel正在等待另一个应用程序来完成一个OLE操作

在你明显的去之前: Application.DisplayAlerts = False还没有解决我的问题。

我已经编写了一个VBA过程(在Excel 2010中启动),它围绕包含不同Excel文件的数组进行循环。 循环打开文件,刷新数据,保存并closuresarrays中每个项目的文件。 我已经写了一个错误catch子程序,所以我logging哪些excel文件无法打开/刷新/保存等,所以用户可以手动检查他们。

有些文件相当大,涉及大量的networking数据; 有时我得到一个对话框: Excel正在等待另一个应用程序来完成一个OLE操作

我可以使用Application.DisplayAlerts = False来禁用消息,但这大概会禁用所有的警报,所以我无法捕捉错误?

此外,我已经使用该行进行了testing,并且不会停止popup对话框。 如果我按下进入它进行,但几分钟后可能会popup。

有没有一种方法可以停止消息而不停止其他警报?

NB。 我的进程有一个Excel的控制实例,它运行VBA并打开要在单独的实例中刷新的工作簿。

谢谢你的帮助

我的代码提取下面是包含刷新元素

 Sub Refresh_BoardPivots_Standard() ' On Error GoTo Errorhandler Dim i Dim errorText As String Dim x Dim objXL As Excel.Application Set objXL = CreateObject("Excel.Application") GetPivotsToRefresh ' populate array from SQL For Each i In StandardBoardPiv DoEvents 'If File_Exists(i) Then If isFileOpen(i) = True Then errorText = i Failed(failedIndex) = errorText failedIndex = failedIndex + 1 Else objXL.Visible = True 'False objXL.Workbooks.Open FileName:=i If objXL.ActiveWorkbook.ReadOnly = False Then BackgroundQuery = False Application.DisplayAlerts = False objXL.ActiveWorkbook.RefreshAll objXL.Application.CalculateFull objXL.Application.DisplayAlerts = False objXL.ActiveWorkbook.Save objXL.Application.DisplayAlerts = True objXL.Quit Else errorText = i Failed(failedIndex) = errorText failedIndex = failedIndex + 1 objXL.Application.DisplayAlerts = False objXL.Quit Application.DisplayAlerts = True End If End If ' Else ' errorText = i ' Failed(failedIndex) = errorText ' failedIndex = failedIndex + 1 ' End If DoEvents If Ref = False Then Exit For End If Next i Exit Sub 'Errorhandler: ' 'errorText = i 'Failed(failedIndex) = errorText 'failedIndex = failedIndex + 1 'Resume Next End Sub 

“等待另一个应用程序来完成一个OLE行动”不是一个警告消息,你可以closures和忘记,有时macros可以继续下去,但根据我的经验,如果你得到这个错误只是一个问题的时间,直到问题崩溃/冻结你的整个macros,所以它肯定是麻烦和纠正。

我只在使用其他Microsoft Office应用程序(不包括正在运行代码的Excel)作为对象时遇到此错误,其中一个错误 – 运行代码的Excel不知道发生了错误其他应用程序,所以它等待,等待和等待,最终你得到“等待另一个应用程序来完成一个OLE行动”消息…

因此,为了解决这类问题,您必须查找其他MSO应用程序的位置。在您的示例中,您有一个额外的Excel实例,并且正在从Access中提取数据,所以它最有可能是那两个正在造成问题…

下面是我将如何重新编写这个代码,更仔细的代码与其他MSO应用程序交互的地方,明确地控制发生在他们的事情。唯一我不能做的太多是GetPivotsToRefresh因为我无法看到你在这里做什么,但在我的代码,我只是假定它返回一个数组,你想要更新的Excel文件。 见下面的代码:

 Sub Refresh_BoardPivots_Standard() Dim pivotWB As Workbook Dim fileList() As Variant Dim fileCounter As Long Application.DisplayAlerts = False fileList = GetPivotsToRefresh 'populate array from SQL For fileCounter = 1 To UBound(fileList, 1) Set pivotWB = Workbooks.Open(fileList(fileCounter, 1), False, False) If pivotWB.ReadOnly = False Then Call refreshPivotTables(pivotWB) pivotWB.Close (True) Else '... Error handler ... pivotWB.Close (False) End If Next End Sub Public Sub refreshPivotTables(targetWB As Workbook) Dim wsCounter As Long Dim ptCounter As Long For wsCounter = 1 To targetWB.Sheets.Count With targetWB.Sheets(wsCounter) If .PivotTables.Count > 0 Then For ptCounter = 1 To .PivotTables.Count .PivotTables(ptCounter).RefreshDataSourceValues Next .Calculate End If End With Next End Sub 

所以我创build了我自己的'refreshPivotTables',但是你可以将它embedded到master子中,我只是认为循环和循环计数器可能会在这一点上变得杂乱。

希望这有助于TheSilkCode