"Не удалось установить свойство FreezePanes класса окна" Excel 2016 (office 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 (office 365), и с тех пор у меня были проблемы с FreezePanes, когда мой лист excel не находится на переднем плане. Я искал в интернете, и единственное, с чем я сталкиваюсь, это то, что я могу только преформировать FreezePanes на активный лист, я знал это - я уже активировал лист перед установкой морозильных камер. Это работало в excel 2010, хотя физически мой excel не был отправлен на передний план.

Excel из office 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 Версия 1611 (Build 7571.2109)

4 ответов


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

см. эту ссылку для некоторых изменений с Excel Две тысячи тринадцать: 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 и подождать, чтобы увидеть, могут ли они подтвердить это как ошибку.


есть ли возможность сделать это в 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#.


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

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

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

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


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

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