2010-07-20 97 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; 
     } 
    }