VBA命名范围计数高于实际值

时间:2017-10-11 18:02:52

标签: excel-vba excel-2016 vba excel

我有一个导出各种报告的主文件,但是当我复制整张纸(以保持格式化等)时,它带有命名范围。

我需要删除这些以打破所有链接,删除版本如下:

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>

1 个答案:

答案 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循环,你将打破集合。