Добавьте приведенный ниже код в вашу книгу. После запуска MoveDataToSheet4 у вас будет вывод, как вы описали на sheet4.
Option Explicit
Sub MoveDataToSheet4()
Dim rr As Range
Dim dta() As Variant
Dim topR As Long, foundrow As Long, mrow As Long
Dim x As Integer
Dim LastR As Long
Dim i As Integer
Dim ii As Integer
Dim OutPut() As Variant
Dim nmdRng As Range
Dim ws As Worksheet, ws2 As Worksheet, ws3 As Worksheet, ws4 As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set ws2 = ThisWorkbook.Worksheets("Sheet2")
Set ws3 = ThisWorkbook.Worksheets("Sheet3")
Set ws4 = ThisWorkbook.Worksheets("Sheet4")
With ws
LastR = .Cells(.Rows.Count, "A").End(xlUp).Row
ReDim dta(1 To 6, 2 To LastR)
For Each rr In .Range("A2:E" & LastR)
dta(rr.Column, rr.Row) = rr.Value
Next rr
End With
With ws2
LastR = .Cells(.Rows.Count, "A").End(xlUp).Row
topR = UBound(dta, 2)
ReDim Preserve dta(1 To 6, 2 To (topR + (LastR - 1)))
For Each rr In .Range("A2:E" & LastR)
dta(rr.Column, rr.Row + topR - 1) = rr.Value
If rr.Column = 5 Then
dta(6, rr.Row + topR - 1) = "Sheet2"
End If
Next rr
End With
With ws3
LastR = .Cells(.Rows.Count, "A").End(xlUp).Row
topR = UBound(dta, 2)
ReDim Preserve dta(1 To 6, 2 To (topR + (LastR - 1)))
For Each rr In .Range("A2:E" & LastR)
dta(rr.Column, rr.Row + topR - 1) = rr.Value
If rr.Column = 5 Then
dta(6, rr.Row + topR - 1) = "Sheet3"
End If
Next rr
End With
ReDim OutPut(1 To UBound(dta), 1 To 1)
For i = LBound(dta, 2) To UBound(dta, 2)
foundrow = Empty
For mrow = LBound(OutPut, 2) To UBound(OutPut, 2)
If OutPut(1, mrow) = dta(1, i) And OutPut(2, mrow) = dta(2, i) And i <> mrow Then
foundrow = mrow
Exit For
End If
Next mrow
Dim hold As Variant
If foundrow <> Empty Then
'it exists here and one other place so let's just merge them now
'merge it
For x = LBound(OutPut) To UBound(OutPut) 'for each column
If x = 1 Or x = 2 Then
OutPut(x, foundrow) = dta(x, i)
ElseIf x = 3 Or x = 4 Or x = 5 Or x = 6 Then
If dta(x, i) <> OutPut(x, foundrow) Then
OutPut(x, foundrow) = dta(x, i) & "," & OutPut(x, foundrow)
End If
End If
Next x
Else
ReDim Preserve OutPut(1 To UBound(dta), 1 To UBound(OutPut, 2) + 1)
For x = LBound(OutPut) To UBound(OutPut) 'for each column
OutPut(x, UBound(OutPut, 2)) = dta(x, i)
Next x
End If
Next i
Dim Rng2 As Range
With ws4
For Each Rng2 In .Range("A2:F" & UBound(OutPut, 2))
Rng2.Value = OutPut(Rng2.Column, Rng2.Row)
If Rng2.Column = 5 Then
Rng2.Value = Replace(OutPut(Rng2.Column, Rng2.Row), ",", "")
ElseIf Rng2.Column = 6 Then
If InStr(Rng2.Value, "Sheet3") Then
.Cells(Rng2.Row, Rng2.Column + 1) = "Yes"
'Rng2.Value = ""
Else
.Cells(Rng2.Row, Rng2.Column + 1) = "No"
End If
If InStr(Rng2.Value, "Sheet2") Then
Rng2.Value = "Yes"
Else
Rng2.Value = "No"
End If
End If
Next Rng2
End With
End Sub
Вывод Sheet4 будет выглядеть как на рисунке ниже.