【问题标题】:Excel Interop COMException HRESULT: 0x800A03EC when accessing hidden cellExcel 互操作 COMException HRESULT:访问隐藏单元格时出现 0x800A03EC
【发布时间】:2023-03-12 07:26:01
【问题描述】:

当单元格被隐藏时,我在使用 Excel Interop 从 C# 访问 Excel 中的命名单元格时遇到问题,我像这样访问它:

bool SomeBoolean = WorkSheet.Range["MyRangeName"].Value;

当我访问 Range 属性时,它会隐式调用 get_range,这就是根据堆栈跟踪引发异常的原因。之前直接调用get_range的代码,结果也差不多。

如果我取消隐藏单元格,它可以正常工作。如果我逐行执行代码,它可以正常工作(这总是令人沮丧的情况)。

当然我可以通过取消隐藏单元格来解决这个问题,但我想尝试找到一个更优雅的解决方案。我已经仔细研究了 MSDN 文档和 SO 上的几个线程,但我似乎找不到任何东西。任何帮助将不胜感激!

Worksheet.Range 的 MSDN 页面:https://msdn.microsoft.com/en-us/library/office/ff836512.aspx

【问题讨论】:

  • 我不能重复这个问题。我知道我过去曾访问过隐藏范围——Interop(或 VBA)似乎从不在乎。恰恰相反,我必须竭尽全力避免隐藏范围。我将此作为测试运行,但我真的无法让它抛出该错误。您可以将电子表格(或其相关部分)上传到 DropBox 或类似的东西吗?我非常好奇。

标签: c# .net excel excel-interop


【解决方案1】:

这是设计使然。根据定义,隐藏单元格是不可访问的。

自己试试吧。在 Excel 中创建一个工作表,隐藏一些列,然后搜索(按值,而不是公式)隐藏单元格中的值。您将看到一个对话框,指示找不到该值。

如果您不同意这种行为,请与 Microsoft 接洽。

【讨论】:

  • 感谢您的回复,丹。我尝试了您的建议,并看到了与您相同的消息。我正在使用的代码是对我们继承的旧 VBA 插件(一个 XLAM 文件)的 .Net 重写。棘手的是这个 VBA 插件在访问隐藏单元格值时没有问题,这让我很困惑。如果它永远无法访问,这是有道理的,这是设计使然,我不应该能够使用 C# 访问它。但是为什么 VBA 可以工作呢?我对 Excel 编程不是很有经验,所以也许我在这里遗漏了一些东西......
  • 嗯,不调试它或检查互操作程序集我不确定。如果它是我的应用程序,我会在获得它们的值之前简单地取消隐藏单元格。使用 Office 互操作很少是优雅的。另一种解决方案可能是使用像 EPPlus 这样的第三方库,但我不确定你的宏是做什么的。
【解决方案2】:

感谢大家帮助我解开这个谜团。在我的调试过程中,我注意到它有时会神秘地起作用,而有时则不会,于是我检查了导致问题所在行的代码。

此问题的原因是正在从一个工作表中搜索范围,该工作表在调用插件时设置为当前选定的工作表。因此,如果在调用时未选择工作簿中的正确选项卡,则会失败。如果它被选中,它会成功。事实证明,这与隐藏的单元格无关。相当令人沮丧,但至少现在我们知道了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    相关资源
    最近更新 更多