在你明白之前:Application.DisplayAlerts = False
还没有解决我的问题。
我编写了一个VBA程序(在Excel 2010中启动),该程序循环包含不同Excel文件的数组。循环打开文件,刷新数据,保存并关闭数组中每个项目的文件。我编写了一个错误catch子例程,因此我记录了哪些excel文件无法打开/刷新/保存等,以便用户可以手动检查它们。
某些文件非常庞大,涉及大量数据在网络中传输;有时我得到一个对话框: Excel正在等待另一个应用程序完成OLE操作。
我可以使用Application.DisplayAlerts = False
来禁用该消息,但这可能会禁用所有警报,因此我无法捕获错误?
此外,我已经使用该线进行了测试,并且它不会停止弹出对话框。如果我按下输入它继续,但几分钟后可能会再次弹出。
有没有办法在没有停止其他警报的情况下专门停止消息?
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
答案 0 :(得分:1)
"等待另一个应用程序完成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中,我只是认为循环和循环计数器可能会在那一点上变得有点凌乱......
希望这有帮助, TheSilkCode