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



在你说显而易见的话之前:Application.DisplayAlerts = False还没有解决我的问题。

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

有些文件相当大,并且涉及在网络上移动的大量数据;有时我会看到一个对话框,其中包含:Excel正在等待另一个应用程序完成OLE操作

我可以使用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

"等待另一个应用程序完成OLE操作"不是一条警报消息,你可以关闭并忘记,有时宏可以在之后继续运行,但根据我的经验,如果你出现错误,问题崩溃/冻结整个宏只是时间问题,所以肯定应该进行故障排除和更正。

只有当我使用其他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

所以我创建了自己的"refreshPivotTables",但你可以将其嵌入到master sub中,我只是觉得循环和循环计数器在这一点上可能会变得有点乱。。。

希望这能有所帮助,SilkCode

相关内容

最新更新