2014-09-05 2079 views
5

在您明確表示之前:Application.DisplayAlerts = False尚未解決我的問題。Excel正在等待另一個應用程序來完成OLE操作

我寫了一個VBA過程(在Excel 2010中啓動),它圍繞包含不同Excel文件的數組進行循環。循環打開文件,刷新數據,保存並關閉數組中每個項目的文件。我寫了一個錯誤catch子例程,以便記錄哪些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 
+0

爲什麼downvote,有什麼不對?如果有問題,我可以修復它 – SliderSteve 2014-09-05 13:36:54

+0

我給你+1,因爲我沒有看到你的問題有任何問題。 :P問你:你爲什麼要創建另一個Excel實例?這不是不必要的併發症嗎? – 2014-09-05 20:02:11

+0

謝謝n8。是的,我必須添加第二個實例來解決我的中斷子例程的問題。用戶需要點擊按鈕,如果他們需要安全地停止該過程,但重點在於刷新工作簿,因此按鈕無法訪問,因此是單獨的實例。 – SliderSteve 2014-09-07 01:05:21

回答

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」,但你可能會認爲嵌入到主子,我只是想循環和循環計數器可能在這一點上變得有些混亂......

希望這有助於 TheSilkCode

+0

謝謝你的迴應。不幸的是,因爲我發佈了這個關於三年的查詢,所以我離開了我的舊組織,儘管我有代碼,但現在有太多其他變量與我不同。它看起來像一個有希望的修復,但。我通過使Excel背後的代碼被打開並刷新效率更高來解決問題(新的服務器也幫助:D),所以我不再超時。 – SliderSteve 2017-12-07 18:32:50