如何删除Excel.Name对象?

时间:2010-07-20 19:44:52

标签: c# .net-3.5 vsto excel-2007 excel-2003

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

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

有谁能在这里暗示我做错了什么?或许我错过了一步?

4 个答案:

答案 0 :(得分:2)

使用名称删除:

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

(在C#中)。

答案 1 :(得分:1)

试试Workbook.Names[i].Delete()。您无法使用currentName.Delete。 (从内存中,我将尝试找到我的代码来执行此操作。)

答案 2 :(得分:0)

答案 3 :(得分:0)

我只是将其设置为VBA函数,然后从C#中调用它:

VBA (如果您只想删除引用错误,则可以取消注释一行):

Sub DeleteNamedRanges()
   Dim nm As Object
   Dim mystr As String

   For Each nm In ThisWorkbook.Names
      On Error Resume Next
      'If InStr(1, nm.RefersTo, "#REF!") Then
      nm.Delete
      On Error GoTo 0
   Next
End Sub

C#:

XlApp.Application.Run($"'{fileName}'!{yourWorksheet.CodeName}.DeleteNamedRanges");

关于C#,在我的情况下,我将VBA放入特定工作表的代码中,因为我正在将该工作表复制到其他工作簿中,并且希望在这些工作簿中可以访问它,所以我必须调用完全限定的路径VBA方法。如果您不需要这样的东西,只需将VBA代码放入ThisWorkbook或模块中,然后直接直接调用它,就会简单得多。