如何find一个单元格命名的范围 – VSTO

我用C#和VSTO生成了一系列的行。 我已经基本上加载了几行数据,并给每个单元一个NamedRange。 我的问题是,我知道开始行和结束行索引,遍历每个单元格,并检索它的NamedRange。 我试过Excel.Range范围=(Excel.Range)m_worksheet.Cells [x,y]; 它获得的范围很好,但是当我做一个range.Name.ToString(); 我得到“System .__ COM ….”而不是名称。 任何人都可以协助

谢谢

下面是示例代码( 从这里取 )如何在Excel中迭代命名范围。

private Excel.Workbook m_workbook; object missing = Type.Missing; public void testNamedRangeFind() { m_workbook = Globals.ThisAddIn.Application.ActiveWorkbook; int i = m_workbook.Names.Count; string address = ""; string sheetName = ""; if (i != 0) { foreach (Excel.Name name in m_workbook.Names) { string value = name.Value; //Sheet and Cell eg =Sheet1!$A$1 or =#REF!#REF! if refers to nothing string linkName = name.Name; //gives the name of the link eg sales if (value != "=#REF!#REF!") { address = name.RefersToRange.Cells.get_Address(true, true, Excel.XlReferenceStyle.xlA1, missing, missing); sheetName = name.RefersToRange.Cells.Worksheet.Name; } Debug.WriteLine("" + value + ", " + linkName + " ," + address + ", " + sheetName); } } } 

我知道这个吸盘是旧的,但我只是需要这个答案,所以现在我有它我会分享:当你build立你的命名范围,你想处理他们的改变事件,在这个处理程序,你需要这样的代码:

 foreach (Excel.Name name in Globals.ThisWorkbook.Name) { if (Application.Intersect(name.RefersToRange, Target) != Null) //Target is the single parameter of our handler delegate type. { // FOUND IT!!!! } } 

Application.Intersect确定2个范围的交集,如果找不到则返回null。

我用了一个演员:

  ((Excel.Name)target.Name).Name 

其中“target”是一个Microsoft.Office.Interop.Excel.Range; 该名称包括该表的名称。

我试过这样的方式:如果单元格是第一个工作表的一部分,但当我点击其他工作表中的单元格,并使用函数给我从HRESULTexception:0x800A03EC错误

我的代码是这样的:

 Microsoft.Office.Interop.Excel.Workbook _workbook = Globals.ThisAddIn.Excel.CurrentWorkbook.InteropReference; Microsoft.Office.Interop.Excel.Range Target = (Microsoft.Office.Interop.Excel.Range)Globals.ThisAddIn.Application.ActiveCell; foreach (Microsoft.Office.Interop.Excel.Name name in _workbook.Names) { Microsoft.Office.Interop.Excel.Range intersectRange = Globals.ThisAddIn.Excel.CurrentWorkbook.InteropReference.Application.Intersect(Target, name.RefersToRange); if (intersectRange != null) { rangeName = name.Name; break; } } 

您需要通过名称集合来查找指定的范围

这对我有效

  var ranges = activeworkBook.Names; int i = 1; while (i <= ranges.Count) { String currentName = ranges.Item(i, Missing.Value, Missing.Value).Name; if (currentName.Equals(namedRangeToBeDeleted)) { ranges.Item(i, Type.Missing, Type.Missing).Delete(); } else { i++; } } 

从这里取得了参考资料,并将参考文献replace为实际的单元格地址。

上面的示例使用m_workbook.Names。 在我的情况下,我需要在特定的工作表(ActiveWorksheet)上find命名范围。 但是,这似乎并不奏效:名称列表仍为空。 当使用工作簿来访问指定的范围时,它工作。 (VS 2015,Office 2016)