Excel VBA,不使用循环删除工作簿中的所有名称

3

我正在尝试使用VBA删除Excel工作簿中的所有名称,而不使用循环。

目前我正在使用以下代码,但由于工作簿中有数千个名称,这样做非常缓慢。

如果有建议,请告诉我!

Sub deleteAllNames()
Dim xName As Name

For Each xName In Application.ActiveWorkbook.Names
       xName.Delete
Next
End Sub

删除名称,意味着删除命名区域吗? - BruceWayne
是的,命名区域(有些是命名公式,不确定是否有任何区别)。 - Charteris
3个回答

5

如果不使用一些复杂的技巧或者修改XML是不可能实现的,但是以下方法会更快:

Dim i As Long
Application.Calculation = xlCalculationManual
For i = ThisWorkbook.Names.Count To 1 Step -1
    ThisWorkbook.Names(i).Delete
Next
Application.Calculation = xlCalculationAutomatic

谢谢!这加快了速度一点(虽然还是慢,但任何改善都有帮助)。 - Charteris
@Charteris 如果真的很慢,那么我猜慢的部分不是删除名称,而是Excel将所有对名称的引用转换为范围引用。 - Slai
谢谢 - 可以关闭这个转换吗? - Charteris
我不知道有没有,但你可以将公式复制或保存为文本到一个新文件中..这将导致大量的#REF!错误。 - Slai
除了 DNR 之外,我还有表格。在这种情况下,代码由于未定义的范围而生成错误。我不得不在循环内删除操作之前添加 "on error resume next"。 - hornetbzz

2

我曾经遇到过删除所有命名区域的问题,代码运行非常缓慢。你可以在循环运行时关闭屏幕更新和计算以解决这个问题。

Sub deleteAllNames()

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

Dim xName As Name

For Each xName In Application.ActiveWorkbook.Names
       xName.Delete
Next

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

0
问题在于"For Each xName In",它会使用内存,而且我堆栈中有160000个名称,VBA会出现内存不足的情况。
使用FOR循环可以遍历所有名称,虽然速度较慢,但是可以正常工作。

1
你的回答可以通过提供更多支持性的信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接