2012-01-24 2 views
2

У меня есть книга Excel с элементами управления ActiveX на листах (а не на Userform!). Когда я закрываю книгу (не закрывая Excel), все работает хорошо, но когда я закрываю Excel полностью, он запускает события изменения ActiveX Comboboxes на листах. Это создает ошибки, потому что кажется, что Excel уже сделал некоторую очистку, удалив элементы управления.Триггер событий управления Excel при закрытии приложения

Как я могу обходить или разрешать это? Эти события не должны запускаться в первую очередь, потому что никакие значения не изменяются при закрытии.

+0

У вас есть событие в вашем ActiveX, которое будет запущено в Excel Close? – JMax

ответ

2

Не видя, как настроены элементы управления ActiveX, я не могу сказать вам, почему их изменения происходят. Однако, предполагая, что событие BeforeClose рабочей книги срабатывает перед событиями изменения ActiveX, вы можете добавить глобальную переменную для отслеживания закрытия книги.

В модуле кода:

Public g_bClosingWorkbook As Boolean 

В ThisWorkbook:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    g_bClosingWorkbook = True 
End Sub 

Private Sub Workbook_Open() 
    g_bClosingWorkbook = False 
End Sub 

Затем запускаются только события изменения, если не закрывая книгу.

Private Sub ComboBox1_Change() 
    If Not g_bClosingWorkbook Then 
     ' do stuff here 
    End If 
End Sub 
+0

Это то, что я сейчас делаю. Было бы надеяться, что будет более приятное решение. –

+0

Даже этот подход не сработал для нас должным образом, не уверен, почему, хотя я хочу отметить, что в нашем случае книга запрашивала, сохранять или нет (с ответом «нет»), в результате чего он не работает. В нашем случае глобальная переменная возвращалась обратно в False во время выключения рабочей книги (каким-то образом, Excel), * после * в Workbook_BeforeClose было установлено значение True, в результате чего обработчики обработчиков ошибок все еще ошибочно запускаются. Чтобы обойти это, мы инвертировали логику, то есть логическое значение получает значение True в методе _Open(), а обработчики _Change() работают только в том случае, если значение равно True. –

2

Вставьте этот модуль в модуль и используйте его, чтобы сохранить и закрыть как книгу, так и Excel. Сначала события отключены, что должно предотвратить проблему.

Sub closeNoEvents() 
    Application.EnableEvents = False 
    On Error Resume Next 
    ThisWorkbook.Save 
    Application.Quit 
    ThisWorkbook.Close 
End Sub 

Вы также можете проверить, какой код находится в «ThisWorkbook»; возможно, есть что-то в Workbook_BeforeClose.

+1

Application.EnableEvents = False не предотвращает запуск событий управления. –

Смежные вопросы