web-dev-qa-db-fra.com

Excel attend qu'une autre application complète une OLE action

Avant de partir pour l'évidence: Application.DisplayAlerts = False n'a pas résolu mon problème.

J'ai écrit une procédure VBA (initiée dans Excel 2010) qui boucle autour d'un tableau contenant différents fichiers Excel. La boucle ouvre le fichier, actualise les données, enregistre et ferme le fichier pour chaque élément du tableau. J'ai écrit une sous-routine d'erreur de capture afin de consigner les fichiers Excel dont l'ouverture, l'actualisation, l'enregistrement, etc. ont échoué, afin qu'un utilisateur puisse les vérifier manuellement.

Certains fichiers sont assez volumineux et impliquent une grande quantité de données transférées sur le réseau. Parfois, une boîte de dialogue contenant: Excel attend qu'une autre application complète une action OLE _ .

Je pourrais utiliser Application.DisplayAlerts = False pour désactiver le message, mais cela désactiverait vraisemblablement toutes les alertes afin que je ne puisse pas détecter les erreurs? 

De plus, j'ai testé l'utilisation de la ligne et cela n'arrête pas la boîte de dialogue. Si j'appuie sur Entrée, il continue, mais il réapparaîtra probablement quelques minutes plus tard.

Est-il possible d'arrêter le message de manière spécifique sans arrêter les autres alertes?

NB Mon processus a une instance de contrôle d'Excel qui exécute le VBA et ouvre les classeurs à actualiser dans une instance distincte. 

Merci de votre aide

Vous trouverez ci-dessous un extrait de mon code contenant les éléments de rafraîchissement.

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

"Attendre qu'une autre application termine une action OLE" n'est pas un message d'alerte, vous pouvez simplement l'éteindre et l'oublier. Parfois, la macro pourra continuer après, mais dans mon expérience, si vous obtenez cette erreur n’est qu’une question de temps, jusqu’à ce que le problème se bloque/gèle l’ensemble de votre macro, il devrait donc être résolu et corrigé.

Je ne reçois cette erreur que lorsque j'utilise des applications Microsoft Office supplémentaires (autres que Excel qui exécute le code) en tant qu'objets et que l'une d'entre elles comporte une erreur: Excel qui exécute le code ne sait pas qu'une erreur s'est produite dans l'un des fichiers. les autres applications, donc attend et attend et attend et finalement vous obtenez le message "En attente d'une autre application pour terminer un OLE action" ...

Donc, pour résoudre ce type de problème, vous devez rechercher les endroits où vous utilisez d'autres applications MSO ... Dans votre exemple, vous avez une instance supplémentaire d'Excel et vous extrayez des données d'Access, il est donc probablement l'une de ces deux est la cause des problèmes ...

Ci-dessous, je voudrais réécrire ce code, en veillant plus particulièrement à ce qu'il interagisse avec les autres applications MSO, en contrôlant explicitement ce qui se passe dans celles-ci. Le seul élément que je ne pourrais pas vraiment faire beaucoup est GetPivotsToRefresh car je ne vois pas Qu'est-ce que vous faites exactement ici, mais dans mon code, je suppose simplement qu'il renvoie un tableau avec une liste des fichiers Excel que vous souhaitez mettre à jour. Voir le code ci-dessous:

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

J'ai donc créé mon propre 'refreshPivotTables', mais vous auriez pu l'intégrer au sous-maître principal. Je pensais juste que les boucles et les compteurs de boucle pourraient devenir un peu brouillons à ce moment-là ...

J'espère que cela vous aidera, TheSilkCode

1
TheSilkCode