1/ Do code socai trùng tên với name socai nên có tình trạng Module1.SoCai, sửa tên code socai thành socaict thì OK.
2/E8 =IF($D$2="","",VLOOKUP($D$2,CDPS,
6,0)) F8=IF($D$2="","",VLOOKUP($D$2,CDPS,6,0))
F8 thì công thức khá OK nhưng E8 số 6 phải là 5.
Nhưng đây là file tạo socai theo tk và theo ngày nên sumif theo sh CDPS thì không có nghĩa, cdps của tháng 6...Nếu có dùng thì dùng sumproduct, nhưng cũng không được vì cột E, F, L của Sh PhatSinh không = nhau.=>Dùng VBA và sd đầu kỳ, xem lại. SD cuối thì dùng hàm max thì OK
3/
If Left$(TKNo, m) = TK Then ' No
If TKN

ffset(0, -2).Value < S01.Range("C4").Value Then ' Ngay nho hon
i = i + 1
'S01.Range("E8").Value = S01.Range("E8").Value + TKN

ffset(0, 7).Value
Else ' Phat Sinh
S01.Range("E8").Value = S01.Range("E8").Value + TKN
ffset(0, 7).Value
'i = i + 1
S01.Range("A" & i) = TKN

ffset(0, -3)
S01.Range("B" & i) = TKN

ffset(0, -2)
S01.Range("C" & i) = TKN

ffset(0, -1)
S01.Range("D" & i) = TKN

ffset(0, 1)
S01.Range("E" & i) = TKN

ffset(0, 7)
End If
i = i + 1
Tôi có sửa lại phần bold, (xin phép Mr Hiếu), lý do if ngày > hơn thì skip (i=i+1) chớ không S01.Range("E8").Value = S01.Range("E8").Value + TKN

ffset(0, 7).Value (cộng dồn E8). Ngược lại nếu ngày >= ngày đầu thì như S01.Range("E8").Value = S01.Range("E8").Value + TKN

ffset(0, 7).Value mới OK. Do làm vòng lặp nên sửa lại lâu hơn làm mới. Bạn tham khảo MR Hiếu cho rõ hơn.
4/ Thêm một số code kiểm tra nếu chưa tạo sổ cái chi tiết thì phải tạo rồi mới tạo new WB.
5/ Them một số dòng chuyển DL của tmp sang giá trị và bỏ validation => New WB không còn link.
Tóm lại dl bài này phải coi lại số dư đầu kỳ (ngày < ngày đầu.)
Chúc bạn thành công.