Public Sub Tonghop()
Dim Dic As Object, Tem As String, Arr(1 To 65535, 1 To 19), Darr()
Dim i As Long, j As Long, k As Long, nk As Long, ik As Long, n As Long
' Mang Arr ghi nhan ket qua tam, moi nguoi có 100 dong, nhung dong dau ghi nhan tung cong viec, dòng thu 100 (200, 300...) là dòng tong cong
With Sheets("Tong_hop") 'Xóa vùng du lieu co truoc
i=.Range("R65535").End(3).Row + 1
if i>10 then
.Range("A10:S" & i).Font.Bold = False 'Xoa font Bold
.Range("A10:S" & i).Borders.LineStyle = xlNone 'Xoa duong vien khung
.Range("A10:S" & i).ClearContents 'Xoa du lieu
end if
End With
Set Dic = CreateObject("Scripting.Dictionary")
For n = 1 To 12
If IsNotSheetName("T" & n) Then GoTo Tiep 'Neu sheet "T" & n khong ton tai thì bo qua
i = Sheets("T" & n).Range("E65535").End(xlUp).Row 'Dong cuoi cua bang du lieu
If i < 10 Then GoTo Tiep 'Neu dòng cuoi <10, bang khong co du lieu, bo qua
Darr = Sheets("T" & n).Range("A10:S" & i).Value ' gan mang Darr bang vung du lieu cua cac bang tính T1...T12
For i = 1 To UBound(Darr) ' Vong lap duyet tu phan tu dau den phan tu cuoi cua mang
If Darr(i, 5) <> Empty Then ' kiem tra dieu kien de thuc hien neu cot E cua cac bang tinh T1... khong phai rong
If Darr(i, 3) <> Empty Then Tem = Darr(i, 2) & "#" & Darr(i, 3) & "#" & Darr(i, 4) ' neu cot C (cot Ho) cac thang khac rong thì tao nhom va ghep du lieu tai cac cot B, C, D
'If Darr(i, 3) <> Empty Then Tem = Darr(i, 2) 'Neu có mã so (cot B: Ma so) tung nguoi thì bo dòng lenh tren và thay bang dong lenh nay
If Not Dic.Exists(Tem) Then ' Kiem tra neu nhom (tem) chua co trong Dic
k = k + 1 ' Tang bien dem len 1, k là thu tu cua nguoi thu k
ik = (k - 1) * 100 + 1 ' Thu tu dong trong mang Arr cua nguoi thu k
Dic.Add Tem, ik ' Ghi vào Dic: Key là Tem, Item là thu tu dong cua mang Arr
Arr(ik, 1) = k ' Gán thu tu cua tung nguoi vào cot 1
For j = 2 To 4 ' duyet qua cac cot B, C, D gan du lieu tu mang tam vao mang dich
Arr(ik, j) = Darr(i, j)
Next j
Else
ik = Dic.Item(Tem) + 1 ' Neu co trong Dic tang thu tu dong cua Arr len 1
Dic.Item(Tem) = ik ' Gan thu tu dong moi cua Arr
End If
nk = (Int(ik / 100) + 1) * 100 ' Thu tu dong cua dòng "tong cong" cua nguoi thu k
For j = 5 To 19 ' Duyet tu cot E den cot S trong cac bang tinh T1...
Arr(ik, j) = Darr(i, j) ' Gan mang tam vao mang dich
If j > 7 Then Arr(nk, j) = Arr(nk, j) + Darr(i, j) ' Gan mang tam vao mang dich, cua dong "Tong Cong"
Next j
End If
Next i
Tiep: ' Diem nhay bo qua cac dòng lenh tren neu sheet khong có và du lieu khong có
Next n
ReDim Darr(1 To UBound(Arr), 1 To UBound(Arr, 2)) 'Tao mang Darr ghi nhan ket qua, loai bo cac dòng khong có du lieu trong mang Arr
ik = 0
For i = 1 To k * 100 Step 100 ' Xet nguoi thu i (có k nguoi)
For nk = i To i + 98 ' xet cac dòng ghi nhan cong viec, tu dòng dau den dòng cuoi: 1 toi 99,101 toi 199,201 toi 299 ...
If Arr(nk, 5) = Empty Then Exit For ' Neu het du lieu thi ngung vong lap
ik = ik + 1 ' ik là thu tu dòng mang ket qua, thu tu dong tang len 1
For j = 1 To 19 ' Duyet tat ca các cot mang ket qua (tu cot A den cot S trong sheet)
Darr(ik, j) = Arr(nk, j) ' Gan mang tam vao mang ket qua
Next j
Next nk
ik = ik + 1 ' thu tu dong "tong cong"
For j = 8 To 18 ' Duyet các cot mang ket qua dòng "tong cong" (tu cot H den cot R trong sheet)
Darr(ik, j) = Arr(i + 99, j) ' Gán ket qua vào dong "tong cong"
Next j
Sheets("Tong_hop").Range("A9:S9").Offset(ik).Font.Bold = True 'Dinh dang font là Bold cho dong "tong cong"
Next i
With Sheets("Tong_hop")
.Range("A10").Resize(ik, 19) = Darr ' Gán ket qua vào sheet
.Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders.LineStyle = xlContinuous 'Ke khung toàn bô
.Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders(xlInsideHorizontal).Weight = xlHairline ' duong khung ngang o giua nho hon ngoai bien
End With
End Sub
Private Function IsNotSheetName(ShName As String) As Boolean
' kiem tra sheet khong ton tai
' Neu Sheet khong ton tai tra ve True, nguoi lai Sheet ton tai tra ve False
Dim Tmp As String
On Error Resume Next ' Neu gap loi thì bo qua, chay tiep các dong lenh duoi
Tmp = Sheets(ShName).Name ' Bay loi
If Err.Number <> 0 Then ' Neu bi loi
IsNotSheetName = True ' ket qua Function là True (Sheet khong ton tai)
Err.Clear ' Xoa loi
End If
End Function