webentwicklung-frage-antwort-db.com.de

Excel wartet darauf, dass eine andere Anwendung eine OLE Aktion

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
6
SliderSteve

"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

1
TheSilkCode