2015-12-14 3 views
5

Ich habe eine Arbeitsmappe, die Excel beim Schließen stürzt ab, wenn die Schließung von einem API-Timer ausgelöst wird.Excel 2016 Absturz auf API-Timer initiiert Workbook.close

Bearbeiten: Die Arbeitsmappe in Link unten hat nichts als die Timer und Exit-Module und es hat das gleiche Verhalten, so ist es kein Problem mit dem Inhalt.

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

Einige Sekunden nach der Arbeitsmappe stürzt Excel schließt. Ich habe versucht, den Timer auszuschalten, alle Blätter zu verstecken, Formulare zu entladen ... alle Objekte sind auf Nothing eingestellt.

Alles was ich mache ist Workbooks(ThisWorkbook.Name).Close SaveChanges:=True ?? !!

Das gleiche Sub wird von einem UserForm ohne Problem aufgerufen. Die Arbeitsmappe wird geschlossen, ohne dass Excel abstürzt.

Wie behebt man das?

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 

Der vom Timer ausgelöste Code ist;

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 

Das Benutzerformular sagt;

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

Antwort

0

Timer in Excel VBA erfolgt mit dem Application.OnTime-Befehl oder Windows-Timer, wie Sie verwenden.

Beachten Sie, dass zum Ansetzen des Aufrufs für eine Funktion (mit dem oben genannten Befehl) APPLICATION verwendet wird. Dies bedeutet, dass EXCEL angewiesen wird, den Aufruf auszuführen, nicht Ihre Arbeitsmappe. In Ihrem Fall ist die Arbeitsmappe also geschlossen, ABER die anzurufende Prozedur soll noch in der Zukunft ausgeführt werden. Der Fehler, den Sie erhalten, ist, dass das Excel die Prozedur nicht findet und dann einen Fehler auslöst.

Der Grund, warum es in Ihrem Fall abstürzt, ist, dass Sie Windows-Timer verwenden, um es zu tun. Wenn Sie Ihre Arbeitsmappe schließen, ist Ihre Instanz der Lib32 verloren und wenn die Zeit kommt, kann Windows nicht in den Speicher greifen und stürzt dann die gesamte Anwendung ab.

In beiden Fällen scheint Ihre geplante Prozedur noch ausgeführt zu werden.

Ich schlage vor, dass Sie sich das ansehen und in Erwägung ziehen, application.ontime zu verwenden.

+0

Das Schließen der Excel-Instanz von application.ontime ist schlechter. Statt Absturz Excel wird heruntergefahren/neu gestartet mehrere/viele Male und erfordern möglicherweise Kill über Task-Manager, um es zu stoppen. –

Verwandte Themen