Sub cal()
On Error Resume Next
Dim ArrTram, ArrDulieu, ArrKetQua, Dic, Dong As Long, i As Long, j As Long
ArrTram = Range([B1048576].End(xlUp), [B7]).Value
ReDim ArrKetQua(1 To UBound(ArrTram, 1), 1 To 24)
ArrDulieu = Range([AH1048576].End(xlUp), [AU6]).Value
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(ArrTram, 1)
Dic.Add ArrTram(i, 1), i
Next
ReDim ArrTram(1 To UBound(ArrTram, 1), 1 To 7) As Double
For i = 1 To UBound(ArrDulieu, 1)
If Dic.Exists(Left(ArrDulieu(i, 1), 5)) Then
Dong = CLng(Dic.Item(Left(ArrDulieu(i, 1), 5)))
ArrKetQua(Dong, ArrTram(Dong, 7) * 3 + 1) = ArrDulieu(i, 5)
ArrKetQua(Dong, ArrTram(Dong, 7) * 3 + 2) = ArrDulieu(i, 3)
ArrKetQua(Dong, ArrTram(Dong, 7) * 3 + 3) = ArrDulieu(i, 14)
ArrTram(Dong, 1) = ArrTram(Dong, 1) + ArrDulieu(i, 5)
ArrTram(Dong, 2) = ArrTram(Dong, 2) + ArrDulieu(i, 3)
ArrTram(Dong, 3) = ArrTram(Dong, 3) + ArrDulieu(i, 14)
If ArrDulieu(i, 5) <> vbNullString Then ArrTram(Dong, 4) = ArrTram(Dong, 4) + 1
If ArrDulieu(i, 3) <> vbNullString Then ArrTram(Dong, 5) = ArrTram(Dong, 5) + 1
If ArrDulieu(i, 14) <> vbNullString Then ArrTram(Dong, 6) = ArrTram(Dong, 6) + 1
ArrTram(Dong, 7) = ArrTram(Dong, 7) + 1
End If
Next
For i = 1 To UBound(ArrTram, 1)
For j = 1 To 3
ArrTram(i, j) = ArrTram(i, j) / IIf(ArrTram(i, j + 3) = 0, 1, ArrTram(i, j + 3))
Next
Next
[D7:F7].Resize(UBound(ArrTram, 1)).Value = ArrTram
[I7:AF7].Resize(UBound(ArrKetQua, 1)).Value = ArrKetQua
End Sub