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
的评估,仍会打印出非工作簿范围的地址。
答案 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
所以我想顺序是:首先是工作表名称,按照标签名的先后顺序排列,然后是工作簿名称。请注意,这是选项卡名称的顺序,而不是工作表名称。