См .:
For i = 1 To ActiveWorkbook.Names.Count
Set nm = ActiveWorkbook.Names(i)
Set rng = ActiveWorkbook.Names(nm.Name) 'This is where the error was
MsgBox rng.Address
Next i
Я также удалил имя rng_name, поскольку вы его не использовали.
Edit1:
Мне не удалось заставить Application.Range(nm.Name)
работать изначально, но я смог заставить ActiveWorkbook.Range(nm.Name)
работать, используя диапазоны на разных листах с именами "c" и "d".Я отметил, что nm = ActiveWorkbook.Names(i)
не включал имя листа при его записи.
При именовании диапазонов с подчеркиванием и номером в них (я попытался c_1 & c_2), я не смогзаставить мой код работать;при проверке nm
в режиме отладки я заметил, что в нем также указано имя листа.Мне нужно было указать, что rng будет .RefersToRange
, чтобы адрес ячейки отображался без имени листа.
Я сделал две дополнительные проверки, одну с подчеркиванием без номера (использовал «d_»), а другуюс числом и без подчеркивания (используется «name2»), и оба сделали дают мне ту же ошибку.Оба сценария сохранили имя листа в строке nm
.
Вот код тестирования, который я выполнял / выполнял, чтобы разобраться с этим:
Dim rng As Range, i As Long
For i = 1 To ActiveWorkbook.Names.Count
Set nm = ActiveWorkbook.Names(i)
'Set rng = ActiveWorkbook.Names(nm.Name)
Set rng = nm.RefersToRange
'Debug.Print rng.Address
MsgBox rng.Address
Next i
Использование Set rng = nm.RefersToRange
сработалово всех сценариях, в то время как имена только из буквенных символов работали с предложением Set rng = ActiveWorkbook.Names(nm.Name)
.
, придерживайтесь .RefersToRange
в качестве надежного кода.