Страницы: 1
RSS
Как в VBA обратиться к именованному диапазону?
 
Создаю в книге, например, на Лист1 именованный диапазон "RngSh1"  
Это по умолчанию получается именованный диапазон УРОВНЯ КНИГИ и ввод его имени в формулу ЛЮБОГО листа означает ссылку на указанный диапазон.  
А почему же в VBA тогда обращение из других модулей книги проходит без ошибки только с указанием имени листа, где расположен именованный диапазон?  
Ну, т.е. Sheets("Лист1").Range("RngSh1")  
Ведь имя входит в коллекцию Names и уникально в книге?  
Или я просто не правильно обращаюсь к диапазону?  
Вопрос не праздный. Просто лист с именованным диапазоном может быть переименован в процессе доработки таблицы. Не хотелось бы править код.  
Конечно, я могу обращаться к листу и по его CodeName, но это немного не удобно.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
[RngSh1].address
Живи и дай жить..
 
или names("RngSh1").referstorange
Живи и дай жить..
 
Круто!  
С Лист2  
[RngSh1].Address - проходит
а вроде бы то же самое  
Range("RngSh1").Address даёт ошибку...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
> А почему же в VBA тогда обращение из других модулей книги проходит без ошибки только с указанием имени листа, где расположен именованный диапазон?  
Ну, т.е. Sheets("Лист1").Range("RngSh1")  
 
Ты имеешь в виду модули листа? Тут дело в том, что в модуле листа  
Range, Cells, Names  
без указания листа относятся к этому листу, т.е. эквивалентны  
Me.Range, Me.Cells, Me.Names.  
Поэтому, например, выражение Range("Лист1!A1") в модуле Лист2 вызывает ошибку, т.к. означает  
Sheets("Лист2").Range("RngSh1")  
 
Решение: ThisWorkbook.Names("RngSh1").RefersToRange
 
Если обращаюсь из стандартных модулей, то лист не указываю - всё работает.
 
С Лист2  
Names("RngSh1").RefersToRange.Address даёт ошибку :(
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да, из стандартных модулей стандартное обращение  
Debug.Print Range("RngSh1").Value  
работает нормально.  
А из модулей листов и книги - только    
Debug.Print [RngSh1].Value
 
И к стати, а как узнать имя листа, на котором лежит именованный диапазон?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
> С Лист2  
Names("RngSh1").RefersToRange.Address даёт ошибку :(  
 
Еще раз: Names без квалификатора в Лист2 это Sheets("Лист2").Names, а имя расположено в книге. а не в листе. Поэтому  
 
ThisWorkbook.Names("RngSh1").RefersToRange
 
MsgBox Range("NNN").Parent.Name
 
> как узнать имя листа, на котором лежит именованный диапазон?  
 
ThisWorkbook.Names("RngSh1").RefersToRange.parent.name
 
Алексей,  
спасибо.  
Просто привык, что практически всегда ThisWorkbook можно опускать...  
Оказывается, что не всегда...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Юрий М}{date=14.07.2011 12:37}{thema=}{post}MsgBox Range("NNN").Parent.Name{/post}{/quote}  
это работает только из стандартного модуля...  
а вот так:  
MsgBox [RngSh1].Parent.Name
и из модулей других листов
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=14.07.2011 12:44}{thema=Re: }{post}{quote}{login=Юрий М}{date=14.07.2011 12:37}{thema=}{post}MsgBox Range("NNN").Parent.Name{/post}{/quote}это работает только из стандартного модуля...  
{/post}{/quote}  
Из из формы тоже :-)  
Алекс, откуда столько вредности (больше чем у меня)? :-))  
Был вопрос: "И к стати, а как узнать имя листа, на котором лежит именованный диапазон?" Был ответ... В вопросе есть указание ОТКУДА спрашивать?
 
Спасибо, ребята, здорово помогли.    
А то затык был в табличке на работе: не хотел привязываться в коде к конкретной ячейке с обращением по её адресу. Ячейка могла переместиться, а лист переименоваться по ходу доработки под хотелки начальства.  
Сделал именованный диапазон, а обращаться к нему без ошибок получалось только с того же листа...  
Теперь дело пошло!  
Сейчас чуть допилю и пошлю начальству табличку "на поругание" :)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=14.07.2011 12:39}{thema=}{post}Алексей,  
спасибо.  
Просто привык, что практически всегда ThisWorkbook можно опускать...  
Оказывается, что не всегда...{/post}{/quote}  
 
Алекс, если пишешь надстройку, то ThisWorkbook надо не нигде не забывать. Если конечно не обращаешься на активную книгу...
 
Володя, спасибо за совет.  
Но надстройки я не пишу почему-то, хотя дело вообще-то не хитрое. Но предпочитаю делать макросы, хранящиеся в файлах у меня в копилке.  
Но там всё равно ведь при работе с данными, лежащими в другом обрабатываемом файле, приходится писАть Activeworkbook. Так что я об этом всегда помню когда работаю с данными внешних файлов. Но тут-то у меня затык встал с внутренними данными книги. Коллекция Names ведь одна на все листы книги. Вот я и пытался обращаться к её элементам напрямую, не указывая книгу.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Читают тему
Наверх