strongman4789
Thành viên mới
- Tham gia
- 4/7/13
- Bài viết
- 15
- Được thích
- 1
Tôi mày mò viết code VBA để tính lãi chậm thanh toán của các khách hàng (ví dụ như tính lãi cho việc bán các căn hộ) với các dữ liệu như sau:
- Sheet “DL_SP”: Là danh mục các sản phẩm
- Sheet “DL_Han_TT”: Là danh mục các kỳ hạn than toán của các sản phẩm
- Sheet “DL_TT”: Là dữ liệu các đợt thanh toán thực tế của các khách hàng
Yêu cầu tính lãi quá hạn: Nếu khách hàng chậm thanh toán kỳ thanh toán bất kỳ thi sẽ phải chịu lãi phạt đối =Số tiền quá hạn thực tế * Số ngày quá hạn thực tế*Lãi suất quá hạn/Số ngày của năm.
Khách hàng thanh toán trước hạn thì không được hưởng lãi.
Cách đặt công thức hàm của tôi:
=Tinh_lai_phat(Ma_SP,DL_Han_TT,DL_TT,LS_QH,Ngay_Tinh_lai,Ngay_1_Nam)
Trong đó:
- Ma_SP: Mã của sản phẩm tính lãi
DL_Han_TT: Vùng dữ liệu các kỳ hạn thanh toán của các sản phẩm (gồm 3 cột theo đúng thứ tự như trong sheet)
-DL_TT: Vùng dữ liệu các đợt thanh toán thực tế của các khách hàng (gồm 3 cột theo đúng thứ tự như trong sheet (gồm 3 cột theo đúng thứ tự như trong sheet)
(02 sheet trên đều phải sắp xếp theo cột “Ngày thanh toán” hoặc “Ngày” của kỳ hạn theo thứ tự tăng dần (nếu không hàm sẽ tính sai)
- LS_QH: Lãi suất quá hạn (/năm)
- Ngay_Tinh_lai: Ngày tính lãi quá hạn
- Ngay_1_Nam: Số ngày của 1 năm (mặc định 360 ngày)
Tôi gửi dữ liệu test và code trong file gửi kèm và mong các bạn giúp đỡ:
1. Code của tôi viết để tính lãi theo yêu cầu trên đã đúng chưa?
2. Tôi thấy thuật toán của tôi là chưa tối ưu và dẫn tới tính chậm.
Như trong dữ liệu test của tôi có 230 sản phẩm với tổng số 1.150 kỳ hạn thanh toán và 1.791 giao dịch thanh toán thực tế mà máy phải tính mất 6~7 giây.
Trong đó tôi thấy:
2.1. Với mỗi sản phẩm, code của tôi vẫn phải quét tất cả các kỳ hạn thanh toán của các sản phẩm (ở đây là 1.150 kỳ hạn) để lấy dữ liệu các kỳ hạn thanh toán của sản phẩm đó (trong khi 1 sản phầm chỉ 5 kỳ hạn thanh toán). Tôi chưa tìm ra cách trích xuất nhanh các kỳ hạn thanh toán của riêng sản phẩm đó.
2.2. Với mỗi kỳ hạn thanh toán của 1 sản phẩm, code của tôi vẫn phải quét tất cả các giao dịch thanh toán của tất cả các sản phẩm (ở đây là 1.791 giao dịch) để lấy dữ liệu các giao dịch thanh toán của sản phẩm đó (trong khi 1 sản phẩm thường chỉ 5~10 giao dịch thanh toán). Tôi chưa tìm ra cách trích xuất nhanh các giao dịch thanh toán của riêng sản phẩm đó.
2.3. Thuật toán đang phải xử lý trên dữ liệu đã được sắp xếp ngày tháng theo thứ tự tăng dần, nếu không sẽ tính sai. Tôi chưa tìm ra cách sắp xếp nhanh dữ liệu trong hàm để không phụ thuộc vào việc dữ liệu có được sắp xếp hay chưa.
Trong đó, về vấn đề nêu tại 2.1 và 2.2, tôi có ý tưởng là: Với mỗi sản phẩm, đầu tiên sẽ copy dữ liệu các kỳ hạn thanh toán và dữ liệu các đợt thanh toán của riêng sản phẩm đó ra 2 mảng con riêng, sau đó chỉ xử lý trên 2 mảng con đó (nhưng tôi chưa tìm ra cách nào để copy nhanh dữ liệu này). Nếu xử lý nhanh được cái này thì tốc độ tính toán sẽ được cải thiện đáng kể.
Mong nhận được hỗ trợ của các ACE.
- Sheet “DL_SP”: Là danh mục các sản phẩm
- Sheet “DL_Han_TT”: Là danh mục các kỳ hạn than toán của các sản phẩm
- Sheet “DL_TT”: Là dữ liệu các đợt thanh toán thực tế của các khách hàng
Yêu cầu tính lãi quá hạn: Nếu khách hàng chậm thanh toán kỳ thanh toán bất kỳ thi sẽ phải chịu lãi phạt đối =Số tiền quá hạn thực tế * Số ngày quá hạn thực tế*Lãi suất quá hạn/Số ngày của năm.
Khách hàng thanh toán trước hạn thì không được hưởng lãi.
Cách đặt công thức hàm của tôi:
=Tinh_lai_phat(Ma_SP,DL_Han_TT,DL_TT,LS_QH,Ngay_Tinh_lai,Ngay_1_Nam)
Trong đó:
- Ma_SP: Mã của sản phẩm tính lãi
DL_Han_TT: Vùng dữ liệu các kỳ hạn thanh toán của các sản phẩm (gồm 3 cột theo đúng thứ tự như trong sheet)
-DL_TT: Vùng dữ liệu các đợt thanh toán thực tế của các khách hàng (gồm 3 cột theo đúng thứ tự như trong sheet (gồm 3 cột theo đúng thứ tự như trong sheet)
(02 sheet trên đều phải sắp xếp theo cột “Ngày thanh toán” hoặc “Ngày” của kỳ hạn theo thứ tự tăng dần (nếu không hàm sẽ tính sai)
- LS_QH: Lãi suất quá hạn (/năm)
- Ngay_Tinh_lai: Ngày tính lãi quá hạn
- Ngay_1_Nam: Số ngày của 1 năm (mặc định 360 ngày)
Tôi gửi dữ liệu test và code trong file gửi kèm và mong các bạn giúp đỡ:
1. Code của tôi viết để tính lãi theo yêu cầu trên đã đúng chưa?
2. Tôi thấy thuật toán của tôi là chưa tối ưu và dẫn tới tính chậm.
Như trong dữ liệu test của tôi có 230 sản phẩm với tổng số 1.150 kỳ hạn thanh toán và 1.791 giao dịch thanh toán thực tế mà máy phải tính mất 6~7 giây.
Trong đó tôi thấy:
2.1. Với mỗi sản phẩm, code của tôi vẫn phải quét tất cả các kỳ hạn thanh toán của các sản phẩm (ở đây là 1.150 kỳ hạn) để lấy dữ liệu các kỳ hạn thanh toán của sản phẩm đó (trong khi 1 sản phầm chỉ 5 kỳ hạn thanh toán). Tôi chưa tìm ra cách trích xuất nhanh các kỳ hạn thanh toán của riêng sản phẩm đó.
2.2. Với mỗi kỳ hạn thanh toán của 1 sản phẩm, code của tôi vẫn phải quét tất cả các giao dịch thanh toán của tất cả các sản phẩm (ở đây là 1.791 giao dịch) để lấy dữ liệu các giao dịch thanh toán của sản phẩm đó (trong khi 1 sản phẩm thường chỉ 5~10 giao dịch thanh toán). Tôi chưa tìm ra cách trích xuất nhanh các giao dịch thanh toán của riêng sản phẩm đó.
2.3. Thuật toán đang phải xử lý trên dữ liệu đã được sắp xếp ngày tháng theo thứ tự tăng dần, nếu không sẽ tính sai. Tôi chưa tìm ra cách sắp xếp nhanh dữ liệu trong hàm để không phụ thuộc vào việc dữ liệu có được sắp xếp hay chưa.
Trong đó, về vấn đề nêu tại 2.1 và 2.2, tôi có ý tưởng là: Với mỗi sản phẩm, đầu tiên sẽ copy dữ liệu các kỳ hạn thanh toán và dữ liệu các đợt thanh toán của riêng sản phẩm đó ra 2 mảng con riêng, sau đó chỉ xử lý trên 2 mảng con đó (nhưng tôi chưa tìm ra cách nào để copy nhanh dữ liệu này). Nếu xử lý nhanh được cái này thì tốc độ tính toán sẽ được cải thiện đáng kể.
Mong nhận được hỗ trợ của các ACE.