我正在使用 NamedRanges 来存储 Excel 工作表的“ View ”。 因此,当用户选择一个 View 时,它将获取该 View 的 NamedRange(行的集合),然后隐藏这些行。但是,当 NamedRange 中的实际范围变得太大时,每当我尝试引用 RefersToRange 属性时,我都会收到 COM 异常
'(ViewRange).RefersToRange' threw an exception of type 'System.Runtime.InteropServices.COMException'
真正有趣的部分是,我可以在 Excel 中选择 NamedRange,它会很好地突出显示整个范围,还有其他属性,例如 .RefersTo 和 .RefersToR1C1 返回很好。
我通过首先创建包含所有行的范围,然后为其命名来创建 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
任何帮助将不胜感激,或者如果您有更好的方法来完成我的“ View ”,或者有没有办法甚至使用上面的公式地址来实例化一个我可以隐藏的范围?
更新!!!
好吧,所以这并没有回答原来的问题,这就是我编辑而不是回答的原因。如果这里有信誉良好的“Stack Overflowers”,请告诉我是否应该回答。
我确实找到了一种访问相关范围的方法,这确实解决了我眼前的问题。我最终使用了以下代码行
Globals.Sheet1.InnerObject.get_Range(viewName, System.Type.Missing).EntireRow.Hidden = true;
谢谢, 皮特
最佳答案
仍然不知道为什么会失败,但有效的解决方案是通过工作表的 get_Range() 方法访问名称范围。
Globals.Sheet1.InnerObject.get_Range(viewName, System.Type.Missing).EntireRow.Hidden = true;
关于c# - 当范围很大时,VSTO 4 & C# NamedRange.RefersToRange 抛出 Com 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9404297/