Определите, находится ли Popup на переднем плане Excel - PullRequest
2 голосов
/ 29 декабря 2011

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

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

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

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

Ответы [ 4 ]

1 голос
/ 30 декабря 2011

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

1 голос
/ 29 декабря 2011

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

 private bool IsExcelInteractive()
    {
        try
        {
            Globals.ThisAddIn.Application.Interactive = Globals.ThisAddIn.Application.Interactive;
            return true;
        }
        catch
        {
            return false;
        }
    }
1 голос
/ 30 декабря 2011

Проблема, по-видимому,

catch(Exception)

не функционирует как общая проблема, когда дело доходит до COMException.Добавление строки

using System.Runtime.InteropServices;

и добавление

catch(COMException)

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

SendKeys.SendWait("{ESC}");

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

1 голос
/ 29 декабря 2011

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

...