Запись в ячейку включает функцию ScreenUpdating в моей надстройке VSTO.

У меня странная проблема, когда Excel ведет себя по-разному на моей машине для разработки и на машине для тестирования.

В моей надстройке я отключил ScreenUpdating в нескольких местах для длительных процессов. На моей машине это работает нормально. На тестовой машине Excel устанавливает ScreenUpdating = true, как только я пишу в ячейку.

Следующий код демонстрирует проблему для меня.

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    Microsoft.Office.Interop.Excel.Application excel = Globals.ThisAddIn.Application;

    MessageBox.Show(excel.ScreenUpdating.ToString());

    excel.ScreenUpdating = false;
    MessageBox.Show(excel.ScreenUpdating.ToString());

    Workbook workbook = Globals.ThisAddIn.Application.ActiveWorkbook;
    Worksheet w = (Worksheet)workbook.Worksheets[1];
    ((Range)w.Cells[1, 1]).Value = "Test";
    MessageBox.Show(excel.ScreenUpdating.ToString());
}

На моей машине открытие Excel дает три окна сообщений, в которых говорится:

«Правда», «Ложь», «Ложь».

На тестовой машине говорят

«Правда», «Ложь» и «Правда».

Я также прошел через удаленный отладчик и наблюдал, как свойство ScreenUpdating изменяется сразу после установки значения ячейки. Кроме того, это не единственное, что сбрасывает ScreenUpdating. Добавление или удаление рабочего листа или рабочей книги также сделает это.

Версия Excel в каждой системе одинакова (14.0.6112.5000 (32-разрядная версия)).

Что может быть причиной этого? Как я могу это исправить, чтобы Excel учитывал мои настройки?


person Kris Harper    schedule 11.06.2012    source источник
comment
Есть ли на тестовой машине какие-либо другие xla или надстройки в папке XLStart?   -  person Kiru    schedule 11.06.2012
comment
@Киру Да. Установлена ​​надстройка Bloomberg. На самом деле, его отключение, кажется, решает проблему, а повторное включение возвращает ее. Думаю, мне нужно поговорить с Блумбергом.   -  person Kris Harper    schedule 11.06.2012


Ответы (3)


Другие надстройки в Excel могут мешать этому единственному глобальному параметру.

Именно по этой причине вы должны сохранять текущее состояние ScreenUpdating в локальной переменной до и восстанавливать его после каждого использования.

Игнорируйте изменение этого параметра в событии ThisAddIn_Startup (поскольку вы в любом случае не выполняете там свою работу).

person Gone Coding    schedule 11.06.2012
comment
Переменная ScreenUpdating сбрасывается каждый раз, когда я вношу изменения. Код, который я разместил, был просто примером. На практике, независимо от того, где я его установил, как только я пишу в ячейку, он возвращается к истине. - person Kris Harper; 11.06.2012
comment
Понял: в этом случае другая надстройка перехватывает событие изменения ячейки и сбрасывает ScreenUpdating на true (что является ошибкой в ​​​​другой надстройке). Предложите удалить другую надстройку или заменить ее, если это возможно. - person Gone Coding; 11.06.2012
comment
Я думаю, вы правы. Я не могу удалить его, потому что это важная для бизнеса надстройка. Но я могу поговорить с людьми, которые это сделали, и узнать, знают ли они что-нибудь об этом. - person Kris Harper; 11.06.2012
comment
Это обычный результат, когда другие кодеры не следуют приведенному выше правилу о восстановлении предыдущего состояния. Скорее всего, они устанавливают значение false, выполняют некоторую обработку, а затем устанавливают значение true независимо от предыдущего состояния. Любители! :) Удачи с исправлением. - person Gone Coding; 11.06.2012

Я испытываю ту же проблему, когда ScreenUpdating (и другие настройки) сбрасываются в true надстройкой Bloomberg с надстройкой VSTO. Их поддержка работает над решением, но в то же время следующее решение работает нормально:

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

Вот пример кода в VB.NET для скрытия листа:

' Create a book with a single worksheet
Dim Book As Excel.Workbook
Book = Globals.ThisAddIn.Application.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet)


'% Create sheet variable
Dim Sheet As Excel.Worksheet
Sheet =  TryCast(Book.ActiveSheet, Excel.Worksheet)

' Visible
Sheet.Visible = Excel.XlSheetVisibility.xlSheetVisible

' Hidden but user able to show
Sheet.Visible = Excel.XlSheetVisibility.xlSheetHidden

' Hidden for user as well
Sheet.Visible = Excel.XlSheetVisibility.xlSheetVeryHidden
person Fredrik R    schedule 20.11.2012
comment
Прохладный. Я не знал об этом. Спасибо. Какой код скрывает рабочий лист? - person Kris Harper; 21.11.2012

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

person JHixson    schedule 11.06.2013