Excel VBA。如何获得与范围相关的特定名称?

时间:2016-02-05 22:57:07

标签: excel vba excel-vba named-ranges

我有一个与其关联的多个命名范围的单元格。如何在不必遍历工作簿中的所有名称的情况下返回特定名称?

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'?

我可以遍历工作簿中的所有名称,看看' RefersTo' Name对象的属性与单元格A1的地址匹配,但如果可能的话,我希望更直接的解决方案更快。

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

2 个答案:

答案 0 :(得分: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即可获得所需的名称。

答案 1 :(得分:0)

WB作为工作簿 RG为范围

WB.Names(RefersTo:=“ =”&RG.Worksheet.Name&“!”&RG.Address(True,True))。名称

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