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
所以我猜顺序是:首先是工作表名称,按选项卡名称的字母顺序排列,然后是工作簿名称。请注意,这是标签名称的顺序,而不是工作表名称的顺序。
新创建的 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
所以我猜顺序是:首先是工作表名称,按选项卡名称的字母顺序排列,然后是工作簿名称。请注意,这是标签名称的顺序,而不是工作表名称的顺序。