Определите, находится ли всплывающее окно на переднем плане Excel

Я пишу надстройку VSTO для Excel и заметил, что если я блокирую лист и защищаю его паролем (так что только моя надстройка может писать в него, но пользователь может его просматривать), если пользователь пытается редактировать лист они получают всплывающее окно «Этот лист заблокирован». Если, пока это приглашение все еще ожидает ввода данных пользователем, надстройка пытается выполнить запись на лист, Excel аварийно завершает работу. Акт записи на лист включает в себя снятие защиты, запись данных, а затем снова блокировку. Надстройка собирает данные из внешнего источника через последовательный порт, поэтому данные можно записать в любое время.

Чтобы воссоздать: 1. Заблокируйте лист с надстройкой. 2. Пользователь пытается изменить содержимое листа. 3. Пользователю предлагается, что он не может редактировать содержимое листа, поскольку он заблокирован. 4. Данные поступают через последовательный порт, и надстройка пытается разблокировать, записать данные и заблокировать лист до того, как пользователь сможет подтвердить выданное приглашение. 5. Excel сметает пыль.

Какие-либо предложения? Я играл с идеей сохранения скрытого «главного» листа и видимого листа и просто использовал формулу Excel или именованный диапазон для ссылки на скрытый лист. Однако тогда это будет открыто для редактирования и потенциального повреждения данных пользователем. Данные должны быть максимально нередактируемыми.

Обновление: я был бы доволен перехватом COMException, чтобы он не убивал excel, однако общий «вылов (Exception ex)», похоже, не помогает.


person Pete Garafano    schedule 28.12.2011    source источник


Ответы (4)


В VBA вы можете защитить лист с помощью UserInterFaceOnly:=True. Это означает, что код все еще может писать на лист. По этой ссылке похоже, что это верно и для надстройки VSTO.

person Doug Glancy    schedule 29.12.2011
comment
Я уже устанавливал UserInterFaceOnly = true, однако, если пользователь все еще пытался каким-либо образом отредактировать форму, он выдает окно с ошибкой, в котором пользователь должен щелкнуть OK, прежде чем мой код сможет продолжить выполнение, не вызывая COMException. - person Pete Garafano; 29.12.2011

Вы можете установить флажок, чтобы убедиться, что лист находится в интерактивном режиме или активная ячейка не равна нулю, если проверка не удалась, функция выхода, которая выполняет операцию записи

 private bool IsExcelInteractive()
    {
        try
        {
            Globals.ThisAddIn.Application.Interactive = Globals.ThisAddIn.Application.Interactive;
            return true;
        }
        catch
        {
            return false;
        }
    }
person Brijesh Mishra    schedule 29.12.2011

Дело было видимо

catch(Exception)

не работает как общий улавливатель, когда дело доходит до COMException. Добавление строки

using System.Runtime.InteropServices;

а затем добавление

catch(COMException)

мои блоки try...catch позволяют мне лучше справляться с ошибками. Смешайте это с некоторым кодом, чтобы повторить неудачное действие несколько раз после использования.

SendKeys.SendWait("{ESC}");

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

person Pete Garafano    schedule 29.12.2011

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

person Brijesh Mishra    schedule 30.12.2011
comment
Проблема в том, что я выполняю задачи в фоновом режиме без вмешательства пользователя. Он обрабатывает данные, поступающие в последовательный порт. Данные не планируются, поэтому, если пользователь взаимодействует с Excel, например. имеет ячейку, открытую для редактирования (или пытается сделать это, но не может, так как ячейки заблокированы) и надстройка VSTO пытается взаимодействовать с Excel, надстройка терпит неудачу в пользу пользователя. Смотрите мой ответ для трюка, который я придумал, чтобы решить эту проблему. - person Pete Garafano; 04.01.2012