Excel 命名范围限定为工作簿打印来自 sheet 限定范围的命名范围

Excel named range scoped to workbook printing a from a sheet scoped named range

新创建的 3 工作sheet 工作簿中的 MVCE。其中在 sheet1 和 sheet2 上创建了名称 foo,范围分别为每个 sheet。之后,将范围限定为工作簿,在引用 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

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

当它查找 foo 时,它首先在本地范围内查找,从第一个物理位置 sheet 开始,即最左边。我猜你的 B2 foo sheet 是最左边的。当它被删除时,它在本地找不到 foo sheet,所以转到工作簿范围。这也适用于删除。您可以通过切换 sheet 的物理顺序进行测试,您会看到根据顺序得到不同的结果。一个简单的解决方法似乎是尽可能使用不同的名称。

我做了测试,但没有得到@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:$C
=Sheet3!$B:$C
=Sheet2!$B:$C

不管物理顺序是什么。当我重命名Sheet1的标签时,它变成了:

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

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