|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
04.12.2008, 16:37 | #1 |
Форумчанин
Регистрация: 17.10.2008
Сообщений: 239
|
Переход на новый лист в VBA
Уважаемые господа!
В проекте который пишу необходимо внутри цикла For i=1 to 15 много работать с разной группой листов. при i=1 работаем попеременно с Лист2 и Лист3, при i=2 c Лист4 и Лист5 и т.д. попробовал это следующим образом workbook(1).sheets(i*2+1).activate и workbbok(1).seehts(i*2).activate не работает. остается на последнем листе определенном set sheet или на котором он открылся Помогите пожалуйста. P.S. создавал функцию с selectом эфект тот же |
04.12.2008, 18:12 | #2 |
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
экселю совершенно все равно как будет получен № листа
sheets(1*2+1).activate sheets(3).activate sheets(i*2+1).activate, где i = 1. допускаю workbоok(1) - это не та книга, в которой вы пытаетесь активировать другой лист, и эксель добросовестно в workbbok(1) меняет активность листов. выкиньте workbbok(1) из кода.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
04.12.2008, 19:44 | #3 |
Форумчанин
Регистрация: 30.07.2008
Сообщений: 125
|
Думаю что можно создать массив (если листы нужно брать не 1,2,3 а к примеу 3,1,2)
a=array(3,1,2) For s=ubound(a) to lbound(a) Sheets(a(m))..... Next Может так подойдет? Последний раз редактировалось Rom1k06; 04.12.2008 в 19:47. |
05.12.2008, 03:09 | #4 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Во-первых, у Вас, похоже, синтаксическая ошибка:
вместо Workbook(1) следует писать Workbooks(1) Но, как Вам уже посоветовали, лучше вообще не использовать такие конструкции в коде. Для обращения к активной книге используйте объект ActiveWorkbook, а для доступа к книге, из которой выполняется код - ThisWorkbook Далее. Активировать листы, я полагаю, нет ни малейшей необходимости. Встречаются, конечно, такие случаи, где без активации листа не обойтись, но крайне редко. В 95 процентах случаев методы Select и Activate абосолютно не нужны. К тому же, без использования методов Select и Activate код будет работать быстрее и эффективнее В Вашем случае, проще будет организовать работу с листами таким образом: (учитывая, что одновременно в цикле обрабатываются в основном 2 листа) Код:
__Полезные надстройки для Excel. Парсинг сайтов и файлов.
Макросы любой сложности на заказ. Мониторинг цен конкурентов Последний раз редактировалось EducatedFool; 05.12.2008 в 03:11. |
05.12.2008, 07:47 | #5 | |
Форумчанин
Регистрация: 17.10.2008
Сообщений: 239
|
Цитата:
Rom1k06 см выше. EducatedFool Вы гений . такой подход мне нравиться. Сегодня (а может завтра) его попробую. Определить листы заранее. Я до этого как-то не допетрил. только один вопров, можно ли чуть изменить вашу идею следующим образом. dim sh1(16) as worksheet, sh2(16) as worksheet далее как у вас только с массивом листов. и это будет прелесть. Только один вопрос как внутри цикла активировать нужный лист. (необходимо клонировать таблицы с ячейки а1 до ячейки AZ54. И провести операции по обработке нужного листа я ранее задавал этот вопрос на форуме (три вопроса по макросам - второй вопрос). |
|
05.12.2008, 07:57 | #6 | |
Форумчанин
Регистрация: 17.10.2008
Сообщений: 239
|
Цитата:
sh(k).activate я Прав? |
|
05.12.2008, 09:00 | #7 | ||
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Цитата:
К примеру, при первой итерации цикла (когда i=1), переменные sh1 и sh2 будут ссылаться на листы 2 и 3 соответственно. При следующей итерации (когда i=2) - переменные sh1 и sh2 уже ссылаются на листы 4 и 5, и т.д. Цитата:
Код sh1.range("a1:az54").copy sh2.range("d3") произведёт копирование диапазона a1:az54 с листа sh1 (при i=5 это будет Лист10) на лист sh2 (при i=5 это будет Лист11), начав вставку с ячейки "d3". При этом НЕ НУЖНО активировать листы. Если уж так хочется активировать лист - то примерно так: sh1.Activate |
||
05.12.2008, 10:02 | #8 |
Форумчанин
Регистрация: 17.10.2008
Сообщений: 239
|
Понял!
Спасибо за быстрый ответ |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ICQClient контакт-лист | DOLBY | Компоненты Delphi | 6 | 14.11.2008 22:38 |
Новый лист | Berrimor | Microsoft Office Excel | 1 | 08.09.2008 10:37 |
Лист | ZhekON | Общие вопросы Delphi | 5 | 17.04.2007 11:34 |
защитить лист | zetrix | Microsoft Office Excel | 2 | 27.11.2006 17:21 |