【问题标题】:Is there a way of accessing a named range without knowing which sheet it is on in VBA Excel?有没有办法在不知道 VBA Excel 中的哪个工作表的情况下访问命名范围?
【发布时间】:2019-09-05 03:47:01
【问题描述】:

我有一张包含一列单元格的表格,每个单元格都引用一个命名范围。这些命名范围中的每一个都位于其他工作表上,我不知道它们在哪些工作表上,我只知道范围的名称。每个范围都有一个唯一的名称,因此不存在范围重复的风险,它们在名称管理器中可以清楚地识别。我希望 VBA 访问这些范围并更改它们的值。

通常的Range().select 显然不起作用,因为我不知道范围在哪张纸上。我可以暴力破解它,并且对于每个命名范围都遍历每张纸以找到范围,但这显然是非常低效的。或者,如果我可以转到每个单元格所指的范围,也可以完成这项工作。

实际上,我有许多具有 =in_total_pop 等功能的单元格。我不知道 in_total_pop 保存在哪个工作表上,但我想访问 in_total_pop。

有什么方法可以实现吗?在我看来,这是一项令人惊讶的简单任务,我很难想出一种方法来实现它。我是命名范围的粉丝,但如果不知道它们在哪张纸上就无法访问它们,那么这是一个很大的劣势。默认命名方法至少在名称中包含工作表地址(例如 ='All cost'!M29),然后可以通过 VBA 对其进行破译以找到范围。感谢您的帮助,如果我遗漏了一些明显的东西,请告诉我。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您可以在工作簿中使用Names 集合。

    例如:ThisWorkbook.Names("Bob").RefersTo。有几个“refersTo…”选项可供选择。

    进一步阅读:

    编辑:

    澄清一下,虽然我在示例中使用了ThisWorkBoook,但Names 元素是Workbook 对象中的一个内在集合。因此,如果您引用了其他工作簿,您仍然可以调用 Names 功能。

    例如:

    Dim wb as Workbook
    Dim rng as Range
    Set wb = Application.Workbooks.Open("SomeFileName")
    Set rng = wb.Names("Bob").RefersToRange
    

    【讨论】:

    • 谢谢,但这需要我向每个工作簿添加代码,其他解决方案可以避免这种情况。
    • @MagicM:不-您不必向每个工作簿添加代码!请参阅我的编辑。直接访问命名范围是比尝试通过 Range 对象强制访问更简洁的解决方案。
    【解决方案2】:

    一种选择可能是从范围中获取地址。例如:

    My_variable = Range("my_range").Address(, , , True)
    

    将第四个参数设置为 TRUE,您将获得工作簿名称和存储范围的工作表。使用该指令,您将在 My_variable 中存储类似的内容:

    [Workbook1]Sheet1!$G$11
    

    您可以使用如下代码隔离此信息。用您的范围名称替换“My_range”:

    Sub Get_Range_Information()
    
        Dim My_variable As Variant
        Dim Sheet_name As String
        Dim Range_address As String
    
        My_variable = Split(Range("My_range").Address(, , , True), "!")
        Sheet_name = Right(My_variable(0), Len(My_variable(0)) - InStrRev(My_variable(0), "]"))
        Range_address = My_variable(1)
    
       Debug.Print Sheet_name
       Debug.Print Range_address
    
    End Sub
    

    然后您可以使用变量为同一范围分配新值。

    【讨论】:

    • 非常感谢,它就像一个魅力!我在这里,认为我必须放弃使用命名范围,愚蠢的我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2023-03-21
    • 2019-07-02
    • 1970-01-01
    • 2016-12-27
    • 2023-01-14
    相关资源
    最近更新 更多