Так что это не самый чистый код, который я когда-либо делал, но я верю, что он заполнит те части, которые я понимаю, а вы можете заполнить остальные.
Поскольку все сотрудники находятся на одном и том же листе друг под другом, они переходят от i к нижней части листа. Он проверяет наличие «PP» в тексте ячейки и, если он его находит, он начинает проверять эту строку на предмет единиц / часов для передачи. Если тип в этой строке не содержит ошибок, он скопирует данные для этого типа. Это повторяется для каждого типа.
Если в тексте ячейки на первом листе нет «PP», то в качестве альтернативы он проверит имя «Сотрудник», чтобы узнать, чье имя скопировать на лист два для следующих записей.
Теперь код действительно ужасен, потому что он постоянно указывает каждую ячейку, чтобы получить значения из нее. Для меня это был самый быстрый способ получить все, что вы перечислили на своем первом листе, и сделать его легко обновляемым вами в будущем.
Sub Report()
Dim ws1 As Worksheet
Set ws1 = Sheets(1)
Dim ws2 As Worksheet
Set ws2 = Sheets(2)
Dim i As Long
Dim row_current As Long
Dim employee_name_row As Long: employee_name_row = 1
For i = 1 To ws1.Cells(ws1.Rows.count, "A").End(xlUp).row
If InStr(ws1.Cells(i, "A").Value2, "PP") > 0 Then
'getting row to use on sheet 2
row_current = ws2.Cells(ws2.Rows.count, "A").End(xlUp).Offset(1, 0).row
If Not IsError(ws1.Cells(i, "D")) Then 'Cleaning
'period, name
ws2.Cells(row_current, "A").Value2 = ws1.Cells(i, "A").Value2
ws2.Cells(row_current, "B").Value2 = ws1.Cells(employee_name_row, "B").Value2
'task, units, hours
ws2.Cells(row_current, "C").Value2 = ws1.Cells(3, "B").Value2
ws2.Cells(row_current, "E").Value2 = ws1.Cells(i, "C").Value2
ws2.Cells(row_current, "F").Value2 = ws1.Cells(i, "B").Value2
'year
ws2.Cells(row_current, "I").Value2 = ws1.Cells(employee_name_row, "L").Value2
row_current = row_current + 1
End If
If Not IsError(ws1.Cells(i, "G")) Then 'Mopping
'period, name
ws2.Cells(row_current, "A").Value2 = ws1.Cells(i, "A").Value2
ws2.Cells(row_current, "B").Value2 = ws1.Cells(employee_name_row, "B").Value2
'task, units, hours
ws2.Cells(row_current, "C").Value2 = ws1.Cells(3, "E").Value2
ws2.Cells(row_current, "E").Value2 = ws1.Cells(i, "F").Value2
ws2.Cells(row_current, "F").Value2 = ws1.Cells(i, "E").Value2
'year
ws2.Cells(row_current, "I").Value2 = ws1.Cells(employee_name_row, "L").Value2
row_current = row_current + 1
End If
If Not IsError(ws1.Cells(i, "J")) Then 'Scrubbing
'period, name
ws2.Cells(row_current, "A").Value2 = ws1.Cells(i, "A").Value2
ws2.Cells(row_current, "B").Value2 = ws1.Cells(employee_name_row, "B").Value2
'task, units, hours
ws2.Cells(row_current, "C").Value2 = ws1.Cells(3, "H").Value2
ws2.Cells(row_current, "E").Value2 = ws1.Cells(i, "I").Value2
ws2.Cells(row_current, "F").Value2 = ws1.Cells(i, "H").Value2
'year
ws2.Cells(row_current, "I").Value2 = ws1.Cells(employee_name_row, "L").Value2
row_current = row_current + 1
End If
If Not IsError(ws1.Cells(i, "M")) Then 'Wiping
'period, name
ws2.Cells(row_current, "A").Value2 = ws1.Cells(i, "A").Value2
ws2.Cells(row_current, "B").Value2 = ws1.Cells(employee_name_row, "B").Value2
'task, units, hours
ws2.Cells(row_current, "C").Value2 = ws1.Cells(3, "K").Value2
ws2.Cells(row_current, "E").Value2 = ws1.Cells(i, "L").Value2
ws2.Cells(row_current, "F").Value2 = ws1.Cells(i, "K").Value2
'year
ws2.Cells(row_current, "I").Value2 = ws1.Cells(employee_name_row, "L").Value2
row_current = row_current + 1
End If
If Len(ws1.Cells(i, "N")) > 0 Then 'Jumping
'period, name
ws2.Cells(row_current, "A").Value2 = ws1.Cells(i, "A").Value2
ws2.Cells(row_current, "B").Value2 = ws1.Cells(employee_name_row, "B").Value2
'task, hours
ws2.Cells(row_current, "C").Value2 = ws1.Cells(3, "N").Value2
ws2.Cells(row_current, "F").Value2 = ws1.Cells(i, "N").Value2
'year
ws2.Cells(row_current, "I").Value2 = ws1.Cells(employee_name_row, "L").Value2
row_current = row_current + 1
End If
If Len(ws1.Cells(i, "O")) > 0 Then 'Swimming
'period, name
ws2.Cells(row_current, "A").Value2 = ws1.Cells(i, "A").Value2
ws2.Cells(row_current, "B").Value2 = ws1.Cells(employee_name_row, "B").Value2
'task, hours
ws2.Cells(row_current, "C").Value2 = ws1.Cells(3, "O").Value2
ws2.Cells(row_current, "F").Value2 = ws1.Cells(i, "O").Value2
'year
ws2.Cells(row_current, "I").Value2 = ws1.Cells(employee_name_row, "L").Value2
row_current = row_current + 1
End If
If Len(ws1.Cells(i, "P")) > 0 Then 'Other
'period, name
ws2.Cells(row_current, "A").Value2 = ws1.Cells(i, "A").Value2
ws2.Cells(row_current, "B").Value2 = ws1.Cells(employee_name_row, "B").Value2
'task, hours
ws2.Cells(row_current, "C").Value2 = ws1.Cells(3, "P").Value2
ws2.Cells(row_current, "F").Value2 = ws1.Cells(i, "P").Value2
'year
ws2.Cells(row_current, "I").Value2 = ws1.Cells(employee_name_row, "L").Value2
row_current = row_current + 1
End If
If Len(ws1.Cells(i, "Q")) > 0 Then 'Computer Probs
'period, name
ws2.Cells(row_current, "A").Value2 = ws1.Cells(i, "A").Value2
ws2.Cells(row_current, "B").Value2 = ws1.Cells(employee_name_row, "B").Value2
'task, hours
ws2.Cells(row_current, "C").Value2 = ws1.Cells(3, "Q").Value2
ws2.Cells(row_current, "F").Value2 = ws1.Cells(i, "Q").Value2
'year
ws2.Cells(row_current, "I").Value2 = ws1.Cells(employee_name_row, "L").Value2
row_current = row_current + 1
End If
ElseIf InStr(ws1.Cells(i, "A").Value2, "Name") > 0 Then
employee_name_row = i
End If
Next i
End Sub