Sub CongNo()
Dim Wf As Object, Cl As Collection
Dim Tng As Date, Dng As Date, Kq(), Tg(), Id, Tk, Sd, Tm1, Tm2, eR, i, j
ReDim Kq(1 To 1000, 1 To 9)
Set Dic = CreateObject("Scripting.Dictionary")
Set Wf = WorksheetFunction
Tng = CDate(Sheet6.[F5]): Dng = CDate(Sheet6.[H5]): Tk = Sheet6.[F4]
eR = Sheet1.[N65000].End(xlUp).Row - 2
'Tong hop cac KH co trong DM
Tm1 = Sheet8.Range("B3:H" & Sheet8.[B65000].End(xlUp).Row)
For i = 1 To UBound(Tm1, 1)
If Tm1(i, 5) = Tk Then
If Not Dic.exists(Tm1(i, 1)) Then
Id = Id + 1
Dic.Add Tm1(i, 1), Id
Kq(Id, 1) = Id
Kq(Id, 2) = Tm1(i, 1)
Kq(Id, 3) = Tm1(i, 2)
Sd = Tm1(i, 6) - Tm1(i, 7) + Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 1), _
Sheet1.[D2].Resize(eR), "<" & Tng, Sheet1.[J2].Resize(eR), Tk) - Wf.SumIfs(Sheet1.[N2].Resize(eR), _
Sheet1.[Q2].Resize(eR), Tm1(i, 1), Sheet1.[D2].Resize(eR), "<" & Tng, Sheet1.[K2].Resize(eR), Tk)
If Sd > 0 Then
Kq(Id, 4) = Sd: Kq(Id, 5) = 0
Else
Kq(Id, 4) = 0: Kq(Id, 5) = -1 * Sd
End If
Kq(Id, 6) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 1), _
Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[J2].Resize(eR), Tk)
Kq(Id, 7) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 1), _
Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[K2].Resize(eR), Tk)
If Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7) > 0 Then
Kq(Id, 8) = Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7): Kq(Id, 9) = 0
Else
Kq(Id, 8) = 0: Kq(Id, 9) = -1 * (Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7))
End If
End If
End If
Next
'Soat KH khong co trong DM
Tm1 = Sheet1.[A2:R2].Resize(eR)
For i = 1 To UBound(Tm1, 1)
If Tm1(i, 10) = Tk And Not Dic.exists(Tm1(i, 17)) Then
Id = Id + 1
Dic.Add Tm1(i, 17), Id
Kq(Id, 1) = Id
Kq(Id, 2) = Tm1(i, 17)
Kq(Id, 4) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 17), _
Sheet1.[D2].Resize(eR), "<" & Tng, Sheet1.[J2].Resize(eR), Tk) - Wf.SumIfs(Sheet1.[N2].Resize(eR), _
Sheet1.[Q2].Resize(eR), Tm1(i, 17), Sheet1.[D2].Resize(eR), "<" & Tng, Sheet1.[K2].Resize(eR), Tk)
If Kq(Id, 4) < 0 Then
Kq(Id, 5) = -1 * Kq(Id, 4)
Kq(Id, 4) = 0
End If
Kq(Id, 6) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 17), _
Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[J2].Resize(eR), Tk)
Kq(Id, 7) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 17), _
Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[K2].Resize(eR), Tk)
Kq(Id, 8) = IIf(Kq(Id, 6) - Kq(Id, 7) > 0, Kq(Id, 6) - Kq(Id, 7), 0)
Kq(Id, 9) = IIf(Kq(Id, 7) - Kq(Id, 6) > 0, Kq(Id, 7) - Kq(Id, 6), 0)
ElseIf Tm1(i, 11) = Tk And Not Dic.exists(Tm1(i, 18)) Then
Id = Id + 1
Dic.Add Tm1(i, 18), Id
Kq(Id, 1) = Id
Kq(Id, 2) = Tm1(i, 18)
Kq(Id, 6) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 18), _
Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[J2].Resize(eR), Tk)
Kq(Id, 7) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 18), _
Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[K2].Resize(eR), Tk)
Kq(Id, 8) = IIf(Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7) > 0, Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7), 0)
Kq(Id, 9) = IIf(Kq(Kq(Id, 5) - Kq(Id, 4) + Id, 7) - Kq(Id, 6) > 0, Kq(Id, 5) - Kq(Id, 4) + Kq(Id, 7) - Kq(Id, 6), 0)
End If
Next
Sheet6.[A9:J1000].Clear
Sheet6.[A9].Resize(Id, 9) = Kq
Sheet7.[A10:I10].Copy
Sheet6.[A9].Resize(Id, 9).PasteSpecial xlPasteFormats
Sheet7.[A13:I13].Copy
Sheet6.Range("A" & 9 + Id & ":I" & 9 + Id).PasteSpecial xlPasteFormats
For i = 3 To 8
Sheet6.[A9].Offset(Id, i) = Wf.Sum(Sheet6.[A9].Offset(, i).Resize(Id))
Next
Thoat:
Set Wf = Nothing
Set Dic = Nothing
End Sub
Không đơn giản là chỉ có mã khách hàng trùng đâu, theo mình hiểu là trùng cả mã tài khoản nữa.Bài này chủ yếu vướng ở vấn đề bạn nói ở trên thì tạm thời làm thế này đi, đợi người phù hợp qua giúp.
Tạo thêm một sub phụ nữa, chạy sub này trước, rồi chạy sub TH_CN
Không đơn giản là chỉ có mã khách hàng trùng đâu, theo mình hiểu là trùng cả mã tài khoản nữa.
Tác giả đưa điều kiện theo kiểu "nhát gừng" nên mình bó tay.
http://www.giaiphapexcel.com/forum/...NXT-với-tốc-độ-nhanh-nhất-dữ-liệu-65-532-dòngTôi tham gia bằng Code mới, 1 số vấn đề lưu ý:
Sheet TH congno xóa cột D ẩn đi vì chẳng để làm gì
Sheet DANH MUC được trùng mã KH vì thực chất đây là bảng số dư ngày mở file, 1 KH có thể có số dư trên nhiều TK
Đừng trông thấy Code nhiều mà đánh giá . Phải chạy test thử bằng dữ liệu nha.Mình cũng là dân kế toán nên cũng đụng rồi
Mã:Sub CongNo() Dim Wf As Object, Cl As Collection Dim Tng As Date, Dng As Date, Kq(), Tg(), Id, Tk, Sd, Tm1, Tm2, eR, i, j ReDim Kq(1 To 1000, 1 To 9) Set Dic = CreateObject("Scripting.Dictionary") Set Wf = WorksheetFunction Tng = CDate(Sheet6.[F5]): Dng = CDate(Sheet6.[H5]): Tk = Sheet6.[F4] eR = Sheet1.[N65000].End(xlUp).Row - 2 'Tong hop cac KH co trong DM Tm1 = Sheet8.Range("B3:H" & Sheet8.[B65000].End(xlUp).Row) For i = 1 To UBound(Tm1, 1) If Tm1(i, 5) = Tk Then If Not Dic.exists(Tm1(i, 1)) Then Id = Id + 1 Dic.Add Tm1(i, 1), Id Kq(Id, 1) = Id Kq(Id, 2) = Tm1(i, 1) Kq(Id, 3) = Tm1(i, 2) Sd = Tm1(i, 6) - Tm1(i, 7) + Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 1), _ Sheet1.[D2].Resize(eR), "<" & Tng, Sheet1.[J2].Resize(eR), Tk) - Wf.SumIfs(Sheet1.[N2].Resize(eR), _ Sheet1.[Q2].Resize(eR), Tm1(i, 1), Sheet1.[D2].Resize(eR), "<" & Tng, Sheet1.[K2].Resize(eR), Tk) If Sd > 0 Then Kq(Id, 4) = Sd: Kq(Id, 5) = 0 Else Kq(Id, 4) = 0: Kq(Id, 5) = -1 * Sd End If Kq(Id, 6) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 1), _ Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[J2].Resize(eR), Tk) Kq(Id, 7) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 1), _ Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[K2].Resize(eR), Tk) If Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7) > 0 Then Kq(Id, 8) = Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7): Kq(Id, 9) = 0 Else Kq(Id, 8) = 0: Kq(Id, 9) = -1 * (Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7)) End If End If End If Next 'Soat KH khong co trong DM Tm1 = Sheet1.[A2:R2].Resize(eR) For i = 1 To UBound(Tm1, 1) If Tm1(i, 10) = Tk And Not Dic.exists(Tm1(i, 17)) Then Id = Id + 1 Dic.Add Tm1(i, 17), Id Kq(Id, 1) = Id Kq(Id, 2) = Tm1(i, 17) Kq(Id, 4) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 17), _ Sheet1.[D2].Resize(eR), "<" & Tng, Sheet1.[J2].Resize(eR), Tk) - Wf.SumIfs(Sheet1.[N2].Resize(eR), _ Sheet1.[Q2].Resize(eR), Tm1(i, 17), Sheet1.[D2].Resize(eR), "<" & Tng, Sheet1.[K2].Resize(eR), Tk) If Kq(Id, 4) < 0 Then Kq(Id, 5) = -1 * Kq(Id, 4) Kq(Id, 4) = 0 End If Kq(Id, 6) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 17), _ Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[J2].Resize(eR), Tk) Kq(Id, 7) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 17), _ Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[K2].Resize(eR), Tk) Kq(Id, 8) = IIf(Kq(Id, 6) - Kq(Id, 7) > 0, Kq(Id, 6) - Kq(Id, 7), 0) Kq(Id, 9) = IIf(Kq(Id, 7) - Kq(Id, 6) > 0, Kq(Id, 7) - Kq(Id, 6), 0) ElseIf Tm1(i, 11) = Tk And Not Dic.exists(Tm1(i, 18)) Then Id = Id + 1 Dic.Add Tm1(i, 18), Id Kq(Id, 1) = Id Kq(Id, 2) = Tm1(i, 18) Kq(Id, 6) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 18), _ Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[J2].Resize(eR), Tk) Kq(Id, 7) = Wf.SumIfs(Sheet1.[N2].Resize(eR), Sheet1.[Q2].Resize(eR), Tm1(i, 18), _ Sheet1.[D2].Resize(eR), ">=" & Tng, Sheet1.[D2].Resize(eR), "<=" & Dng, Sheet1.[K2].Resize(eR), Tk) Kq(Id, 8) = IIf(Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7) > 0, Kq(Id, 4) - Kq(Id, 5) + Kq(Id, 6) - Kq(Id, 7), 0) Kq(Id, 9) = IIf(Kq(Kq(Id, 5) - Kq(Id, 4) + Id, 7) - Kq(Id, 6) > 0, Kq(Id, 5) - Kq(Id, 4) + Kq(Id, 7) - Kq(Id, 6), 0) End If Next Sheet6.[A9:J1000].Clear Sheet6.[A9].Resize(Id, 9) = Kq Sheet7.[A10:I10].Copy Sheet6.[A9].Resize(Id, 9).PasteSpecial xlPasteFormats Sheet7.[A13:I13].Copy Sheet6.Range("A" & 9 + Id & ":I" & 9 + Id).PasteSpecial xlPasteFormats For i = 3 To 8 Sheet6.[A9].Offset(Id, i) = Wf.Sum(Sheet6.[A9].Offset(, i).Resize(Id)) Next Thoat: Set Wf = Nothing Set Dic = Nothing End Sub
P/s: Xin lỗi còn 1 số biến khai báo không dùng xóa đi giùm
Theo mình mình chỉ tham gia theo cái lệ chung thôi, còn riêng tư thì phải có ý kiến.
Thực chất Code của mình bắt đầu từ đoạn soat KH không co trong DM là đoạn khá lớn chỉ đề phòng người ta thêm KH ngang không kê khai DM. Nếu chỉ soát theo Danh muc thì đơn giản rất nhiều,
http://www.giaiphapexcel.com/forum/...NXT-với-tốc-độ-nhanh-nhất-dữ-liệu-65-532-dòng
Anh Việt dùng Dictionary va Collection chắc tốc độ ok, anh rảnh thì vào đây ngó coi, kết quả bài 175 anh nhé