2016-02-05 4 views
2

У меня есть ячейка, у которой есть несколько именованных диапазонов, связанных с ней. Как мне получить его, чтобы вернуть конкретное имя без необходимости перебирать все имена в книге?Excel VBA. Как вы получаете определенное имя, связанное с диапазоном?

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?

+1

Реальный вопрос: почему у вас есть 3 имени для одного и того же диапазона !? –

+1

@ MacroMan, очевидно, поэтому OP может задать вопрос о SO duh. – findwindow

+0

Так как вы спросили ... Одно из имен будет скрыто и хранит информацию, используемую кодом. Однако, если пользователь также добавляет имя (или два) в тот же диапазон, где код также помещает имя. – ptownbro

ответ

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, чтобы получить нужные вам имена.

+0

Спасибо за ответ. Да. Если вы прочтете последнюю часть моего первоначального сообщения, о котором я упомянул, я понял, что могу перебирать имена (как вы и предполагали). Тем не менее, я смотрю, есть ли более прямое решение. – ptownbro

Смежные вопросы