Public Sub GPE()
Dim Dic As Object, sArr(), Ws As Worksheet, i As Integer, Rng As Range 'Khai báo các biến cần thiết
sArr() = Sheet1.Range("A2:A" & Sheet1.Range("A65000").End(xlUp).Row).Value 'Lấy danh sách các mã trong dữ liệu
Set Dic = CreateObject("Scripting.Dictionary") 'Khai báo danh sách
Application.ScreenUpdating = False 'Tắt cập nhật màn hình
With Sheet1
.Range("K1").Value = .Range("A1").Value 'Đặt giá trị ô K1 bằng ô A1, đây là cột điều kiện lọc
For i = 1 To UBound(sArr, 1) 'Duyệt qua tất cả các mã dữ liệu đã đưa vào mảng sArr
If Not Dic.exists(sArr(i, 1)) Then 'Nếu mã này chưa lọc, tức chưa có trong danh sách Dic
Dic.Add sArr(i, 1), "" 'Thêm mã này vào danh sách Dic
.Range("K2").Value = sArr(i, 1) 'Đặt giá trị ô K2 bằng mã chưa lọc này sArr(i,1)
Set Ws = Worksheets.Add(, Sheet1) 'Thêm sheet mới phía sau sheet1
Ws.Name = sArr(i, 1) 'Đặt tên sheet mới này là mã mới thêm sArr(i,1)
.Range("A1:G28").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=.Range("K1:K2"), CopyToRange:=Ws.Range("A1:G1"), Unique:=False 'Lọc danh sách dữ liệu có mã mới sArr(i,1) sang sheet mới .
Set Rng = Ws.Range("A65000").End(xlUp) 'Đặt vùng Rng là ô cuối cùng trong cột A của sheet mới
End If
Next i
.Range("K1:K2").ClearContents 'Xóa giá trị 2 ô K1 và K2 trong sheet1 (2 Ô này là 2 ô tạm để đặt điều kiện lọc)
End With
Sheets(Dic.Keys).Move 'Chọn tất cả các sheet mới thêm vào và di chuyển sang file mới
Set Dic = Nothing 'Giải phóng bộ nhớ cho danh sách Dic
Application.ScreenUpdating = True 'Mở cập nhật màn hình
MsgBox "Da tach xong" 'Thông báo đã thực hiện xong
End Sub