Я застрял там, где он правильно читает, что у меня есть две строки, которые удовлетворяют условию «Если», но он копирует строку 1 оба раза на отдельные листы, а не строки 8 и 10. Есть ли способ распознать одну ячейку за раз и скопируйте его, если он соответствует условиям.
Я попробовал следующий код
Sub RunReport()
Dim srcSheet As Worksheet
Dim rptSheet As Worksheet
Dim i As Range
Dim srcSheets As Variant
Set rptSheet = ThisWorkbook.Sheets("Report")
Set srcSheets = Worksheets(Array("SheetA", "SheetB", "SheetC", "SheetD"))
For Each srcSheet In srcSheets
For Each i In srcSheet.Range("A5:W358")
If srcSheet.Range(i, "B").Value <> "" And srcSheet.Range(i, "O").Value = "" Then
srcSheet.Cells(i).EntireRow.Copy Destination = rptSheet.Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1, 0)
End If
Next i
Next srcSheet
End Sub
i
— это объект диапазона, Cells(i)
и Range(i, "B")
— неправильный способ ссылки на объект диапазона. например. предполагая i=5
, для ячейки B5 используйте Cells(i, "B")
, Cells(i, 2)
или Range("B" & i)
.
Destination:= ...
Для именованного аргумента используйте :=
вместо =
.
Документация Майкрософт:
Dim iR As Long
For Each srcSheet In srcSheets
For iR = 5 To 358
If srcSheet.Cells(iR, "B").Value <> "" And srcSheet.Cells(iR, "O").Value = "" Then
srcSheet.Rows(iR).Copy Destination:=rptSheet.Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1, 0)
End If
Next
Next srcSheet
Еще одно возможное решение.
Переменная i
относится к строке копируемого диапазона.
Sub RunReport()
Dim srcSheet As Worksheet
Dim rptSheet As Worksheet
Dim i As Range
Dim srcSheets As Variant
Set rptSheet = ThisWorkbook.Sheets("Report")
Set srcSheets = Worksheets(Array("SheetA", "SheetB", "SheetC", "SheetD"))
For Each srcSheet In srcSheets
For Each i In srcSheet.Range("A5:W358").Rows
If i.Columns("B").Value <> "" And i.Columns("O").Value = "" Then
i.Copy Destination:=rptSheet.Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1, 0)
End If
Next i
Next srcSheet
End Sub
Быстрое решение
Sub RunReport()
Dim wb As Workbook: Set wb = ThisWorkbook
Dim srcSheets As Sheets: Set srcSheets = wb.Sheets(Array( _
"SheetA", "SheetB", "SheetC", "SheetD"))
Dim rptSheet As Worksheet: Set rptSheet = wb.Sheets("Report")
Dim rptCell As Range: Set rptCell = rptSheet _
.Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1)
Dim srcSheet As Object, srcRange As Range, srcRow As Range
For Each srcSheet In srcSheets
If TypeOf srcSheet Is Worksheet Then
Set srcRange = srcSheet.Range("A5:W358")
For Each srcRow In srcRange.Rows
If Len(CStr(srcRow.Columns("B").Value)) > 0 _
And Len(CStr(srcRow.Columns("O").Value)) = 0 Then
srcRow.Copy Destination:=rptCell
Set rptCell = rptCell.Offset(1)
End If
Next srcRow
End If
Next srcSheet
End Sub