2015-12-14 7 views
5

Mam skoroszyt, który zawiesza program Excel na zamknięciu, gdy zamknięcie jest uruchamiany przez zegar API.Błąd programu Excel 2016 na zainicjowanym zegarze interfejsu API Workbook.close

Edytuj: Skoroszyt w poniższym łączu ma tylko moduły zegara i wyjścia i ma takie samo działanie, więc nie stanowi problemu z zawartością.

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

kilka sekund po skoroszyt zamyka awarii programu. Próbowałem wyłączyć timer, odkryć wszystkie arkusze, rozładować formularze ... wszystkie obiekty są ustawione na Nothing.

Wszystko, co robię, to Workbooks(ThisWorkbook.Name).Close SaveChanges:=True ?? !!

Ten sam sub jest wywoływany z UserForm bez problemu. Skoroszyt zamknie się bez awarii programu Excel.

Jak to naprawić?

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 

Kod wyzwalany przez timer jest;

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 

Formularz użytkownika mówi;

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

Odpowiedz

0

Licznik czasu w programie excel vba jest wykonywany za pomocą polecenia Application.OnTime lub timera systemu Windows, tak jak używasz.

Należy zauważyć, że aby zaplanować wywołanie funkcji (przy użyciu wyżej wspomnianego polecenia), używana jest APLIKACJA, co oznacza, że ​​EXCEL nakazuje wykonanie połączenia, a nie skoroszytu. Tak więc w twoim przypadku skoroszyt jest zamknięty, ALE procedura, która ma się nazywać, jest wciąż planowana w przyszłości. Pojawia się błąd, że program Excel nie znajdzie procedury, a następnie zgłasza błąd.

Przyczyną awarii w Twoim przypadku jest to, że używasz do tego celu timera. Po zamknięciu skoroszytu utracono instancję lib32, a gdy nadejdzie czas, system Windows nie będzie mógł sięgnąć do pamięci, a następnie zawiesi całą aplikację.

W obu przypadkach wydaje się, że zaplanowana procedura nadal trwa.

Sugeruję, abyś się nad tym zastanowił i rozważył użycie application.ontime.

+0

Zamknięcie wystąpienia programu Excel z application.ontime jest gorsze. Zamiast awaryjnie Excel zostanie zamknięty/zrestartowany kilka/wiele razy i może wymagać zabicia przez menedżera zadań, aby go zatrzymać. –

Powiązane problemy