Именованный диапазон Excel распространяется на печать рабочей книги из именованного диапазона листа - PullRequest
0 голосов
/ 26 января 2019

MVCE во вновь созданной рабочей книге на 3 листа. В пределах которого на листе 1 и листе 2 было создано имя foo, относящееся к каждому листу соответственно. После того, как в рабочей области, то же имя используется в отношении листа 3. При доступе к имени в области книги я получаю имя на листе 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 по-прежнему приводит к печати адреса с не заданной областью.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

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

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

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

=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

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

0 голосов
/ 26 января 2019

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

...