2015-12-14 15 views
5

Ho una cartella di lavoro che arresta in modo anomalo Excel alla chiusura quando la chiusura viene attivata da un timer API.Excel 2016 arresto anomalo del timer API avviato Workbook.close

Modifica: la cartella di lavoro nel seguente link non ha altro che il timer e i moduli di uscita e ha lo stesso comportamento, quindi non è un problema con il contenuto.

https://www.dropbox.com/s/x0xdwgj5h34ctdk/Book1.xlsm?dl=0

Pochi secondi dopo la cartella di lavoro di Excel chiude crash. Ho provato a spegnere il timer, a scoprire tutti i fogli, a scaricare i moduli ... tutti gli oggetti sono impostati su Nothing.

Tutto quello che sto facendo è Workbooks(ThisWorkbook.Name).Close SaveChanges:=True ?? !!

Lo stesso sub viene chiamato da un form utente senza problemi. La cartella di lavoro si chiude senza arresto anomalo di Excel.

Come risolvere il problema?

Sub ApplicationExit() 
' Call UnloadAllForms 
' DoEvents 
' Sleep 1000 
' Call StopCloseTimer 
'DoEvents 
'If Application.Workbooks.Count = 1 Then 
' Workbooks(ThisWorkbook.Name).Save 
' Application.Quit 
'Else 
    DoEvents 
    Workbooks(ThisWorkbook.Name).Close SaveChanges:=True 
'End If 
End Sub 

Il codice attivato dal timer è;

Sub TimerCalled() 

If CloseTimerValue = "" Then Call Reset_CloseTimerValue 
DoEvents 
If basTimers.CloseTimerValue <= Now() And Not Unlocked Then Call ApplicationExit 

On Error Resume Next 'In case sheet is protected 
ThisWorkbook.Sheets("JobIndex").Range("CloseCount").Value = Format(Now() - CloseTimerValue, "hh:m:s") 


End Sub 

L'utente dice;

CloseUp: 
i = MsgBox("Close Project Register?", vbYesNo, MsgBoxTitle) 
Select Case i 
    Case vbYes 
     Call ApplicationExit 
    Case vbNo 
     Workbooks(ThisWorkbook.Name).Save 
End Select 

risposta

0

Il timer in excel vba viene eseguito utilizzando il comando Application.OnTime o il timer di Windows, mentre lo si utilizza.

Si noti che, per pianificare la chiamata per una funzione (utilizzando il comando menzionato in alto), viene utilizzata APPLICAZIONE, il che significa che dice a EXCEL di eseguire la chiamata, non la cartella di lavoro. Quindi, nel tuo caso, la cartella di lavoro è chiusa, ma la procedura da chiamare è ancora programmata per andare avanti in qualche momento in futuro. L'errore che si ottiene è che l'Excel non trova la procedura e quindi genera un errore.

Il motivo per cui si blocca nel tuo caso è che stai usando il timer di Windows per farlo. Quando si chiude la cartella di lavoro, l'istanza di lib32 viene persa e quando arriva il momento, Windows non può raggiungere la memoria e quindi si blocca l'intera applicazione.

In entrambi i casi, sembra che la procedura pianificata sia ancora in esecuzione.

Suggerisco di esaminarlo e considerare l'utilizzo di application.ontime.

+0

La chiusura dell'istanza di Excel da application.ontime è peggiore. Anziché arrestarsi in modo anomalo, Excel si spegne/riavvia diverse/molte volte e potrebbe richiedere l'eliminazione tramite Task Manager per interromperlo. –

Problemi correlati