Ежедневно человеку необходимо проверять, чтобы определенные рабочие книги были правильно обновлены с рыночными данными Bloomberg и Reuters; то есть все данные прошли и что «цифры выглядят правильно». В прошлом люди не проверяли «цифры», что приводило к неточной загрузке в другие системы.
Идея заключается в том, что необходимо разработать «что-то», чтобы предотвратить закрытие / сохранение книги при использовании, если он / она не проверил, что обновления являются правильными / точными. Действие numbers look correct
является чисто интуитивным упражнением, поэтому не будет закодировано каким-либо образом.
Простым решением было предложить пользователям перед закрытием конкретной книги проверить, что данные проверены.
Используя VSTO SE для Excel 2007, была создана надстройка, которая подключается к событию WorkbookBeforeClose
, которое инициализируется в надстройке ThisAddIn_Startup
private void wb_BeforeClose(Xl.Workbook wb, ref bool cancel)
{
//.... snip ...
if (list.Contains(wb.Name))
{
DailogResult result = MessageBox.Show("some message", "sometitle", MessageBoxButtons.YesNo);
if (result != DialogResult.Yes)
{
cancel = true; // i think this prevents the whole application from closing
}
}
}
Я обнаружил следующее ThisApplication.WorkbookBeforeSave
против ThisWorkbook.Application.WorkbookBeforeSave
, в котором рекомендуется использовать событие ThisApplication.WorkbookBeforeClose
, которое, как мне кажется, является тем, что я делаю, поскольку охватит все открытые файлы.
Проблема, с которой я столкнулся при таком подходе, состоит в том, что при условии, что у меня открыто несколько файлов, некоторые из которых находятся в моем list
, событие не позволяет Excel закрывать все файлы последовательно. Теперь требуется, чтобы каждый файл закрывался индивидуально. Редактировать : это происходит, когда Выход из Excel используется из меню Файл.
Вопросы
- Правильно ли я использую событие
WorkbookBeforeClose
и является ли это эффективным и действенным использованием события?
- Следует ли использовать событие уровня приложения или событие уровня документа ?
- Является ли описанное выше поведение нормальным ?
- При использовании событий рабочей книги в надстройке приветствуются любые другие предложения.
Обновление [30 марта 2010 года]:
Повозившись, я также попробовал следующее, пытаясь связать обработчик событий BeforeClose
с каждой книгой, которая была открыта, как предложено по ссылке выше.
private void ThisAddIn_Startup(...)
{
// snip
Globals.ThisAddin.Application.WorkbookOpen += Application_Open;
}
private void Application_Open(XL.Workbook wb)
{
wb.BeforeClose += Document_WorkbookBeforeClose; // method does the same as above
}
Проблема, с которой я столкнулся при таком подходе, заключается в том, что я пытаюсь закрыть все файлы Excel (используя опцию Выход из Excel ), обработчик событий не выполняется. По моим наблюдениям, это происходит, когда проверяемый документ не является активным документом.
Этот метод кажется ошибочным по сравнению с моим первоначальным подходом. Одна вещь, в которой я не уверен или чувствую себя комфортно, это привязка события при каждом открытии документа.
Обновление [07-Apr-2010]:
Предложенный Гленом ответ полезен, но не затрагивает актуальные вопросы, поэтому я прояснил последний вопрос немного подробнее.
Я также нашел этот блог Как получить закрытое событие Excel VSTO Workbook , что в некоторой степени относится к моей проблеме, поскольку его можно использовать в альтернативном подходе к моему решению с использованием подхода типа монитора к обработка рабочих книг (и, возможно, также использование недавно представленного события OnWorkbookClosed
).
Обновление [08-апр-2010]:
Кажется, есть некоторая путаница, меня не беспокоит какая-либо проверка на самих книгах, а вопрос о правильности метода, который я использую (то есть с использованием события WorkbookBeforeClose
уровня приложения).
Комментарий @Mathias ниже показывает правильное понимание части проблемы относительно вопроса 3, хотя я думаю, что это стандартное поведение excel. Решение этой проблемы состояло в том, чтобы создать функцию закрытия, которая закрывает только мои определенные файлы.
- Является ли описанное выше поведение нормальным ? Да, но почему?
Поскольку надстройка подключается к событию уровня приложения, проверка и отмена события блокирует приложение от закрытия любых дальнейших рабочих книг. Ключом здесь является аргумент
ref bool cancel
(cancel=false
разрешает нормальное закрытие книги (по умолчанию), cancel=true
предотвращает закрытие книги)
VS 2005 с VSTO SE