"Unable to set the FreezePanes property of the Window class" Excel 2016(办公室 365)

"Unable to set the FreezePanes property of the Window class" Excel 2016 (office 365)

我构建了一个 excel 插件,它用数据库中的数据填充作品sheet。我还添加了一些样式并使用 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),从那时起,当我的 excel worksheet 不在前台。我搜索了互联网,我唯一遇到的事情是我只能在活动 sheet 上执行 FreezePanes,我知道 - 我已经在设置 ​​FreezePanes 之前激活了 sheet。这在 excel 2010 年有效,尽管实际上我的 excel 没有被发送到前台。

来自 Office 365 的

Excel 可能真的希望我的 excel 工作 sheet 在物理上处于前台,但 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 Version 1611 (Build 7571.2109)

是否可以在 VBA 中执行此操作?

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

如果你想检查 sheet 是否真的激活,你可以这样做:

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

MSDN 文档会使 VBA add-ins 在 2013/365 上比在 C# 上工作得更好。

是否有可能 worksheet.Application.ActiveWindow 不是包含您的活动工作表的 window? 在以前的 Excel 版本中,所有工作簿都具有相同的 window,但由于 Microsoft 放弃了 Excel 的 MDI,您可能突然有两个不同的 windows 使用与以前相同的代码。将这些 windows 混在一起可能会导致您遇到问题。

查看此 link 了解自 Excel 2013 年以来的一些变化: https://msdn.microsoft.com/en-us/library/office/dn251093.aspx

您可以尝试的另一件事是在调用 FreezePane 之前将 window 状态设置为正常:

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

是的!我像 Xatoo 建议的那样通过添加修复了这个问题:

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

重要的是要补充一点,这个解决方案只有在 window 实际上被最小化时才有效,所以你需要检查一下。

有趣的是,这仍然没有将 window 发送到前台。

您可以设置 xlMaximized 以获得最佳实践。因为xlNormal可以和xlMinimized一样,所以又报错

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