2010-07-20 83 views
1

我有一堆包含无效引用的Workbook.Names集合下的Excel.Name对象。换句话说,当我评估Excel.Name.RefersTo属性时,我得到一个以“=#REF ...”开头的值。我试图运行下面的代码,但它似乎有在去除名没有影响:如何删除Excel.Name对象?

var ranges = myWorkBook.Names; 
for (int i = 1; i <= ranges.Count; i++) 
{ 
    var currentName = ranges.Item(i, Type.Missing, Type.Missing); 
    var refersTo = currentName.RefersTo.ToString(); 
    if (refersTo.Contains("REF!")) 
    { 
     currentName.Delete(); 
    } 
} 

任何人都可以提出什么,我做错了什么?或者我错过了一步?

回答

0

AMissico带领我走向正确的方向。 currentName.Delete()绝对不行。然而,没有Workbook.Names [i]的支持。在VSTO 2005 SE下删除,所以我挖了一些,发现Workbook.Names.Item(i, Type.Missing, Type.Missing)做了伎俩。

这是代码的一个例子,将工作:

var ranges = myWorkBook.Names; 

int i = 1; 
while (i <= ranges.Count) 
{ 
    var currentName = ranges.Item(i, Type.Missing, Type.Missing); 
    var refersTo = currentName.RefersTo.ToString(); 
    if (refersTo.Contains("REF!")) 
    { 
     ranges.Item(i, Type.Missing, Type.Missing).Delete(); 
    } 
    else 
    { 
     i++; 
    } 
} 
+0

刚刚测试过这个。它可以工作,但请注意,如果您为工作簿和工作表命名的范围相同,则在工作簿范围名称索引上调用delete将删除工作表范围的名称。我还没有找到一种解决方法,除了首先删除工作表范围。 – TheAtomicOption 2017-10-04 21:37:30

1

尝试Workbook.Names[i].Delete()。您不能使用currentName.Delete。 (从内存中,我会尽力找到我的代码来做到这一点。)

+0

谢谢,我会尝试,让你知道它是如何横空出世。 – code4life 2010-07-21 16:31:50

+0

最后它是Workbook.Names.Item(我,Type.Missing,Type.Missing),做了伎俩。感谢您将我指向正确的道路! – code4life 2010-07-26 01:24:02

+0

@ code4life:啊,那是对的。必须调用'Item',因为它是一个COM调用。 – AMissico 2010-07-26 17:57:33

2

要删除使用名称:

workbook.Names.Item(rangeName, Type.Missing, Type.Missing).Delete(); 

(在C#这是)。

0

我遇到了一个问题,即当您从活动工作簿中删除一堆名称时,名称集合的索引会立即更新。这可能会导致索引/索引超出范围异常。

如果你想一定要删除所有可用的名称,使用此代码:

public void finalize() 
    { 
     Microsoft.Office.Interop.Excel.Workbook myWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook; 


     var ranges = myWorkbook.Names; 
     int leftoveritems; 
     leftoveritems = ranges.Count; 

     while (leftoveritems > 0) 
     { 
      int i = 1; 
      try 
      { 
       while (i <= leftoveritems) 
       { 
        myWorkbook.Names.Item(i).Delete(); 
        //System.Windows.Forms.MessageBox.Show(i + " deleted."); 
        i++; 
       } 
      } 
      catch (Exception ex) 
      { 
       //System.Windows.Forms.MessageBox.Show(i + " failed " + ex.Message); 
      } 

      ranges = myWorkbook.Names; 
      leftoveritems = ranges.Count; 
     } 
    }