如何找到单元格的命名范围 - VSTO

时间:2009-11-19 16:15:27

标签: c# excel vsto

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

由于

7 个答案:

答案 0 :(得分:8)

以下是示例代码(take from here)如何在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 e.g. =Sheet1!$A$1 or =#REF!#REF! if refers to nothing
                string linkName = name.Name;
                //gives the name of the link e.g. 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);
            }
        }

    }

答案 1 :(得分:2)

我知道这个傻瓜已经老了,但我只需要这个答案,所以现在我已经拥有它了,我将分享: 当你构建命名范围时,你想要处理他们的Change事件,在那个处理程序中你需要一些像这样的代码:

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。

答案 2 :(得分:1)

我使用演员:

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

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

答案 3 :(得分:1)

我试过这种方式:如果单元格是第一张纸的一部分,则工作,但是当我点击其他工作表中的单元格并使用该功能时,我会从


错误出现:0x800A03EC错误 < / p>

我的代码是这样的:

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;
                }
            }

答案 4 :(得分:0)

您需要遍历Names集合才能找到namedrange

答案 5 :(得分:0)

这对我有用

        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++;
            }
        }

here获取引用并替换了refereTo,因为它提供了实际的单元格地址。

答案 6 :(得分:0)

上面的示例使用m_workbook.Names。在我的情况下,我需要在特定的工作表(ActiveWorksheet)上找到命名范围。但是,这似乎不起作用:名称列表仍然是空的。使用工作簿访问命名范围时,它可以正常工作。 (VS 2015,Office 2016)

相关问题