【问题标题】:How to find the named range of a cell - VSTO如何找到单元格的命名范围 - VSTO
【发布时间】:2018-04-21 14:14:04
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c# excel vsto


    【解决方案1】:

    这里是示例代码 (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);
                }
            }
    
        }
    

    【讨论】:

      【解决方案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。

      【讨论】:

        【解决方案3】:

        我使用了演员表:

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

        其中“目标”是 Microsoft.Office.Interop.Excel.Range;名称包括工作表的名称。

        【讨论】:

          【解决方案4】:

          我尝试过这种方式:如果单元格是第一张工作表的一部分,则可以工作,但是当我单击其他工作表中的单元格并使用该功能时,我会得到 HRESULT 异常: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;
                          }
                      }
          

          【讨论】:

            【解决方案5】:

            您需要遍历 Names 集合来查找命名范围

            【讨论】:

              【解决方案6】:

              这对我有用

                      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,因为它提供了实际的单元格地址。

              【讨论】:

                【解决方案7】:

                上面的示例使用 m_workbook.Names。就我而言,我需要在特定工作表(ActiveWorksheet)上找到命名范围。但是,这似乎不起作用:名称列表仍然为空。使用工作簿访问命名范围时,它确实有效。 (VS 2015,Office 2016)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-02-03
                  • 2011-01-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-30
                  • 2022-01-24
                  相关资源
                  最近更新 更多