范围为工作簿的 Excel 命名范围从工作表范围命名范围打印

标签 excel vba named-ranges

MVCE 在新创建的 3 个工作表工作簿中。其中 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 后仍将导致打印非工作簿范围的地址。

最佳答案

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

关于范围为工作簿的 Excel 命名范围从工作表范围命名范围打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54374692/

相关文章:

vba - 删除 Material list 中的行

Excel 2016 : Refer to last worksheet in a formula

vb.net - Excel中命名范围的设置值

sql - 无法在 Excel 中查询名称中带有空格的工作表上的命名范围

vba - 在一张纸上复制静态范围,然后根据单元格中的单个值将动态范围粘贴到另一张纸上

excel - 计算不是 Application 或 ActiveWorkbook 的方法

vba - 运行时错误 '1004' Worksheet 类的 ShowDataForm 方法失败

vba - 几个项目后 for-each 循环上的运行时错误 13

vba - Outlook 2013 'Run a script' 规则已消失

excel - 从 Excel VBA 连接到只读 Access db