Страницы: 1
RSS
Как в макросе обратиться к конкретному листу (по имени или по номеру)
 
Имеем книгу с тремя листами "Петя", "Вася", "Данные". С помощью макроса нужно скопировать листы "Петя", "Вася" в другую книгу. Я это делаю так:  
Sheets(Array("Петя", "Вася")).Copy - возникает проблема если переименовать лист например "Петя_1" - нужно переделывать макрос.  
Можно обратится к коллекции Sheets(1) и Sheets(2) но при перемещении листа "Петя" в конец он уже становится не Sheets(1) а Sheets(3).  
Внимание вопрос: Можно ли как то железобетонно идентифицировать лист, чтобы при переименовании или перемещении его в книге все равно ссылаться именно на него ?
Редко но метко ...
 
Уточнение:  
Несмотря на то, что свойство CodeName доступно только для чтения, программное имя рабочего листа можно изменять, если не забывать, что модуль входит в семейство VBComponents.    
 
http://www.msoffice.nm.ru/faq/macros/module.htm#faq45
 
{quote}{login=The_Prist}{date=17.01.2011 04:27}{thema=}{post}Можно обратиться к листу по его кодовому имени.{/post}{/quote}  
Спасибо. Это то что нужно. Хотя стоко литературы перелопатил, а про кодовое имя это нигде не упоминалось. Кстати встречный вопрос: если этот файл открыть в англоязычном екселе работать будет? (в англоязычном же помоему кодовые имена идут Sheet1 и т. д.)
Редко но метко ...
 
"в англоязычном екселе работать будет?" - нет, но лучше самому попробовать ;)
<FONT COLOR="CadetBlue">
 
А по моему будут. Ведь кодовое имя листа относится к его свойствам, а при изменении версии свойства листа не должны меняться. Или я ошибаюсь7
 
Я думаю, что этот код будет работать в этом файле всюду. А вставленный в файл, созданный в англоязычном Экселе - нет. Ибо там имена листов SheetN.
 
Лучше все же переименуйте кодовые имена листов в латиницу....А про замену - меняются в соответствии с локализацией только вновь созданные листы. Имеющиеся не меняются. Не должны...:-)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Мое мнение нет, так как откуда в англ.версии русский язык? :)  
 
P.S. Сам не пробовал.  
 
-=32777=-
<FONT COLOR="CadetBlue">
 
А я уже и попробовал - у меня сейчас английский на рабочей машине.
 
{quote}{login=Hugo}{date=17.01.2011 04:49}{thema=}{post}А я уже и попробовал - у меня сейчас английский на рабочей машине.{/post}{/quote}  
 
У вас работает ?
Редко но метко ...
 
В Вашем примере работает Sheets(Array(Лист1.Name, Лист2.Name)).Copy  
В моём, созданном сейчас файле - естественно не работает, ибо имена листов типа Sheet1
 
{quote}{login=Hugo}{date=17.01.2011 05:00}{thema=}{post}В Вашем примере работает Sheets(Array(Лист1.Name, Лист2.Name)).Copy  
В моём, созданном сейчас файле - естественно не работает, ибо имена листов типа Sheet1{/post}{/quote}  
 
Правильно. Так речь идет об уже существующих листах, а не о вновь создаваемых
 
И я о том же.  
Но учесть нужно. Ведь если например теперь из этой созданной книги брать листы - там уже имя может быть Sheet1 :)
 
{quote}{login=webley}{date=17.01.2011 05:01}{thema=Re: }{post}Правильно. Так речь идет об уже существующих листах, а не о вновь создаваемых{/post}{/quote}Я же выше написал уже: "меняются в соответствии с локализацией только вновь созданные листы"  
 
Но я бы советовал все же использовать имена на латинице, т.к. это язык для VBA все же родной.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Т.е. не из этой, а из просто workbooks.add...
 
Спасибо джентельмены. Очень помогли !
Редко но метко ...
 
{quote}{login=The_Prist}{date=17.01.2011 04:27}{thema=}{post}Можно обратиться к листу по его кодовому имени. {/post}{/quote}  
Что-то у меня не получается переименовать из редактора ВБА. Выдаёт ошибку "Invalid property" и сбрасывает имя на первоначальное.  
Не подскажете, как это сделать?
 
А Вы не используйте в кодовом имени пробелы, тире и прочие знаки препинания.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
{quote}{login=The_Prist}{date=17.06.2012 07:50}{thema=}{post}А Вы не используйте в кодовом имени пробелы, тире и прочие знаки препинания.{/post}{/quote}  
Хм...  
а сейчас внезапно получилось, хотя и до этого без пробелов и прочих знаков пробовал.
...
 
А как к нему обращаться по кодовому имени?  
У меня он называется сейчас Sheet12. Пробую:  
Thisworkbook.Sheets("Sheet12") - Ошибка (Subscript out of range. Debug)  
.Sheets(Sheet12) - то же  
.Sheets(12) - то же  
.Worksheets("Sheet12") - то же  
.Worksheets(12) - то же.
...
 
Sheet12.Activate
Страницы: 1
Читают тему
Наверх