Bevor Sie sich für das Offensichtliche entscheiden: Application.DisplayAlerts = False
hat mein Problem nicht gelöst.
Ich habe eine VBA-Prozedur (in Excel 2010 initiiert) geschrieben, die ein Array mit verschiedenen Excel-Dateien umkreist. Die Schleife öffnet die Datei, aktualisiert die Daten, speichert und schließt die Datei für jedes Element im Array. Ich habe eine Unterroutine zum Erkennen von Fehlern geschrieben, damit ich protokolliere, welche Excel-Dateien nicht geöffnet/aktualisiert/gespeichert usw. wurden, damit ein Benutzer sie manuell überprüfen kann.
Einige Dateien sind sehr groß und erfordern eine große Datenmenge, die über das Netzwerk übertragen wird. Manchmal erhalte ich ein Dialogfeld mit: Excel wartet darauf, dass eine andere Anwendung eine OLE -Aktion abschließt .
Ich könnte Application.DisplayAlerts = False
verwenden, um die Nachricht zu deaktivieren, aber dies würde vermutlich alle Warnungen deaktivieren, sodass ich die Fehler nicht abfangen konnte.
Außerdem habe ich die Leitung getestet und das Popup-Dialogfeld wird dadurch nicht gestoppt. Wenn ich die Eingabetaste drücke, wird es wahrscheinlich einige Minuten später wieder angezeigt.
Gibt es eine Möglichkeit, eine bestimmte Nachricht zu stoppen, ohne andere Warnungen zu stoppen?
NB. Mein Prozess verfügt über eine Steuerelementinstanz von Excel, die die VBA ausführt und die zu aktualisierenden Arbeitsmappen in einer separaten Instanz öffnet.
Danke für Ihre Hilfe
Ein Auszug aus meinem Code ist unten, der die Aktualisierungselemente enthält
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
"Warten auf eine andere Anwendung, um eine OLE -Aktion abzuschließen" ist keine Warnmeldung, die Sie einfach deaktivieren und vergessen können. Manchmal kann das Makro danach fortgesetzt werden, aber nach meiner Erfahrung, wenn Sie dies bemerken Dieser Fehler ist nur eine Frage der Zeit, bis das Problem Ihr gesamtes Makro zum Absturz bringt/einfriert, sodass es definitiv behoben werden sollte.
Ich erhalte diesen Fehler nur, wenn ich zusätzliche Microsoft Office-Anwendungen (außer dem Excel, in dem der Code ausgeführt wird) als Objekte verwende und einer von ihnen einen Fehler aufweist. Das Excel, in dem der Code ausgeführt wird, weiß nicht, dass in einem von ein Fehler aufgetreten ist die anderen Anwendungen warten und warten und warten, und schließlich erhalten Sie die Meldung "Warten auf eine andere Anwendung, um eine OLE -Aktion abzuschließen" ...
Um diese Art von Problem zu beheben, müssen Sie nach Orten suchen, an denen Sie andere MSO-Apps verwenden ... In Ihrem Beispiel haben Sie eine zusätzliche Excel-Instanz, und Sie ziehen Daten aus Access, also wahrscheinlich eine dieser beiden verursacht die Probleme ...
Unten ist, wie ich diesen Code neu schreiben würde, vorsichtiger mit zu sein, wo der Code interagiert mit den anderen MSO-Anwendungen, explizit zu steuern, was .. Das einzige Stück in ihnen geschieht, konnte ich nicht wirklich viel zu tun ist GetPivotsToRefresh
, weil ich nicht sehen kann Was genau machst du hier, aber in meinem Code habe ich nur angenommen, dass es ein Array mit einer Liste der zu aktualisierenden Excel-Dateien zurückgibt. Siehe Code unten:
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
Also habe ich meine eigenen 'refreshPivotTables' erstellt, aber Sie hätten das in das Master-Sub einbetten können. Ich dachte nur, die Schleifen und Schleifenzähler könnten an diesem Punkt etwas chaotisch werden ...
Hoffe das hilft, TheSilkCode