Я работаю над надстройкой, которая периодически запрашивает пересчет, используя следующее:
((Excel.Application) xlApp).Calculate()
Если пользователь в тот момент редактировал формулу, При этом Excel нарушает формулу пользователя .
Я ожидаю, что действие завершится неудачей из-за активности пользователя, что оно и делает, но не раньше, чем странным образом прерывает любую формулу, которую вводит пользователь.
Например, если пользователь набирает текст в ячейке =SUM(1+2+
, как только я запускаю приведенную выше строку кода, его ввод прерывается, и Excel жалуется, что его формула неполна или похожа.
Обратите внимание, что это даже не то же самое поведение, как если бы пользователь нажал "Enter", что привело бы к диалогу, подобному этому:
Excel делает что-то более странное и пытается выкинуть пользователя из формул ввода без всяких изысков.
Даже страннее - если пользовательская формула синтаксически верна, Excel не только исключает их из редактирования формулы, но и заменяет содержимое формулы результатом!
Я подтвердил, что проблема возникает с различными моими пользователями, все из которых используют современные версии Excel.
Я пробовал вызывать Calculate()
в основном приложении, принадлежащем Excel, и в фоновом режиме, но оба ведут себя одинаково. Я пробовал разные методы расчета (например, CalculateFull()
), но это то же самое. Я также пробовал другие действия взаимодействия, такие как xlApp.StatusBar = "Test"
, и они не прерывают действия пользователя, как Calculate
.
Могу ли я что-нибудь сделать, чтобы предотвратить прерывание работы пользователя таким образом? Я мог бы поклясться, что это не было поведением в старых версиях Excel.
Если это имеет значение, я использую библиотеку Excel-Dna в качестве основы для моей надстройки, но я просто использую Microsoft.Office.Interop.Excel.Application
для этой части.
Обновление с еще большей странностью:
Я добился небольшого успеха, используя метод, описанный здесь , чтобы проверить, могу ли я установить Application.Interactive
на false
, а затем обратно на true
- если нет, пользователь редактирует ячейку. Это позволяет мне пропустить Calculate
в тех случаях, когда они находятся в редакторе формул, но, как ни странно, не мешает Excel выбивать пользователя из других вводов.
Например, если пользователь:
- Редактирование имени листа
- Назначение имени именованного диапазона ячейке
- Ввод нового имени шрифта в поле ленты "Шрифт"
- и т.д ...
- Пользователь вылетает из всех этих действий при вызове app.Calculate()
, а обычные методы определения, редактируют ли они формулу, не обнаруживают, когда пользователь выполняет какие-либо из этих действий .--
Обновление re: Application.Interactive
Оказывается, настройка Application.Interactive = True
вызывает еще больше проблем с прерыванием работы пользователя, таких как выделение фокуса из диалогов и прерывание операций перетаскивания мышью (таких как изменение размера или перемещение окон). Не рекомендуется в качестве решения, если ваша цель - не раздражать пользователей.