«Невозможно установить свойство FreezePanes класса Window« Excel 2016 (офис 365)

Я построил excel addin, который заполняет рабочий лист данными из базы данных. Я также добавляю некоторый стиль и блокирую некоторые строки и столбцы с помощью FreezePanes.

worksheet.Activate();
worksheet.Application.ActiveWindow.FreezePanes = false;
worksheet.Application.ActiveWindow.SplitRow = 4;
worksheet.Application.ActiveWindow.SplitColumn = 11;
worksheet.Application.ActiveWindow.FreezePanes = true;

Все это работало как прелесть в excel 2010/2013, но я недавно переключился на excel 2016 (офис 365), а с тех пор у меня были проблемы с FreezePanes, когда мой рабочий лист excel не был на переднем плане. Я обыскал в Интернете, и единственное, с чем я столкнулся, это то, что я могу только заготовку FreezePanes на активном листе, я знал, что - я уже активировал лист перед установкой FreezePanes. Это работало в excel 2010, хотя физически мой excel не был отправлен на передний план.

Excel из офиса 365, вероятно, действительно хочет, чтобы моя рабочая таблица excel была физически на переднем плане, но worksheet.Activate()не помогла, и я также попробовал следующий код:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);    

[DllImport("user32.dll", SetLastError = true)]
static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName); 

string caption = oExcel.Caption;
IntPtr handler = FindWindow(null, caption);
SetForegroundWindow(handler);

Но это тоже не сработало. Может ли кто-нибудь помочь мне с этим?

Быть ясным: версия моего excel - версия 2016 (версия 7571.2109)

c#,excel,office365,excel-2016,

6

Ответов: 4


3
+50

Возможно ли, что worksheet.Application.ActiveWindowэто не окно, которое содержит ваш активный рабочий лист? В предыдущих версиях Excel все книги имели одно и то же окно, но поскольку Microsoft потеряла MDI для Excel, у вас могут появиться два разных окна с использованием того же кода, что и раньше. Смешивание этих окон может привести к проблеме, с которой вы сталкиваетесь.

См. Эту ссылку для некоторых изменений, начиная с Excel 2013: https://msdn.microsoft.com/en-us/library/office/dn251093.aspx

Еще одна вещь, которую вы можете попробовать - это установить состояние окна в нормальное состояние, прежде чем вызывать FreezePane:

Worksheet.Application.ActiveWindow.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlNormal;

И еще одна возможность заключается в том, что на самом деле это ошибка в Excel. Я нашел кого-то другого, у которого была такая же проблема, но неясно, решил ли этот человек проблему или заполнил отчет об ошибке:

https://social.msdn.microsoft.com/Forums/office/en-US/7e6ff1ed-b4c6-4c75-82be-14175f44df55/freezepanes-throws-an-exception-when-excel-is-minimized?forum=exceldev

Вы можете отправить отчет об ошибке в Microsoft и дождаться, смогут ли они подтвердить это как ошибку.


2

Возможно ли это сделать в VBA?

Worksheets("Sheet1").Activate 
ActiveWindow.FreezePanes = False
ActiveWindow.SplitRow = 4
ActiveWindow.SplitColumn = 11
ActiveWindow.FreezePanes = True

Если вы хотите проверить, действительно ли лист активен, вы можете:

Private Sub Worksheet_Activate() 
 [method that makes stuff happen]
End Sub

В документации MSDN было бы похоже, что надстройки VBA работают лучше с 2013/365, чем с C #.


2 принят

Да! Я исправил это, как предложил Xatoo, добавив:

Worksheet.Application.ActiveWindow.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlNormal;

Важно добавить, что это решение работает только тогда, когда на самом деле окно минимизировано, поэтому вам нужно проверить это.

Забавная деталь заключается в том, что это все еще не отправляет окно на передний план.


1

Вы можете установить xlMaximized для лучшей практики. Поскольку xlNormal может одинаково xlMinimized, так что снова получите ошибку.

Worksheet.Application.ActiveWindow.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;
C #, первенствует, Office365, первенствует-2016,
Похожие вопросы