【问题标题】:Excel VBA. How do you get a specific name associated with a range?Excel VBA。您如何获得与范围关联的特定名称?
【发布时间】:2016-02-05 22:57:07
【问题描述】:

我有一个单元格有多个与之关联的命名范围。如何让它返回一个特定的名称,而不必遍历工作簿中的所有名称?

Sub Test()
    ActiveWorkbook.Names.Add Name:="AUserDefinedName1", RefersTo:="='Sheet1'!$A$1", Visible:=True
    ActiveWorkbook.Names.Add Name:="AUserDefinedName2", RefersTo:="='Sheet1'!$A$1", Visible:=True
    ActiveWorkbook.Names.Add Name:="MyName", RefersTo:="='Sheet1'!$A$1", Visible:=True
    Dim n As Name
    Set n = Range("A1").Name
    Debug.Print n.Name
End Sub

如果您运行上述程序,对于单元格 A1,它只会返回名字。但是,我如何让它返回与单元格 A1 关联的其他名称或专门返回“MyName”?

我可以遍历工作簿中的所有名称,并查看 Name 对象的“RefersTo”属性是否与单元格 A1 的地址匹配,但如果可能的话,我想要一个更快的更直接的解决方案。

这个帖子给出了部分答案,但是如果有多个名字需要怎么办? How do you get a Range to return its Name?

【问题讨论】:

  • 真正的问题是——为什么同一范围有 3 个名称!?
  • @MacroMan 显然这样 OP 可以在 SO duh 上提问。
  • 既然你问了......其中一个名称将被隐藏并存储代码使用的信息。但是,如果用户还在代码也放置了名称的同一范围内添加了一个(或两个)名称,该怎么办。
  • 供您参考,这里有一个更短的创建名称的方法:Range("Sheet1!A1").Name = "MyName"

标签: vba excel named-ranges


【解决方案1】:

使用Workbook.Names集合并测试地址:

For Each n In ActiveWorkbook.Names
    If n.RefersToRange.Address = "$A$1" Then
        Debug.Print n.Name
    End If
Next

还有一个关于命名范围的whole MSDN article 供进一步阅读。

范围对象没有Names 集合,因此完成此操作的唯一方法是在工作簿级别。除非您的工作簿中有数千个命名范围,否则使用此方法不会有明显的速度差异,只需创建一个 UDF 即可获取您需要的名称。

【讨论】:

  • 感谢您的回复。是的。如果您阅读了我提到的原始帖子的最后一部分,我知道我可以遍历名称(正如您所建议的那样)。不过,我正在寻找是否有更直接的解决方案。
【解决方案2】:

WB 作为工作簿 RG 作为范围

WB.Names(RefersTo:= "=" & RG.Worksheet.Name & "!" & RG.Address(True, True)).Name

意识到这是一篇过时的帖子,但对于其他看起来像我今天的人来说,以上内容对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2017-10-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多