Это далеко не идеальное решение, и ему по-прежнему требуется некоторая обработка ошибок для решения повседневных проблем ... однако это должно дать вам хорошую отправную точку в том, как манипулировать вашими данными, и делать это без чтения туда-сюда из электронная таблица несколько раз (хотя для пары строк это не имеет значения, для нескольких тредов это имеет значение).
Option Explicit
Sub getNonPermanents()
Dim wb As Workbook: Set wb = ActiveWorkbook 'or ThisWorkbook, or the name of the workbook where data is
Dim ws As Worksheet
Dim R As Long, C As Long, X As Long
Dim lRow As Long
Dim arrData
Dim arrNonPerm() As String: ReDim arrNonPerm(1 To 3, 1 To 1)
For Each ws In wb.Worksheets()
If ws.Name = "Sheet1" Or ws.Name = "Sheet2" Or ws.Name = "Sheet3" Then 'Or could just be ws.Name <> "Sheet 4", and/or other more elegant ways to deal with this
lRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row 'Get the last row in the current sheet
arrData = ws.Range(ws.Cells(2, 1), ws.Cells(lRow, 3)) 'Allocate all data to an array
For R = LBound(arrData) To UBound(arrData) 'Loop through the data, and if any are "No"....
If arrData(R, 3) = "No" Then
X = X + 1
ReDim Preserve arrNonPerm(1 To 3, 1 To X) 'Increase the array as needed
For C = LBound(arrData, 2) To UBound(arrData, 2)
arrNonPerm(C, X) = arrData(R, C) 'Allocate to the non perm array
Next C
End If
Next R
End If
Next ws
Erase arrData
ReDim arrData(LBound(arrNonPerm, 2) To UBound(arrNonPerm, 2), LBound(arrNonPerm) To UBound(arrNonPerm))
For R = LBound(arrNonPerm, 2) To UBound(arrNonPerm, 2) 'Reallocate the data to an array to be ready to put it back in the sheet
For C = LBound(arrNonPerm) To UBound(arrNonPerm)
arrData(C, R) = arrNonPerm(R, C)
Next C
Next R
With wb.Worksheets("Sheet4")
lRow = .Cells(.Rows.Count, 1).End(xlUp).row
.Range(.Cells(lRow + 1, 1), .Cells(lRow + UBound(arrData), 3)) = arrData 'Add the data at the end of existing data (i.e. headers the very least).
End With
End Sub