2016-03-01 3 views
0

У меня есть книга Excel 2016, которая выполняет некоторую проверку при открытии. Я использую VSTO, вот фрагмент кода:VSTO - Прерывание открытия книги Excel

Private Sub ThisWorkbook_Open() Handles Me.Open 
    Try 
     If (DoNotOpen()) Then 
      Me.Close() 'this throws a System.Threading.ThreadAbortException 
... 

исключением того, что происходит не может быть проглочена, как он будет вновь брошен, как пояснялось here. Я понимаю, почему исключение выбрано (потому что закрытие книги перед ее открытием). Я ищу лучший способ прервать открытие (я обнаружил, что я мог бы полностью закрыть Excel программным путем, выполняя Me.Application.Quit, но я не совсем комфортно это делаю, потому что код не выходит должным образом). Заранее спасибо.

ответ

0

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

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

+0

Спасибо за ваши предложения. Есть ли событие, которое происходит перед Open(), которое я могу заблокировать? Первое предложение - сделать DoNotOpenCall() до открытия рабочей книги. Я не мог найти способ сделать это. Я также попробовал предложение по таймеру: я добавил свойство Boolean DontOpen в ThisWorkbook, установив его при открытии книги, а затем вызвав функцию StartTimer, которую я добавил в новом модуле. Функция async таймера ожидает, затем считывает значение DontOpen и вызывает Close(), если True. Такая же ошибка, все еще ... – Moto

+0

С грустью нет события WorkbookBeforeOpen (cf WorkbookBeforeClose) (вы можете проверить, перейдя в Обозреватель объектов в VBA, выберите объект приложения и щелкните правой кнопкой мыши в списке «Члены приложения» и выберите «Члены группы». все события объединены в списке внизу). Вот один из примеров с задержкой таймера закрытия: http://excelribbon.tips.net/T008192_Forcing_a_Workbook_to_Close_after_Inactivity.html Я думаю, вам нужно немного поиграть со временем, чтобы использовать его на таймере, чтобы он соответствовал вашим потребностям. –

+0

Еще раз спасибо. Пример таймера, который вы цитируете, требует, чтобы рабочая книга была включена с макросъемкой. Я не могу включить макросы по причинам безопасности, наложенным клиентом. Я очень близок к выводу, что нет известного способа закрытия книги из управляемого кода без исключения ThreadAbortException. Это неудачный, но не прерыватель транзакции (показ сообщения об ошибке в Excel может быть подавлен путем добавления системной переменной среды VSTO_SUPPRESSDISPLAYALERTS = 1). Последнее примечание: Me.Application.Quit закрывает все экземпляры Excel, поэтому его, вероятно, небезопасно использовать. – Moto

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