Giúp code: Lọc theo tháng & Mã khách hàng, rồi tự cấn trừ số tiền công nợ!

Liên hệ QC

Hong.Van

Busy
Tham gia
7/5/12
Bài viết
2,330
Được thích
1,763
Em chào Thầy cô & anh chị!
Đây là bài toán về Lọc theo tháng & Mã khách hàng, rồi tự cấn trừ số tiền công nợ. Em giải thích như sau:
Trong 1 File có nhiều Sheet CNT01, CNT02, ... (CNT01 nghĩa là công nợ tháng 01)
Em muốn code cho kết qủa tại Sheet ChiTiet_CN

1/Tại Sheet ChiTiet_CN:
a/ Khi em chọn tháng tại cell Q4 là CNT01 thì nó nhảy qua Sheet CNT01, nếu chọn CNT02 thì nó nhảy qua Sheet CNT02 để dò tìm
b/ Khi em chọn Mã Khách hàng tại cell Q5: thì nó sẽ lọc ra Mã KH của Sheet cần dò tìm tại cell Q4
c/ Sau khi chọn Tháng & Mã KH xong: thì code sẽ tự cấn trừ "Tiền nợ" (Cột Q) và "Tiền trả" (cột R) dựa vào cùng Mã là "Hóa đơn" (cột L)

Trong File em làm các ví dụ như:
Sheet VD_CNT01_B001: là ví dụ cho kết quả sau khi Chọn CNT01 và B001.....
Em giải thích kết qủa của VD_CNT01_B001 như sau:
Khi lọc B001 của Sheet CNT01 thì ta sẽ có kết quả là các dòng có chữ màu xanh

Dòng thứ 11: có hóa đơn 099 và Tiền nợ là 5.000.000
Dòng thứ 19: có hóa đơn 099 và Tiền Trả là 5.000.000
Như vậy Dòng thứ 11 và 19 sẽ tự cấn trừ và không cần thể hiện nữa (Vì số tiền bằng nhau = 5.000.000)

Dòng thứ 12: có hóa đơn 001 và Tiền nợ là 1.200.000
Dòng thứ 20: có hóa đơn 001 và Tiền Trả là 1.200.000
Như vậy Dòng thứ 12 và 20 sẽ tự cấn trừ và không cần thể hiện nữa (Vì số tiền bằng nhau = 1.200.000)

Dòng thứ 15: có hóa đơn 004 và Tiền nợ là 1.800.000
Dòng thứ 21: có hóa đơn 004 và Tiền Trả là 1.600.000
Ở đây có sự chênh lệch giữa Tiền nợ và Tiền trả là 200.000
Như vậy Dòng thứ 12 và 20 sẽ tự cấn trừ và thể hiện nội dung của dòng 15 và Tiền nợ là 200.000

Dòng thứ 18 :có hóa đơn 005 và Tiền nợ là 2.800.000 (Ở đây khách hàng chưa trả nên vẫn thể hiện nguyên cả dòng này)

Các ví dụ : VD_CNT01_B002, VD_CNT01_B003, VD_CNT01_B004, VD_CNT01_BKVL thì cách thức giống như trên
-------------
Riệng ví dụ: VD_CNT01_131: số 131 ở đây là đại diện cho tất cả các Mã khách hàng, nên nó sẽ tổng hợp cấn trừ theo từng mã KH và hóa đơn

Em xin cảm ơn !
p/s: Đây là bài toán Công nợ, nếu Thầy cô & anh chị chưa hiểu chỗ nào thì xin cứ phản hồi
 

File đính kèm

  • CanTruCongNo_1.xls
    28 KB · Đọc: 49
Em cảm ơn sự hỗ trợ của anh!
Bây giờ có trường hợp như thế này: Trả nợ thừa hay thiếu so với tổng tiền phải thanh toán (Thực tế chuyện này xảy ra thường xuyên)

Em ví dụ: Trong Sheet CNT01, Mã KH là B001. Tổng nợ phải thanh toán của 3 hóa đơn 099,001,004 là 8.000.000 đồng, nhưng khi thực tế thanh tóan thì có thể khách hàng B001 trả 9.000.000 (trả dư 1.000.000) hoặc 7.500.000 (trả thiếu 500.000), trong trường hợp này thì code không chạy. Như vậy trong các trường hợp trên có cách nào xử lý được không?
Nhờ sự giúp đỡ của các Thầy cô & anh chị! Em cảm ơn.

Vậy 1 lần nữa, bạn lại không đưa đủ các khả năng xảy ra của dữ liệu - thành viên kỳ cựu hỏi thế này, hẳn nào TV mới hỏi vu vơ là phải,

Đây là code sửa rui đó chú ý

- Nếu là nhóm hoá đơn (ví như 099,001,004)==>
+ ưu tiên cân bằng với hoá đơn liệt kê trước
+ trả: thiếu sẽ đẩy về các hoá đơn cuối, thừa (dư) thì sẽ liệt kê cả nhóm ra
+bán (nợ) nếu có thể xảy ra (chắc KHÔNG CÓ?) ==> sẽ cũng cân bằng hoá đơn liệt kê trước --> nếu dư nợ thì cũng liệt kê nhóm ra (vì không bit phân bổ sao)


và cũng như các lưu ý bài trước, cần chú ý:


- Mã số hóa đơn chỉ chứa các con số nhé, không chứa chữ cái (để text như hiện thời cũng được

- khi nhóm mã hóa đơn thì phải phân cách bằng dấu "," đó


- bấm Ctrl+F3 để thấy các name, đặt để định vị dữ liệu của các sheets - chú ý các tên cho cell định vị ở các sheets -CNT01 , CNT02 ... đặt đúng theo tên được chọn ở phần kết quả (ô chọn tháng)

down file kèm về test
Và không hiểu số liệu để test, vậy bạn tự test các trường hợp
 

File đính kèm

  • CongNo5.xls
    80.5 KB · Đọc: 18
Upvote 0
- Nếu là nhóm hoá đơn (ví như 099,001,004)==>
+ ưu tiên cân bằng với hoá đơn liệt kê trước
+ trả: thiếu sẽ đẩy về các hoá đơn cuối, thừa (dư) thì sẽ liệt kê cả nhóm ra
+bán (nợ) nếu có thể xảy ra (chắc KHÔNG CÓ?) ==> sẽ cũng cân bằng hoá đơn liệt kê trước --> nếu dư nợ thì cũng liệt kê nhóm ra (vì không bit phân bổ sao)

Và không hiểu số liệu để test, vậy bạn tự test các trường hợp
Sự phân bổ như trên của anh là rất hợp lý rồi, em đã Test chạy rất chuẩn
-----------------
Nguyên văn bởi vodoi2x- bấm Ctrl+F3 để thấy các name, đặt để định vị dữ liệu của các sheets - chú ý các tên cho cell định vị ở các sheets -CNT01 , CNT02 ... đặt đúng theo tên được chọn ở phần kết quả (ô chọn tháng)

Cho em hỏi: có cách nào kg cần fải đặt Name cho mỗi Sheet CNT... không? Vì
1/ C
ác Sheet CNT... của em nó cđịnh từ khối cell L10:S10 trở xuống
2/ Em chuyển File này cho các đồng nghiệp làm việc, nên em sợ họ quên
3/ C
ác Sheet CNT... chỉ tạo mới khi nào có phát sinh, Ví dụ sang tháng Tư thì em mới tạo Sheet CNT04 -> vì vậy các đồng nghiệp em dễ quên tạo Name

---------------------
Em
đang nghiên cứu code của anh đáp dụng cho trường hợp khác, nhưng em nhìn rối quá chưa biết sửa ở chỗ nào, vậy mong anh chỉnh code giúp em cho trường hợp sau:
Code tr
ên là anh viết cho Nợ phải thu (131) (Sheet ChiTiet_131), bây giờ em muốn code cho Nợ phải trả (331) (Sheet ChiTiet_331)
Code kết qủa cho Sheet ChiTiet_331, s
ẽ lấy Số liệu ở các khối cell U10:AB10 trở xuống của các Sheet CNT...
Trong
đó Mã khách hàng bắt đầu bằng ký t"M" và tài khỏan tổng hợp là 331
---------------
File
đính kèm của em, em đã add code của bài #21 của anh vào rồi
V
ậy mong anh giúp em các trường hợp trên
Em c
ảm ơn !
(Đã làm phiền ngày nghĩ lễ của anh, mong anh thông cảm)

P/s: Sao em tìm trong code kg thấy anh sử dụng Name CNT01, CNT02 ... ở đâu nhỉ?
 

File đính kèm

  • CanTruCongNo_Vodoi2x_2.rar
    50.8 KB · Đọc: 33
Lần chỉnh sửa cuối:
Upvote 0
Giờ trong mã hoá đơn có cả chữ??? (ví như TU) ở trong thống kê 331???
 
Upvote 0
Giờ trong mã hoá đơn có cả chữ??? (ví như TU) ở trong thống kê 331???
Em biết anh hướng dẫn trong mã hóa đơn kg có mã là chữ, em đã thử thấy mã là TU thì code vẫn chạy tốt.
Vì sao Mã hóa đơn là chữ, Vì thực tế mình ứng trước tiền hàng cho khách hoặc khách ứng trước tiền hàng cho mình thì khi đó chưa xuất hóa đơn thì sẽ kg biết là hóa đơn số mấy? nên em làm tạm là Mả TU (Nghĩa là tạm ứng) Khi nào có hóa đơn rồi thì em mới sửa lại!
 
Upvote 0
Em biết anh hướng dẫn trong mã hóa đơn kg có mã là chữ, em đã thử thấy mã là TU thì code vẫn chạy tốt.
Vì sao Mã hóa đơn là chữ, Vì thực tế mình ứng trước tiền hàng cho khách hoặc khách ứng trước tiền hàng cho mình thì khi đó chưa xuất hóa đơn thì sẽ kg biết là hóa đơn số mấy? nên em làm tạm là Mả TU (Nghĩa là tạm ứng) Khi nào có hóa đơn rồi thì em mới sửa lại!

bạn phải chú ý các khuyến cáo nhé, đó là mới thử 1 HĐ thôi, chứ 2 HĐ cùng mã Bán hàng trở lên là có vấn đề ngay,

TUY NHIÊN code mới này đã khắc phục điều đó, có thể dùng mã HĐ là text hay số (với lưu ý nếu là số thì 1 giống với 01, 001 ,... 000000001 (9 chữ số) nhé)

Hiện đã đáp ứng cả các y.c khác của bạn

- Bỏ hết các Name, vùng dữ liệu thể hiện ở điạ chỉ ô định vị, và các giá trị như tên sheet data, mã hàng, cũng như KHI NAO xem tài khoản nào 131 hay 331 là tất cả được truyền qua các tham số (xem ở các SUB sự kiện WorkSheet_Change ở các trang sheet code của sheets kết quả sẽ hiểu)

- Đã tính thêm cho tài khoản 331, vùng dữ liệu truyền qua tham số

- thành l ập tên sheet mới thì phải đúng theo mã chọn ở ô G4, và các vị trí định vị vùng dữ liệu theo đúng tham số truyền

- code đã sửa lại cho ngắn đẹp- bạn có thể tự sửa lại khi cần,

Chắc là hy vọng đạt kết quả của bạn

-------
nói thêm ở sheet CNT01, CNT02 ở các vùng L:S và U:AB của bạn đang dùng table thì phải nên vùng dữ liệu đến tận dòng 71 nhé --> để table --khi đó Range.End() sẽ nhận đây là dòng cuối dữ liệu ==>thế code phải đọc và chạy 1 số dòng trắng nhé (dù code đã bỏ qua, nhưng chắc ảnh hưởng chút tốc độ)
 
Lần chỉnh sửa cuối:
Upvote 0
Vẫn chú ý các điều này

Nguyên văn bởi Hong.Van
Em biết anh hướng dẫn trong mã hóa đơn kg có mã là chữ, em đã thử thấy mã là TU thì code vẫn chạy tốt.
Vì sao Mã hóa đơn là chữ, Vì thực tế mình ứng trước tiền hàng cho khách hoặc khách ứng trước tiền hàng cho mình thì khi đó chưa xuất hóa đơn thì sẽ kg biết là hóa đơn số mấy? nên em làm tạm là Mả TU (Nghĩa là tạm ứng) Khi nào có hóa đơn rồi thì em mới sửa lại!

bạn phải chú ý các khuyến cáo nhé, đó là mới thử 1 HĐ thôi, chứ 2 HĐ cùng mã Bán hàng trở lên là có vấn đề ngay,

TUY NHIÊN code mới này đã khắc phục điều đó, có thể dùng mã HĐ là text hay số (với lưu ý nếu là số thì 1 giống với 01, 001 ,... 000000001 (9 chữ số) nhé)

Hiện đã đáp ứng cả các y.c khác của bạn

- Bỏ hết các Name, vùng dữ liệu thể hiện ở điạ chỉ ô định vị, và các giá trị như tên sheet data, mã hàng, cũng như KHI NAO xem tài khoản nào 131 hay 331 là tất cả được truyền qua các tham số (xem ở các SUB sự kiện WorkSheet_Change ở các trang sheet code của sheets kết quả sẽ hiểu)

- Đã tính thêm cho tài khoản 331, vùng dữ liệu truyền qua tham số

- thành l ập tên sheet mới thì phải đúng theo mã chọn ở ô G4, và các vị trí định vị vùng dữ liệu theo đúng tham số truyền

- code đã sửa lại cho ngắn đẹp- bạn có thể tự sửa lại khi cần,

Chắc là hy vọng đạt kết quả của bạn

-------
nói thêm ở sheet CNT01, CNT02 ở các vùng L:S và U:AB của bạn đang dùng table thì phải nên vùng dữ liệu đến tận dòng 71 nhé --> để table --khi đó Range.End() sẽ nhận đây là dòng cuối dữ liệu ==>thế code phải đọc và chạy 1 số dòng trắng nhé (dù code đã bỏ qua, nhưng chắc ảnh hưởng chút tốc độ)

File mới cho mới chuẩn hơn,
 

File đính kèm

  • CanTruCongNo_Vodoi2x_04.rar
    45 KB · Đọc: 53
Upvote 0
Web KT
Back
Top Bottom