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

0
IvenBach 26 Янв 2019 в 03:53

2 ответа

Лучший ответ

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

1
QHarr 26 Янв 2019 в 08:02

Я провел тестирование, но не получил результата, упомянутого @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

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

1
Joost 26 Янв 2019 в 12:51