Есть код, который работает при небольшом количестве строк в книгах Книга СБ собирает последовательно файлы 1,2,3 лежащие в одной папке
Код
For Each Filename In coll
Set WB = Nothing: Set WB = Workbooks.Open(Filename, False, True)
If WB Is Nothing Then ' не удалось открыть файл
pi.Log vbTab & "ОШИБКА при загрузке файла. Файл не обработан."
Else ' файл успешно открыт
Set sh = WB.Worksheets("Сбор")
LastRow = WorksheetFunction.CountIf(sh.Range(sh.Cells(4, 2), sh.Cells(Cells(Rows.Count, 2).End(xlUp).Row, 2)), ">" & 0) + 5
Set ra = sh.Range(sh.Range("a4"), sh.Range("b" & LastRow + 1)).Resize(, 36)
' ==== переносим данные в наш файл (shd - кодовое имя листа, куда помещаем данные)
shd.Range("a" & shd.Rows.Count).End(xlUp).Offset(1).Resize(ra.Rows.Count, ra.Columns.Count).Value = ra.Value
WB.Close False: DoEvents ' закрываем обработанный файл без сохранения изменений
pi.Log vbTab & "Файл успешно обработан."
End If
Next
Если строк в оригиналах в книге 5000 допустим, то обрабатываются все книги прогресс баром, а результат выгрузка только из первой открытой. Структура оригиналов такая же как и файлы 1,2,3. Не могу понять в чем причина. подскажите пожалуйста где ошибки
For Each Filename In coll
Set WB = Nothing: Set WB = Workbooks.Open(Filename, False, True)
If WB Is Nothing Then ' не удалось открыть файл
pi.Log vbTab & "ОШИБКА при загрузке файла. Файл не обработан."
Else ' файл успешно открыт
Set sh = WB.Worksheets("Сбор")
lr = Cells(Rows.Count, 1).End(xlUp).Row
For i = 4 To lr
If Not IsEmpty(sh.Cells(i, 1)) And sh.Cells(i, 15) <> 0 Then
If cell Is Nothing Then
Set cell = sh.Range(sh.Cells(i, 1), sh.Cells(i, 17))
Else
Set cell = Union(cell, sh.Range(sh.Cells(i, 1), sh.Cells(i, 17)))
End If
End If
Next i
If Not cell Is Nothing Then cell.Copy
shd.Range("a" & shd.Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
WB.Close False: DoEvents
pi.Log vbTab & "Файл успешно обработан."
End If
Set cell = Nothing
Next
Не вдавался в сильные подробности, но вижу нестыковку определения последней ячейки здесь: LastRow = WorksheetFunction.CountIf(sh.Range(sh.Cells(4, 2), sh.Cells(Cells(Rows.Count, 2).End(xlUp).Row, 2)), ">" & 0) + 5 обратите внимание, что последняя строка определяется на активном листе, но используется для листа sh. Скорее всего правильно было бы делать так:
причина проста - у Вас в файлах в столбце В не числа, а числа, записанные как текст. Вам всего лишь надо-то определять последнюю строку без всяких танцев с бубном в виде CountIf. Т.е. вместо этой страшной строки: