Как всегда, хочется улучшений :)
Работает: из 6-7 листов собирается информация в сводный лист.
1. выбрали лист
2. посмотрели, есть ли данные
3. если да, загнали диапазон в массив
3. записали нужные строки в массив (перезаписали массив) (может быть на каждом листе до 1500)
4. выгрузили найденное на сводный лист
5. выбрали следующий лист...
При таком варианте обращаемся к сводному листу (выгрузка) несколько раз.
Хотелка: последовательно записать в массив данные со всех листов и один раз выгрузить на сводный (так быстрее?).
Проблема известна: нельзя изменять первую размерность массива.
Обход проблемы: создать два массива и записывать данные то в один, то в другой (данные предыдущего массива плюс данные просматриваемого листа).
Есть ли вариант лучше? Словари и прочие страшные слова пока не предлагать. Не дорос, а хочется понятного :)
Ниже пример действующего кода.
For Each shts In Rng.Value ' перебор листов
------------------
With Worksheets(shts)
lRws = .Cells(Rows.Count, "K").End(xlUp).Row ' последняя строка
Set Rng = .Range("C5:R" & lRws) ' присвоить переменной Rng ссылку на диапазон
End With
------------------
If lRws > 4 Then ' если записи есть
i = 0
ArrTmp = Rng.Value ' значения диапазона листа в переменную
For k = 1 To UBound(ArrTmp, 1) ' скопировать нужные строки
If условие_выполняется Then
i = i + 1
ArrTmp(i, 2) = ArrTmp(k, 2)
ArrTmp(i, 3) = ArrTmp(k, 3)
..................................
End If
Next k
------------------
' выгрузка массива на сводный лист
With Worksheets("свод")
lRws = .Cells(Rows.Count, "K").End(xlUp).Row + 1 ' первая пустая строка
.Cells(lRws, 3).Resize(i, UBound(ArrTmp, 2)).Value = ArrTmp ' массив на лист
End With
End If
Next shts
Работает: из 6-7 листов собирается информация в сводный лист.
1. выбрали лист
2. посмотрели, есть ли данные
3. если да, загнали диапазон в массив
3. записали нужные строки в массив (перезаписали массив) (может быть на каждом листе до 1500)
4. выгрузили найденное на сводный лист
5. выбрали следующий лист...
При таком варианте обращаемся к сводному листу (выгрузка) несколько раз.
Хотелка: последовательно записать в массив данные со всех листов и один раз выгрузить на сводный (так быстрее?).
Проблема известна: нельзя изменять первую размерность массива.
Обход проблемы: создать два массива и записывать данные то в один, то в другой (данные предыдущего массива плюс данные просматриваемого листа).
Есть ли вариант лучше? Словари и прочие страшные слова пока не предлагать. Не дорос, а хочется понятного :)
Ниже пример действующего кода.
For Each shts In Rng.Value ' перебор листов
------------------
With Worksheets(shts)
lRws = .Cells(Rows.Count, "K").End(xlUp).Row ' последняя строка
Set Rng = .Range("C5:R" & lRws) ' присвоить переменной Rng ссылку на диапазон
End With
------------------
If lRws > 4 Then ' если записи есть
i = 0
ArrTmp = Rng.Value ' значения диапазона листа в переменную
For k = 1 To UBound(ArrTmp, 1) ' скопировать нужные строки
If условие_выполняется Then
i = i + 1
ArrTmp(i, 2) = ArrTmp(k, 2)
ArrTmp(i, 3) = ArrTmp(k, 3)
..................................
End If
Next k
------------------
' выгрузка массива на сводный лист
With Worksheets("свод")
lRws = .Cells(Rows.Count, "K").End(xlUp).Row + 1 ' первая пустая строка
.Cells(lRws, 3).Resize(i, UBound(ArrTmp, 2)).Value = ArrTmp ' массив на лист
End With
End If
Next shts