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

Posted

技术标签:

【中文标题】Excel 正在等待另一个应用程序完成 OLE 操作【英文标题】:Excel is waiting for another application to complete an OLE action 【发布时间】:2014-10-30 10:14:03 【问题描述】:

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

我编写了一个 VBA 程序(在 Excel 2010 中启动),它围绕包含不同 Excel 文件的数组循环。循环打开文件,刷新数据,保存并关闭数组中每个项目的文件。我编写了一个错误捕获子例程,因此我记录了哪些 excel 文件无法打开/刷新/保存等,以便用户可以手动检查它们。

有些文件非常大,涉及到通过网络传输的大量数据;有时我会得到一个对话框:

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

此外,我已经使用该行进行了测试,它不会停止弹出对话框。如果我按下回车键,它会继续,但可能会在几分钟后再次弹出。

有没有办法在不停止其他警报的情况下专门停止消息?

注意。我的进程有一个 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

【问题讨论】:

为什么投反对票,怎么了?如果有问题我可以解决它 我给了你一个 +1,因为我看不出你的问题有什么问题。 :P 给你的问题:你为什么要创建另一个 Excel 实例?这不是不必要的麻烦吗? 谢谢 n8。是的,我必须添加第二个实例来解决我的中断子例程的问题。如果用户需要安全地停止进程,他们需要单击一个按钮,但焦点停留在刷新工作簿上,因此无法访问该按钮,因此是单独的实例。 你看到了吗? answers.microsoft.com/en-us/office/forum/office_2010-excel/… 感谢链接,我试过了。我没有收到任何错误消息,但它只是挂起,直到我不得不崩溃为止。我的一个朋友认为这可能是我的显示警报语句的排序,打算试一试。干杯 【参考方案1】:

“等待另一个应用程序完成 OLE 操作”不是一条警报消息,您可以关闭并忘记,有时宏将能够在之后继续,但根据我的经验,如果您收到该错误问题崩溃/冻结整个宏只是时间问题,因此绝对应该对其进行故障排除和纠正。

当我使用其他 Microsoft Office 应用程序(运行代码的 Excel 除外)作为对象并且其中一个有错误时,我只会收到该错误 - 运行代码的 Excel 不知道发生了错误在其他应用程序之一中,因此它等待并等待并等待,最终您会收到“等待另一个应用程序完成 OLE 操作”消息...

因此,要解决此类问题,您必须寻找使用其他 MSO 应用程序的地方...在您的示例中,您有一个额外的 Excel 实例,并且您正在从 Access 中提取数据,因此它很可能是其中之一导致问题的那两个...

以下是我将如何重新编写此代码,更加小心代码与其他 MSO 应用程序交互的位置,明确控制其中发生的事情。我真正做不了多少的唯一部分是 @987654321 @ 因为我看不到你到底在做什么,但在我的代码中,我只是假设它返回了一个数组,其中包含你要更新的 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

所以我创建了自己的“refreshPivotTables”,但你可以将它嵌入到主子中,我只是认为循环和循环计数器在那时可能会有点混乱......

希望这会有所帮助, 丝绸代码

【讨论】:

感谢您的回复。不幸的是,当我发布这个查询大约三年后,我已经离开了我的旧组织,虽然我有代码,但还有太多其他变量与我现在所处的位置不同。不过,这看起来是一个很有希望的解决方案。我通过更高效地打开和刷新 Excel 数据透视表背后的代码解决了这个问题(新服务器也有帮助:D),所以我不再超时了。

以上是关于Excel 正在等待另一个应用程序完成 OLE 操作的主要内容,如果未能解决你的问题,请参考以下文章

将 ole 文件另存为 office 文档

NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))

COM和OLE有什么区别?

excel总出现正在等待其他某个应用程序以完成对象链接与嵌入操作,然后卡死

COM 和 OLE 有啥区别?

如何等待 ExecutorService 中的一个正在运行的线程完成分配另一个任务