2012-02-22 68 views
1

我使用NamedRanges来存储我的Excel工作表的“视图”。 因此,当用户选择一个视图时,它将获取该视图的NamedRange(一组行),然后它将隐藏这些行。然而,看来当NamedRange实际范围变得太大我得到一个COM异常,每当我试图指RefersToRange物业当范围很大时,VSTO 4&C#NamedRange.RefersToRange抛出Com异常

“(ViewRange).RefersToRange”扔 类型的异常“ System.Runtime.InteropServices.COMException”

最有意思的是,我可以在Excel中选择NamedRange,它会突出显示整个范围就好了,也喜欢.RefersTo其他属性.RefersToR1C1回报很好。

我创建了NamedRange,首先用所有行创建一个Range,然后给它命名。

这里是什么是RefersToR1C1当我收到COM返回错误的例子

“= 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:R 444 ,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 

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

UPDATE !!!

好吧所以这并不回答原来的问题,这就是为什么我编辑而不是回答。如果有信誉良好的“Stack Overflowers”,请告诉我是否应该回答。

我想出了一种方法来访问有问题的范围,这确实解决了我的直接问题。最后我用下面的代码行

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

感谢, 皮特

+0

老兄,如果这是解决方案,它解决了你的问题,你可以请把它标记为答案。这样可以避免其他人浪费时间来解决已经解决的问题。顺便说一句+1 – 2012-03-16 00:02:16

+0

我也有这个。接受的答案是非常令人不满意的答案,因为它使RefersToRange毫无意义。如果您检查NamedRange.Name它也是空的,这似乎发生在范围内发生更改时 – 2015-08-06 13:36:27

回答

1

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

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