Рекомендации по работе с несколькими открытыми книгами в надстройке Excel VSTO

Я работаю над надстройкой Excel VSTO в VB.Net. Я пытаюсь решить вопрос о том, какую книгу должна выполнять моя надстройка, учитывая, что пользователь может открывать или закрывать множество книг до, после или во время использования моей основной формы.

Все основные функции сосредоточены на редактировании основного файла шаблона, который пользователь предположительно сохраняет с полезными именами и может вернуться к нему для справки или дальнейшего редактирования. Надстройка открывает форму и выполняет различные функции, такие как добавление информации из базы данных на лист или добавление листов в книгу (и множество статистических данных). Многое из того, что я делаю, основано на вызове конкретной книги:

        CurrentRun = Marshal.GetActiveObject("Excel.Application")
        CurrentBook = CurrentRun.Workbooks(CurrentIndex)

Где CurrentIndex — это индекс из поля со списком, которое заполняется/обновляется именами открытых в данный момент книг:

    ...
    ControlCurrentWBComboBox.Items.Clear()
    CurrentRun = Marshal.GetActiveObject("Excel.Application")
    For n = 1 To CurrentRun.Workbooks.Count()
        ControlCurrentWBComboBox.Items.Add(CurrentRun.Workbooks(n).Name)
    Next
    CurrentRun = Nothing
    ...

Для этого пользователь должен выбрать книгу (по имени), с которой он хочет работать. Это казалось хорошей идеей, пока я не представил ее сегодня 8 разным пользователям. Большинство со временем привыкло к выбору книги, но не без большого количества ворчания и выбрасывания ошибок (которые были хорошо обработаны). 2 пользователя так и не получили его и постоянно случайно редактировали не ту книгу и выдавали ошибки через час использования.

Есть ли лучший способ справиться с этим? Я думаю попробовать сделать две версии: одну с вышеперечисленным и одну для людей, которым нужно меньше опций. Есть ли способ заставить своего рода отношения 1-к-1, которые вы можете получить, поместив код VBA в саму книгу?

Могу ли я использовать базу, даже пытаясь справиться с этим или ссылаясь на что-либо, кроме ActiveWorkbook?

[Примечание: меня немного пугает синее предупреждение, которое говорит мне, что это субъективный вопрос. Я не хочу, чтобы это было; возможно, мне нужна помощь с формулировкой?]


person Atl LED    schedule 29.03.2013    source источник
comment
Я немного смущен. Если 2 пользователя, которые не выбрали соответствующий файл из комбинации, то как работала эта строка CurrentBook = CurrentRun.Workbooks(CurrentIndex)? в идеале CurrentIndex не должно иметь никакого значения... Или это было предварительно заполнено? Если это было предварительно заполнено, то одно из решений, которое я вижу для вашей проблемы, - установить для комбо пустое значение, а затем отловить его на случай, если пользователь не выберет соответствующую книгу?   -  person Siddharth Rout    schedule 29.03.2013
comment
@SiddharthRout Это не сработало, потому что было пустым. Он выдал ошибку индекса, которая была обработана окном сообщения. Вам нужно выбрать книгу для работы. Два пользователя так и не привыкли к этому и поэтому постоянно выдавали ошибку. Они также открывали и закрывали множество книг, поэтому индекс часто менялся (что требовало частых обновлений выбранной книги). Я думал, что это элегантное решение, пока не увидел это.   -  person Atl LED    schedule 29.03.2013


Ответы (1)


Если ваша надстройка не «просто работает» с какой-либо открытой книгой, вам, вероятно, не следует использовать надстройку приложения; скорее, вам следует использовать надстройку для документов.

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

Если это вариант в вашей среде, я настоятельно рекомендую его в качестве передовой практики.

person nunzabar    schedule 29.03.2013
comment
Я думал об этом и думаю до сих пор. На данный момент надстройка работает с 6 различными основными шаблонами и около 40 второстепенными (и может определить, над каким из них он работает/нераспознанные книги). Проблема заключалась в редактировании непредусмотренного файла и невозможности обучить некоторых пользователей. Возможно, мне следует встроить его в каждый из основных шаблонов. - person Atl LED; 30.03.2013
comment
Я решил, что вы правы, если он не предназначен для ВСЕХ книг (даже если он предназначен для многих книг), то его следует отбросить до настройки на уровне документа. Есть ли хорошие ресурсы для перехода от надстройки приложения к настройке документа? Я нашел много другого пути. - person Atl LED; 01.04.2013
comment
Я никогда этого не делал. Если бы это был я, я бы не пытался изменить ваш текущий проект, я бы начал новый проект надстройки уровня документа и вручную скопировал код из старого. Удачи. - person nunzabar; 01.04.2013