我在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();
}
}
有谁能在这里暗示我做错了什么?或许我错过了一步?
答案 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或模块中,然后直接直接调用它,就会简单得多。