“无法设置Window类的FreezePanes属性”Excel 2016(office 365)

我已经build立了一个excel插件,用数据库中的数据填充工作表。 我还添加了一些样式,并使用FreezePaneslocking了一些行和列。

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

这一切都像在2010/2013年Excel的魅力,但我最近切换到Excel 2016(办公室365),从那时起,我的问题与FreezePanes时,我的Excel工作表不在前台。 我search了互联网,我遇到的唯一的事情是,我只能在活动工作表上执行FreezePanes,我知道 – 我已经在设置FreezePanes之前激活了工作表。 这工作在Excel 2010,即使身体上我的Excel没有发送到前台。

来自office 365的Excel可能真的希望我的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(内部版本7571.2109)

是否有可能在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#更好地工作。

有没有可能worksheet.Application.ActiveWindow不是包含您的活动工作表的窗口? 在以前的Excel版本中,所有工作簿都具有相同的窗口,但是由于Microsoft删除了MDI for Excel,因此可能会突然有两个不同的窗口使用与以前相同的代码。 混合这些窗口可能会导致你遇到的问题。

自Excel 2013以来,请参阅此链接以进行一些更改: https : //msdn.microsoft.com/en-us/library/office/dn251093.aspx

另一件你可以尝试的是在调用FreezePane之前将窗口状态设置为normal:

 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提交错误报告,然后等待他们是否可以确认这是一个错误。

是! 我修正了这个像Xatoobuild议添加:

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

补充一点,这个解决scheme只有在窗口最小化的情况下才起作用,所以你需要检查这个是非常重要的。

有趣的细节是,这仍然不会把窗口发送到前台。