Option Explicit
Sub TongHop()
Dim DL1, DL2, Dong1, Dong2
Dim BC1, BC2
Dim Mang
Dim DicM As Object
Dim NCB, NCA, MayB, MayA
Dim i, j, k, x, z, t
Set DicM = CreateObject("Scripting.Dictionary")
DL1 = Sheet1.Range("A1").CurrentRegion
Dong1 = UBound(DL1)
DL2 = Sheet3.Range("A1").CurrentRegion
Dong2 = UBound(DL2)
ReDim NCB(1 To Dong1)
ReDim MayB(1 To 2, 1 To Dong1)
For i = 2 To Dong1
If DL1(i, 4) <> "" Then
If DicM.Exists(DL1(i, 4)) = False Then
k = k + 1
DicM(DL1(i, 4)) = k
NCB(k) = DL1(i, 4)
DL1(i, 4) = k
Else
DL1(i, 4) = DicM(DL1(i, 4))
End If
End If
If DL1(i, 5) <> "" Then
If DicM.Exists(DL1(i, 5)) = False Then
k = k + 1
DicM(DL1(i, 5)) = k
NCB(k) = DL1(i, 5)
DL1(i, 5) = k
Else
DL1(i, 5) = DicM(DL1(i, 5))
End If
End If
If DL1(i, 3) <> "" Then
MayB(1, DL1(i, 3)) = DL1(i, 3)
MayB(2, DL1(i, 3)) = DL1(i, 3)
If x < DL1(i, 3) Then x = DL1(i, 3)
End If
Next i
ReDim Preserve NCB(1 To k)
ReDim Preserve MayB(1 To 2, 1 To x)
DicM.RemoveAll
k = 0
x = 0
ReDim NCA(1 To Dong2)
ReDim MayA(1 To 2, 1 To Dong2)
For i = 2 To Dong2
If DL2(i, 3) <> "" Then
If DicM.Exists(DL2(i, 3)) = False Then
k = k + 1
DicM(DL2(i, 3)) = k
NCA(k) = DL2(i, 3)
DL2(i, 3) = k
Else
DL2(i, 3) = DicM(DL2(i, 3))
End If
End If
If DL2(i, 2) <> "" Then
MayA(1, DL2(i, 2)) = DL2(i, 2)
MayA(2, DL2(i, 2)) = DL2(i, 2)
If x < DL2(i, 2) Then x = DL2(i, 2)
End If
Next i
ReDim Preserve NCA(1 To k)
ReDim Preserve MayA(1 To 2, 1 To x)
DicM.RemoveAll
k = 0
x = 0
For i = 2 To UBound(DL1)
t = DL1(i, 1) & "_" & DL1(i, 2)
If DicM.Exists(t) = False Then
DicM(t) = Array(NCB, MayB)
End If
Mang = DicM(t)
If DL1(i, 4) <> "" Then Mang(0)(DL1(i, 4)) = ""
If DL1(i, 5) <> "" Then Mang(0)(DL1(i, 5)) = ""
If DL1(i, 3) <> "" Then Mang(1)(1, (DL1(i, 3))) = ""
DicM(t) = Mang
Next i
BC1 = Sheet2.Range("A1").CurrentRegion
For i = 2 To UBound(BC1)
For j = 3 To UBound(BC1, 2)
BC1(i, j) = ""
Next j
Next i
For i = 2 To UBound(BC1)
t = BC1(i, 1) & "_" & BC1(i, 2)
If DicM.Exists(t) = True Then
Mang = DicM(t)(0)
k = 0
For j = 1 To UBound(Mang)
If Mang(j) = "" Then k = k + 1
Next j
BC1(i, 3) = k
Mang = DicM(t)(1)
k = 0
For j = 1 To UBound(Mang, 2)
If Mang(1, j) = "" And Mang(2, j) <> "" Then k = k + 1
Next j
BC1(i, 4) = k
End If
Next i
Sheet2.Range("A1").Resize(UBound(BC1), UBound(BC1, 2)).Clear
Sheet2.Range("A1").Resize(UBound(BC1), UBound(BC1, 2)) = BC1
Sheet2.Range("A1").Resize(UBound(BC1), UBound(BC1, 2)).Borders.LineStyle = 1
DicM.RemoveAll
For i = 2 To UBound(DL2)
t = DL2(i, 1) & "_" & DL2(i, 4)
If DicM.Exists(t) = False Then
DicM(t) = Array(NCA, MayA)
End If
Mang = DicM(t)
If DL2(i, 3) <> "" Then Mang(0)(DL2(i, 3)) = ""
If DL2(i, 2) <> "" Then Mang(1)(1, (DL2(i, 2))) = ""
DicM(t) = Mang
Next i
BC2 = Sheet4.Range("A1").CurrentRegion
For i = 2 To UBound(BC2)
For j = 3 To UBound(BC2, 2)
BC2(i, j) = ""
Next j
Next i
For i = 2 To UBound(BC2)
t = BC2(i, 1) & "_" & BC2(i, 2)
If DicM.Exists(t) = True Then
Mang = DicM(t)(0)
k = 0
For j = 1 To UBound(Mang)
If Mang(j) = "" Then k = k + 1
Next j
BC2(i, 3) = k
Mang = DicM(t)(1)
k = 0
For j = 1 To UBound(Mang, 2)
If Mang(1, j) = "" And Mang(2, j) <> "" Then k = k + 1
Next j
BC2(i, 4) = k
End If
Next i
Sheet4.Range("A1").Resize(UBound(BC2), UBound(BC1, 2)).Clear
Sheet4.Range("A1").Resize(UBound(BC2), UBound(BC1, 2)) = BC2
Sheet4.Range("A1").Resize(UBound(BC2), UBound(BC1, 2)).Borders.LineStyle = 1
Sheet5.Range("A2:B1000000").Clear
Sheet5.Range("A2").Resize(UBound(NCA), 1) = Application.Transpose(NCA)
Sheet5.Range("B2").Resize(UBound(NCB), 1) = Application.Transpose(NCB)
Sheet5.Range("A1").CurrentRegion.Borders.LineStyle = 1
End Sub