Sub CountData()
Dim D$(), tD, tArr, Arr, fArr(), rAr(), rMau(), rMa(), dArr()
Dim tMay$, tMau$, tMa$, rc%
Dim i&, j&, m&, n%, k%, tk%, k1%, k2%, lr&, lc%, UB&
Dim Rng As Range
With ThisWorkbook.Worksheets(1)
With .Range("B4")
lc = 4: lr = .End(xlDown).Row - .Row + 1
tArr = .Resize(lr, lc).Value
End With
Set Rng = .Range("H30") 'Trả kết quả ở H30'
End With
If lr <= 0 Then Exit Sub
For i = 1 To lr: GoSub RepArrH: Next
For m = 1 To k1
Arr = dArr(2, m): UB = UBound(Arr, 2)
rc = (m - 1) * 5 + 1
GoSub RepH
Next
Ends: Set Rng = Nothing 'Erase toàn bộ mảng'
Exit Sub
RepArrH:
GoSub LoopArr: UB = 1
On Error Resume Next
fArr = dArr(2, tk): If Err.Number = 0 Then UB = UBound(fArr, 2) + 1
On Error GoTo 0
ReDim Preserve fArr(1 To lc, 1 To UB)
For j = 1 To lc: fArr(j, UB) = tArr(i, j): Next
ReDim Preserve dArr(1 To 2, 1 To tk): dArr(1, tk) = tMay: dArr(2, tk) = fArr
Return
LoopArr:
If k1 > 0 Or tMay <> vbNullString Then
For j = 1 To k1
If tArr(i, 2) = dArr(1, j) Then
tMay = tArr(i, 2): tk = j: Erase fArr: Return
End If
Next
End If
tMay = tArr(i, 2): k1 = k1 + 1: tk = k1
Return
RepH:
k = 0: k1 = 0: k2 = 0: Erase rMa: Erase rMau: Erase rAr
For i = 1 To UB
D = Split(CStr(Arr(1, i)), "/")
If i > 1 Then
If Int(Right$(D(2), 2)) = Int(Right$(tD(2), 2)) _
And Int(D(1)) = Int(tD(1)) Then 'Month'
If Arr(3, i) <> tMau Then GoSub RepMau
If Arr(4, i) <> tMa Then GoSub RepMa
Else: k = k + 1: GoSub Reset: End If 'Có 2 dòng vì cần ràng buộc cho đến khi mảng tD tồn tại'
Else: k = k + 1: GoSub Reset: End If
tD = D: tMau = Arr(3, i): tMa = Arr(4, i)
Next
Rng(rc, 0).Value = dArr(1, m)
Rng(rc, 1).Resize(5, k).Value = rAr
Return
RepMau: k1 = k1 + 1: ReDim Preserve rMau(1 To k1): rMau(k1) = Arr(3, i): GoSub RepA: Return
RepMa: k2 = k2 + 1: ReDim Preserve rMa(1 To k2): rMa(k2) = Arr(4, i): GoSub RepA: Return
RepA:
ReDim Preserve rAr(1 To 5, 1 To k)
rAr(1, k) = D(1) & "/" & D(2)
rAr(2, k) = k1: rAr(3, k) = Join(rMau, ","):
rAr(4, k) = k2: rAr(5, k) = Join(rMa, ",")
Return
Reset: Erase rMau: Erase rMa: k1 = 0: k2 = 0: GoSub RepMau: GoSub RepMa: Return
End Sub