Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 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
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 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) из кода.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 04.12.2008, 19:44   #3
Rom1k06
Форумчанин
 
Регистрация: 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.
Rom1k06 вне форума
Старый 05.12.2008, 03:09   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Во-первых, у Вас, похоже, синтаксическая ошибка:
вместо Workbook(1) следует писать Workbooks(1)

Но, как Вам уже посоветовали, лучше вообще не использовать такие конструкции в коде.
Для обращения к активной книге используйте объект ActiveWorkbook,
а для доступа к книге, из которой выполняется код - ThisWorkbook

Далее. Активировать листы, я полагаю, нет ни малейшей необходимости.
Встречаются, конечно, такие случаи, где без активации листа не обойтись, но крайне редко.

В 95 процентах случаев методы Select и Activate абосолютно не нужны.

К тому же, без использования методов Select и Activate код будет работать быстрее и эффективнее


В Вашем случае, проще будет организовать работу с листами таким образом:
(учитывая, что одновременно в цикле обрабатываются в основном 2 листа)


Код:
Sub test()
    Dim sh1 As Worksheet, sh2 As Worksheet
    For i = 1 To 15
        Set sh1 = ThisWorkbook.Worksheets(i * 2): If sh1 Is Nothing Then MsgBox "Не найден лист с номером " & (i * 2), vbCritical, "Ошибка": Exit For
        Set sh2 = ThisWorkbook.Worksheets(i * 2 + 1): If sh2 Is Nothing Then MsgBox "Не найден лист с номером " & (i * 2 + 1), vbCritical, "Ошибка": Exit For

        ' теперь работаем с объектами sh1 и sh2, ссылающимися на нужные в данный момент листы:
        sh1.Cells(2, 2) = 125: sh1.[f5] = "текст"
        sh1.[r6] = sh2.[g9]
        sh2.Range("r4:z7").Copy sh1.[m4]
        sh2.Tab.Color = vbRed
        'ну и так далее без всякой активации и выделения ячеек и листов
        
        With sh1 ' используйте такую конструкцию, если работать надо в основном с одним листом
            For j = 2 To 55: .Cells(j, 4) = j * 9: Next
        End With
    Next i
    ' по окончании работы макроса останется активным тот же лист, что и при его запуске
End Sub

Последний раз редактировалось EducatedFool; 05.12.2008 в 03:11.
EducatedFool вне форума
Старый 05.12.2008, 07:47   #5
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
экселю совершенно все равно как будет получен № листа
sheets(1*2+1).activate
sheets(3).activate
sheets(i*2+1).activate, где i = 1.

допускаю workbоok(1) - это не та книга, в которой вы пытаетесь активировать другой лист, и эксель добросовестно в workbbok(1) меняет активность листов. выкиньте workbbok(1) из кода.
Выбрасывал тоже что и при вопросе. Я задумался, что может я не активировал какой-то Project, но тогда почему при set sheet все работает.

Rom1k06 см выше.

EducatedFool Вы гений . такой подход мне нравиться. Сегодня (а может завтра) его попробую. Определить листы заранее. Я до этого как-то не допетрил. только один вопров, можно ли чуть изменить вашу идею следующим образом.
dim sh1(16) as worksheet, sh2(16) as worksheet

далее как у вас только с массивом листов. и это будет прелесть. Только один вопрос как внутри цикла активировать нужный лист. (необходимо клонировать таблицы с ячейки а1 до ячейки AZ54. И провести операции по обработке нужного листа я ранее задавал этот вопрос на форуме (три вопроса по макросам - второй вопрос).
Юнлинг вне форума
Старый 05.12.2008, 07:57   #6
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Юнлинг Посмотреть сообщение
. Только один вопрос как внутри цикла активировать нужный лист. (необходимо клонировать таблицы с ячейки а1 до ячейки AZ54. И провести операции по обработке нужного листа я ранее задавал этот вопрос на форуме (три вопроса по макросам - второй вопрос).
Глупость сморозил очень просто
sh(k).activate

я Прав?
Юнлинг вне форума
Старый 05.12.2008, 09:00   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
только один вопров, можно ли чуть изменить вашу идею следующим образом.
dim sh1(16) as worksheet, sh2(16) as worksheet
В предложенном мною варианте sh1 и sh2 - это не массивы, поэтому запись sh1(16) не имеет смысла.

К примеру, при первой итерации цикла (когда i=1), переменные sh1 и sh2 будут ссылаться на листы 2 и 3 соответственно.
При следующей итерации (когда i=2) - переменные sh1 и sh2 уже ссылаются на листы 4 и 5, и т.д.

Цитата:
Только один вопрос как внутри цикла активировать нужный лист. (необходимо клонировать таблицы с ячейки а1 до ячейки AZ54
Зачем активировать?

Код sh1.range("a1:az54").copy sh2.range("d3") произведёт копирование диапазона a1:az54 с листа sh1 (при i=5 это будет Лист10) на лист sh2 (при i=5 это будет Лист11), начав вставку с ячейки "d3".
При этом НЕ НУЖНО активировать листы.

Если уж так хочется активировать лист - то примерно так: sh1.Activate
EducatedFool вне форума
Старый 05.12.2008, 10:02   #8
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Понял!
Спасибо за быстрый ответ
Юнлинг вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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