Именованный диапазон Excel с областью действия для печати книги из именованного диапазона с областью действия листа

MVCE во вновь созданной книге с 3 листами. Внутри которого на листах Sheet1 и Sheet2 было создано имя foo, привязанное к каждому листу соответственно. После того, как область видимости книги, то же имя используется в отношении Sheet3. При доступе к имени рабочей книги в области видимости я получаю имя на листе 2 и не могу понять, почему.

Есть ли что-то очевидное, что мне не хватает?

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 все равно приведет к печати адреса без области действия книги.


person IvenBach    schedule 26.01.2019    source источник


Ответы (2)


Когда он ищет foo, он сначала смотрит в локальную область видимости, начиная с первого физически размещенного листа, то есть самого левого. Я думаю, ваш лист B2 foo крайний левый. Когда он удаляется, он не может найти foo в локальном списке для этого листа, поэтому переходит в область рабочей книги. Это также касается удаления. Вы можете протестировать, переключив физический порядок листов, и увидите, что в зависимости от порядка вы получите разные результаты. Казалось бы, простое решение - использовать разные имена там, где это возможно.

person QHarr    schedule 26.01.2019
comment
Теперь имеет смысл знать порядковый номер листа. Проверено и подтверждено, что это так. - person IvenBach; 28.01.2019

Я провел тестирование, но не получил результата, упомянутого @QHarr. Я использовал этот код:

Sub test()
    Dim nm As Name
    For Each nm In ActiveWorkbook.Names
        Debug.Print nm.RefersTo
    Next
End Sub

с 3 листами с одинаковыми именами, 2 именами листов (лист1 и лист3), 1 именем книги (лист2). Результатом всегда будет:

=Sheet1!$B$3:$C$4
=Sheet3!$B$3:$C$4
=Sheet2!$B$3:$C$4

независимо от того, какова была физическая последовательность. Когда я переименовал вкладку Sheet1, она стала:

=Sheet3!$B$3:$C$4
=zzSheet1!$B$3:$C$4
=Sheet2!$B$3:$C$4

Итак, я предполагаю, что последовательность такова: сначала имена рабочих листов в алфавитном порядке имени вкладки, затем имена рабочих книг. Обратите внимание, что это порядок названия вкладки, а не названия листа.

person Joost    schedule 26.01.2019