Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Excel正在等待另一个应用程序完成OLE操作_Vba_Excel_Dialog_Refresh - Fatal编程技术网

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

Vba Excel正在等待另一个应用程序完成OLE操作,vba,excel,dialog,refresh,Vba,Excel,Dialog,Refresh,在进行显而易见的操作之前:Application.DisplayAlerts=False没有解决我的问题 我编写了一个VBA过程(在Excel 2010中启动),它围绕包含不同Excel文件的数组循环。循环打开文件、刷新数据、保存和关闭阵列中每个项目的文件。我编写了一个错误捕获子例程,因此我记录了哪些excel文件无法打开/刷新/保存等,以便用户可以手动检查它们 有些文件相当大,涉及大量数据在网络上移动;有时我会看到一个对话框:Excel正在等待另一个应用程序完成OLE操作 我可以使用Appli

在进行显而易见的操作之前:
Application.DisplayAlerts=False
没有解决我的问题

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

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

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

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

有没有一种方法可以在不停止其他警报的情况下专门停止Is消息

注意。我的流程有一个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
,因为我看不到您在这里到底在做什么,但在我的代码中,我只是假设它返回了一个数组h要更新的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
所以我创建了我自己的“刷新数据透视表”,但是你可以把它嵌入到master sub中,我只是觉得循环和循环计数器可能会变得有点混乱

希望这有帮助,
silkcode

为什么否决,有什么问题吗?如果有问题我可以解决,我给你a+1,因为我看不出你的问题有什么问题。:p问你的问题:为什么要创建另一个Excel实例?这不是一个不必要的复杂问题吗?谢谢n8。是的,我必须添加第二个实例来解决我的中断子程序的问题。如果用户需要安全停止进程,则需要单击一个按钮,但focus仍停留在刷新工作簿中,因此无法访问该按钮,因此出现了另一个实例。您看到了吗?感谢链接,我尝试了它。我没有收到任何错误消息,但它只是挂起,直到我不得不崩溃。我的一个朋友认为这可能是我的显示警报语句的顺序,我将试一试。干杯谢谢你的回答。不幸的是,当我发布此查询大约三年后,我离开了我的旧组织,虽然我有代码,但有太多其他变量与我现在的不同。尽管这看起来是一个很有希望的解决方案。我绕过了这个问题,使Excel数据透视背后的代码被更有效地打开和刷新(新服务器也有帮助:D),这样我就不再超时了。