【问题标题】:VSTO 4 & C# NamedRange.RefersToRange throws Com Exception when range is largeVSTO 4 & C# NamedRange.RefersToRange 当范围很大时抛出 Com 异常
【发布时间】:2012-04-19 03:10:36
【问题描述】:

我正在使用 NamedRanges 来存储我的 Excel 工作表的“视图”。 因此,当用户选择一个视图时,它将获取该视图的 NamedRange(行集合),然后隐藏这些行。但是,似乎当 NamedRange 中的实际范围变得太大时,每当我尝试引用 RefersToRange 属性时,我都会收到 COM 异常

'(ViewRange).RefersToRange' 抛出类型异常 'System.Runtime.InteropServices.COMException'

真正有趣的部分是我可以在 Excel 中选择 NamedRange,它会很好地突出显示整个范围,其他属性如 .RefersTo.RefersToR1C1 也会返回很好。

我通过首先创建一个包含所有行的 Range,然后命名它来创建 NamedRange。

这是当我收到 COM 错误时 RefersToR1C1 返回的示例

"=Sheet1!R13:R23,Sheet1!R26:R39,Sheet1!R41,Sheet1!R43:R46,Sheet1!R48:R49,Sheet1!R51:R72,Sheet1!R76:R78,Sheet1!R83:R84 ,Sheet1!R137:R147,Sheet1!R150:R163,Sheet1!R165,Sheet1!R167:R170,Sheet1!R172:R173,Sheet1!R175:R196,Sheet1!R200:R202,Sheet1!R207:R208,Sheet1!R261 :R271,Sheet1!R274:R287,Sheet1!R289,Sheet1!R291:R294,Sheet1!R296:R297,Sheet1!R299:R320,Sheet1!R324:R326,Sheet1!R331:R332,Sheet1!R385:R395,Sheet1 !R398:R411,Sheet1!R413,Sheet1!R415:R418,Sheet1!R420:R421,Sheet1!R423:R444,Sheet1!R448:R450,Sheet1!R455:R456"

这是我遇到问题的代码

 Excel.Range rngAll = _Blocks.DataRange;
 rngAll.EntireRow.Hidden = false;
 Excel.Name ViewRange = Globals.ThisWorkbook.Names.Item(viewName, System.Type.Missing);

 string addy = ViewRange.RefersToR1C1 as string;   //this line works fine
 ViewRange.RefersToRange.EntireRow.Hidden = true;  //this line throws the COM Exception

任何帮助将不胜感激,或者如果您有更好的方法来完成我的“视图”,或者有没有办法甚至使用上面的公式地址来实例化一个我可以隐藏的范围?

更新!!!

好的,所以这不能回答原始问题,这就是我编辑而不是回答的原因。如果这里有信誉良好的“Stack Overflowers”,请告诉我是否应该回答。

我确实找到了一种访问相关范围的方法,这确实解决了我的直接问题。我最终使用了以下代码行

Globals.Sheet1.InnerObject.get_Range(viewName, System.Type.Missing).EntireRow.Hidden = true;

谢谢, 皮特

【问题讨论】:

  • 老兄,如果这是解决方案并且解决了您的问题,您能否将其标记为答案。这将节省其他人浪费时间尝试解决已经解决的问题。顺便说一句 +1
  • 我也有这个。接受的答案是一个非常不令人满意的答案,因为它使 RefersToRange 毫无意义。如果您检查 NamedRange.Name 它也为空,这似乎发生在范围发生更改时发生

标签: c# visual-studio-2010 excel vsto


【解决方案1】:

仍然不知道为什么会失败,但可行的解决方案是通过 Worksheet 的 get_Range() 方法访问名称范围。

Globals.Sheet1.InnerObject.get_Range(viewName, System.Type.Missing).EntireRow.Hidden = true; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2013-09-10
    • 2019-05-02
    • 2014-03-06
    • 2013-09-28
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多