2014-09-05 1 views
5

Prima di andare per l'ovvio: Application.DisplayAlerts = False non ha risolto il mio problema.Excel è in attesa di un'altra applicazione per completare un'azione OLE

Ho scritto una procedura VBA (avviata in Excel 2010) che scorre in un array contenente diversi file Excel. Il ciclo apre il file, aggiorna i dati, salva e chiude il file per ogni elemento dell'array. Ho scritto una routine secondaria di cattura degli errori, quindi registro quali file Excel non sono riusciti ad aprire/aggiornare/salvare ecc. In modo che un utente possa controllarli manualmente.

Alcuni file sono piuttosto grandi e comportano una grande quantità di dati che si spostano attraverso la rete; a volte viene visualizzata una finestra di dialogo con: Excel è in attesa di un'altra applicazione per completare un'azione OLE.

Potrei usare Application.DisplayAlerts = False per disabilitare il messaggio ma questo presumibilmente disabiliterebbe tutti gli avvisi in modo da non riuscire a rilevare gli errori?

Inoltre ho provato a utilizzare la linea e non interrompe il pop-up della finestra di dialogo. Se premo invio, si attiva ma verrà visualizzato nuovamente alcuni minuti dopo.

C'è un modo per interrompere specificamente il messaggio senza interrompere altri avvisi?

NB. Il mio processo ha un'istanza di controllo di Excel che esegue VBA e apre le cartelle di lavoro da aggiornare in un'istanza separata.

Grazie per il vostro aiuto

Un estratto del mio codice è inferiore che contiene gli elementi di aggiornamento

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

Perché il downvote, cosa c'è di sbagliato? Se c'è un problema, posso sistemarlo – SliderSteve

+0

Ti ho dato un +1 perché non vedo nulla di sbagliato nella tua domanda. : P Domanda per te: perché stai creando un'altra istanza di Excel? Non è una complicazione inutile? –

+0

Grazie n8. Sì, ho dovuto aggiungere la seconda istanza per risolvere un problema con la mia sub-routine di interruzione. L'utente doveva fare clic su un pulsante se aveva bisogno di interrompere il processo in modo sicuro, ma l'attenzione era rimasta con la cartella di lavoro di aggiornamento in modo da non poter accedere al pulsante, quindi l'istanza separata. – SliderSteve

risposta

1

"in attesa di un'altra applicazione completare un'azione OLE" non è un messaggio di avviso è possibile basta spegnere e dimenticare, a volte la macro sarà in grado di continuare dopo, ma nella mia esperienza se si ottiene quell'errore è solo una questione di tempo fino a quando il problema si blocca/blocca l'intera macro, quindi dovrebbe essere sicuramente problematica e corretta .

L'errore viene visualizzato solo quando utilizzo applicazioni Microsoft Office aggiuntive (diverse da Excel su cui è in esecuzione il codice) come oggetti e uno di essi presenta un errore: l'Excel che esegue il codice non conosce un errore si è verificato in una delle altre applicazioni in modo che sia in attesa, attende e attende il messaggio "In attesa di un'altra applicazione per completare un'azione OLE" ...

Quindi, per risolvere questo tipo di problema è necessario cercare i posti in cui usi altre app MSO ... Nel tuo esempio, hai un'ulteriore istanza di Excel e stai prelevando dati da Access, quindi è probabilmente uno di quei due che sta causando i problemi ...

Di seguito è come vorrei riscrivere questo codice, facendo più attenzione a dove il codice interagisce con le altre app MSO, controllando esplicitamente ciò che sta accadendo in loro .. L'unico pezzo che non potrei davvero fare molto è GetPivotsToRefresh perché non posso vedi cosa stai facendo esattamente qui, ma nel mio codice ho appena pensato di restituire un array con un elenco dei file excel che vuoi aggiornare. Vedere codice qui sotto:

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 

Così ho creato il mio 'refreshPivotTables', ma si potrebbe avere incorporato che nel master sub, ho solo pensato che i loop e contatori di ciclo potrebbe ottenere un po 'disordinato, a quel punto ...

Spero che questo aiuti, TheSilkCode

+0

Grazie per la risposta. Sfortunatamente, quando ho postato questa domanda per circa tre anni, ho lasciato la mia vecchia organizzazione e sebbene abbia il codice, ci sono troppe variabili che sono diverse da quelle in cui sono ora. Comunque sembra una soluzione promettente. Ho risolto il problema rendendo il codice dietro i pivot di Excel in fase di apertura e aggiornato più efficiente (anche il nuovo server ha aiutato: D) quindi non ho più avuto timeout. – SliderSteve