Lưu ý:Bạn ơi, code của bạn là chuẩn rồi. Tuyệt vời, mình đã thử hơn 280.000 dòng, chạy tốt, file không quá nặng như lúc đầu mình làm.
Giờ phiền bạn giúp 1 lần nữa, vì mình định bổ sung thêm 3 cột mà lúc đầu mình không nghĩ tới, bạn giúp mình lần nữa nhé. chuyển 3 cột này dùng bằng code VBA để tính để nhẹ file.
1. Các cột ngày tháng không chứa ngày tháng chuẩn. Hãy đưa về dữ liệu chuẩn.
2. AN5:AS5 chỉ chứa các tên như SBW3, Đoạn "Lớp " do định dạng mà có. Tương tự hãy sửa thành AM5 = SD, muốn có thêm "Lớp " thì dùng định dạng.
Mã:
Sub Copy_remove_duplicate()
Dim lastRow As Long, r As Long, c As Long, ten_lop As String, ngay, ma, dulieu(), ngay_lop(), tieude(), dic As Object, lop As Object
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Attendant")
Range("AL6:AT10000").ClearContents
lastRow = sh.Cells(Rows.Count, "L").End(xlUp).Row
If lastRow < 6 Then Exit Sub
dulieu = sh.Range("L6:L" & lastRow + 1).Value
ngay_lop = sh.Range("W6:Y" & lastRow + 1).Value
tieude = sh.Range("AL5:AS5").Value
Set dic = CreateObject("Scripting.Dictionary")
dic.comparemode = vbTextCompare
For r = 1 To UBound(dulieu) - 1
ngay_lop(r, 1) = Trim(Replace(ngay_lop(r, 1), "Class", "", , , vbTextCompare)) & ngay_lop(r, 3) ' tao ten lop de nhap vao cot Z
If Not dic.exists(dulieu(r, 1)) Then
Set lop = CreateObject("Scripting.Dictionary")
lop.comparemode = vbTextCompare
If InStr(1, ngay_lop(r, 1), "SD", vbTextCompare) = 1 Then
lop.Add "SD", 1
Else
lop.Add ngay_lop(r, 1), ngay_lop(r, 2)
End If
dic.Add CStr(dulieu(r, 1)), lop
Else
Set lop = dic.Item(dulieu(r, 1))
If InStr(1, ngay_lop(r, 1), "SD", vbTextCompare) = 1 Then
ten_lop = "SD"
ngay = 1
Else
ten_lop = ngay_lop(r, 1)
ngay = ngay_lop(r, 2)
End If
If Not lop.exists(ten_lop) Then
lop.Add ten_lop, ngay
Else
If ten_lop = "SD" Then
lop.Item(ten_lop) = lop.Item(ten_lop) + 1
Else
If ngay_lop(r, 2) < lop.Item(ten_lop) Then lop.Item(ten_lop) = ngay_lop(r, 2)
End If
End If
Set dic.Item(dulieu(r, 1)) = lop
End If
Next r
ReDim dulieu(1 To dic.Count, 1 To 9)
r = 0
For Each ma In dic.keys
r = r + 1
dulieu(r, 1) = "'" & ma
Set lop = dic.Item(ma)
For c = 2 To 8
ten_lop = tieude(1, c)
If lop.exists(ten_lop) Then
dulieu(r, c) = lop.Item(ten_lop)
If c > 2 Then dulieu(r, 9) = dulieu(r, 9) + 1
End If
Next c
Next ma
With sh
.Range("Z6").Resize(UBound(ngay_lop)).Value = ngay_lop ' cot Z
.Range("AL6:AT6").Resize(UBound(dulieu, 1)).Value = dulieu
End With
Set dic = Nothing
Set lop = Nothing
End Sub
Bài đã được tự động gộp:
Anh nghĩ thế là sai. Vài ngày nữa người ta đọc các bài viết về chủ đề PT, các quà tặng của anh, thì kiến thức người ta nâng cao thêm. Lúc đó người ta sẽ mở lại bài của anh trongchủ đề này, vừa đọc vừa gật gù, thỉnh thoảng lại vỗ đùi đánh đét một cái vì khoái chí.Anh mô tả đúng, anh viết code, thì Pivot table của tôi bị ế mất
Lần chỉnh sửa cuối: