Excel命名范围的范围适用于工作表中的工作表从命名范围的工作表打印

时间:2019-01-26 00:53:20

标签: excel vba named-ranges

在新创建的3个工作表工作簿中的

MVCE。在sheet1和sheet2上已创建名称foo,名称分别作用于每个工作表。之后,在工作簿范围内,使用相同的名称来引用sheet3。访问工作簿范围内的名称时,我在sheet2上获得了该名称,并且不明白为什么。

我明显缺少什么吗?

Public Sub NameConfusion()
    Do While ThisWorkbook.Names.Count > 0
        ThisWorkbook.Names(1).Delete
    Loop

    AddNames

    Debug.Print ThisWorkbook.Names("foo").RefersToRange.Address(False, False) ' --> B2 NOT expected
    'I would expect it to be C5

    ThisWorkbook.Names("foo").Delete
    Debug.Print ThisWorkbook.Names("foo").RefersToRange.Address(False, False) ' --> C5 NOT expected, based on above
    'I would expect it to be B2
End Sub

Private Sub AddNames()
    Sheet1.Names.Add "foo", Sheet1.Range("a2")
    Debug.Print ThisWorkbook.Names.Count ' --> 1 as expected

    Sheet2.Names.Add "foo", Sheet2.Range("B2")
    Debug.Print ThisWorkbook.Names.Count ' --> 2 as expected

    ThisWorkbook.Names.Add "foo", Sheet3.Range("C5")
    Debug.Print ThisWorkbook.Names.Count ' --> 3 as expected
End Sub

注意:我遇到了一些问题,以编程方式执行此操作会用工作簿范围的名称覆盖工作表范围的名称之一。发生这种情况时,在调用Debug.Print之后,通过“公式”选项卡>“定义的名称”组>“名称管理器”按钮手动添加名称,并跳过对AddNames的评估,仍会打印出非工作簿范围的地址。

2 个答案:

答案 0 :(得分:1)

查找foo时,它将在本地范围内从第一个实际放置的图纸开始,即最左侧。我猜您的B2 foo表在最左边。删除后,在该工作表的本地找不到foo,因此转到工作簿范围。这也适用于删除。您可以通过切换工作表的物理顺序进行测试,然后会看到根据顺序得到的不同结果。一个简单的解决方法似乎是在可能的情况下使用不同的名称。

答案 1 :(得分:1)

我做了测试,但是没有得到@QHarr提到的结果。我使用了这段代码:

Sub test()
    Dim nm As Name
    For Each nm In ActiveWorkbook.Names
        Debug.Print nm.RefersTo
    Next
End Sub

包含3个同名工作表,2个工作表名称(sheet1和sheet3),1个工作簿名称(sheet2)。结果将始终是:

=Sheet1!$B$3:$C$4
=Sheet3!$B$3:$C$4
=Sheet2!$B$3:$C$4

无论物理序列是什么。当我重命名Sheet1的选项卡时,它变为:

=Sheet3!$B$3:$C$4
=zzSheet1!$B$3:$C$4
=Sheet2!$B$3:$C$4

所以我想顺序是:首先是工作表名称,按照标签名的先后顺序排列,然后是工作簿名称。请注意,这是选项卡名称的顺序,而不是工作表名称。