2017-01-16 2 views
4

Я построил excel addin, который заполняет рабочий лист данными из базы данных. Я также добавляю некоторый стиль и блокирую некоторые строки и столбцы с помощью FreezePanes.«Невозможно установить свойство FreezePanes класса Window» Excel 2016 (офис 365)

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

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

Excel из офиса 365, вероятно, на самом деле хочу, чтобы мой первенствует рабочий лист, чтобы быть физически на переднем плане, но 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); 

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

Чтобы был ясен: версия моих Эксел 2016 Version 1611 (Build 7571,2109)

+0

Может быть, это глупый вопрос, но как вы определяете и устанавливаете 'рабочий лист' в первом блоке? –

+0

В начале моего процесса я записываю текущий рабочий лист следующим образом: 'Excel.Application.ActiveSheet'. Во время процесса может случиться так, что этот WorkSheet больше не является активным. По какой-то странной причине лист более или менее активен, когда я его активирую, но он не отправляется на передний план, а FreezePanes терпит неудачу ... – DeniseMeander

ответ

0

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

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

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

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

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#.

+0

Это то, что я делаю на C#, и я не программирую в VBA, так что это не Я боюсь. Сожалею. – DeniseMeander

1

Возможно ли, что 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 и ждать, чтобы увидеть ли они могут подтвердите это как ошибку.

+0

Спасибо за ваш ответ; ваше первое утверждение, я делаю то, что делаю все на одном и том же объекте, так что это не проблема. Второй, я попробую, я дам вам знать. И третий тоже хороший! Я даже нашел элемент обратной связи: https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/17837602-setting-freezepanes-using-c-raises-error-when-wor Пожалуйста, все голосуют за этого !!! :-D – DeniseMeander

Смежные вопросы