我有一个导出各种报告的主文件,但是当我复制整张纸(以保持格式化等)时,它带有命名范围。
我需要删除这些以打破所有链接,删除版本如下:
Sub buildreport()
ThisWorkbook.Worksheets("Report").Copy
With ActiveWorkbook
'various things
If .Names.Count > 0 Then
For Each Name In .Names
Name.Delete
Next Name
End If
End With
End Sub
如果我在If .Names.Count > 0 Then
上中断,那么我可以看到当悬停计数显示为6时,activesheet
的名称管理器只有2个名称。
Names.Count
是否只计算命名范围?
修改
出于好奇,我跑了以下
With ActiveWorkbook
For Each Name In .Names
Debug.Print Name
Next Name
End With
产生了这个
='GTM Roles'!$A$2:$BF$1387
=#NAME?
=#NAME?
=#NAME?
=OFFSET('[GRT MASTER mini.xlsm]All Roles'!$A$2, 0, 0, COUNTA('[GRT MASTER mini.xlsm]All Roles'!$A:$A)-1, COUNTA('[GRT MASTER mini.xlsm]All Roles'!$2:$2))
='[GRT MASTER mini.xlsm]index'!$I$2:$I$10
不知道这些=#NAME?
名称是什么,或者甚至它们在哪里,因为它们没有在名称管理器中显示,并且在尝试删除它们时抛出语法不正确的错误。 / p>
答案 0 :(得分:0)
通常使用索引和反转计数来删除命名范围或集合中的任何内容:
Public Sub TestMe()
Dim cnt As Long
For cnt = ActiveWorkbook.Names.Count To 1 Step -1
Debug.Print ActiveWorkbook.Names.Item(cnt).Name
ActiveWorkbook.Names.Item(cnt).Delete
Next cnt
End Sub
原因是集合在某种程度上是像黑手党一样的对象 - 每个人都知道下一个,所以如果你删除当前的一个for-each循环,你将打破集合。