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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2009, 12:02   #21
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Внешний цикл (в предыдущем примере это For j = 0 To 1), как раз и есть количество групп. Так, например, пусть имеется n групп по 4 листа в каждой. Тогда внешний цикл будет выглядеть так:
Код:
For j = 1 To n
    '''
    '''
    '''
    Set ws = Sheets(sh + 4 * j)
Next
Не забудьте в адресах ячеек для вставки данных заменить i + j на i + j -1.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 18.05.2009 в 12:07.
SAS888 вне форума Ответить с цитированием
Старый 19.05.2009, 11:14   #22
ruavia3
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 253
По умолчанию

А как ограничить значение переменной ws?
Вылетает ошибка, т.к. группы 3, листов 12, а при подсчете цикла sh+4*j, при значении j=3, sh=13 - а этого листа нет. Как вариант я добавил еще три пустых листа в конец книги.
ruavia3 вне форума Ответить с цитированием
Старый 19.05.2009, 11:32   #23
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Да, Вы правы. Лучше присваивать значение объекту ws в начале цикла. Например, для 3-х групп (от j=0 до j=2) можно так:
Код:
Sub Main(sh As Integer)
    Dim i As Integer, j As Integer, x As Range, ws As Worksheet: Application.ScreenUpdating = False
    For j = 0 To 2
        Set ws = Sheets(sh + 4 * j)
        For i = 13 To 31 Step 3
            Set x = ws.Columns("A").Find(what:=Cells(i - 1, "A") - 1, LookAt:=xlWhole)
            If Not x Is Nothing Then
                ws.Range(ws.Cells(x.Row, "K"), ws.Cells(x.Row, "V")).Copy
                Cells(i + j, "B").PasteSpecial Paste:=xlPasteValues
            Else: Range(Cells(i + j, "B"), Cells(i + j, "Y")).ClearContents
            End If
            Set x = ws.Columns("A").Find(what:=Cells(i - 1, "A"), LookAt:=xlWhole)
            If Not x Is Nothing Then
                ws.Range(ws.Cells(x.Row, "W"), ws.Cells(x.Row, "Y")).Copy
                Cells(i + j, "N").PasteSpecial Paste:=xlPasteValues
                ws.Range(ws.Cells(x.Row, "B"), ws.Cells(x.Row, "J")).Copy
                Cells(i + j, "Q").PasteSpecial Paste:=xlPasteValues
            Else: Range(Cells(i + j, "N"), Cells(i + j, "Y")).ClearContents
            End If
        Next
    Next
    [A1].Select
End Sub
Заметьте, что в этом случае листов должно быть не 12, а 13, т.к. 1-й лист не входит в группы по 4 листа.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 19.05.2009, 13:20   #24
ruavia3
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 253
По умолчанию

гениально, все летает
ruavia3 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Optionbutton(ы) на MultiPage ruavia3 Microsoft Office Excel 2 30.04.2009 14:26
OptionButton Волк Microsoft Office Excel 3 09.04.2009 09:53
макрос для суммирования jisu Microsoft Office Excel 5 30.03.2009 23:21
Макрос для копирования knyz Microsoft Office Excel 28 11.01.2009 06:12
Макрос для терпеливых jungo Microsoft Office Excel 3 04.05.2008 14:49