Thời gian rảnh nên mình là file quản lý công nợ này. Mình up lên mọi người tham khảo nha!
Tôi thấy bạn thiết kế chương trình khá gọn gàng, đơn giản và dễ dùng. Để hoàn thiện hơn bạn cải tiến tốc độ chạy cho nhanh nhé. Hiện nay mới chỉ có vài dòng chứng từ thôi nhưng các báo cáo chạy chậm lắm.
.Vài lời góp ý:
1. Sheet THCNO vẫn có cái checkbox y như topic chương trình quản lý hàng hoá của NHDK (chắc cùng tác giả), chỉ có mỗi 1 mục đích là dấu dòng:
- Đâu cần phải insert sẵn 2000 dòng trống rồi phải dấu dòng?
- Đã dùng công thức SumIf thì đâu cần VBA?
- Đã là tổng hợp mọi khách hàng thì chỉ cần copy DS khách hàng trong danh mục qua, rồi dùng công thức hoặc VBA tính tổng phát sinh và dư nợ cuối kỳ. Có bao nhiêu KH thì chép bấy nhiêu dòng, không cần tới 2000 dòng và cũng không cần click chuột phải để chọn khách hàng.
- Nên có thêm lựa chọn :Tổng hợp công nợ từ ngày A đến ngày B, hoặc theo tháng - năm
2. Cũng 1 lỗi y như topic vừa nêu: không dùng name động nên cái listbox xổ xuống có tới 9000 dòng trắng.
3. Bạn muốn mọi người tham khảo mà vẫn để pass VBA. Chả biết có cái gì cao siêu trong đó.
Như anh Tuân nói: file chạy quá chậm, tôi muốn tìm lý do chậm để cải tiến cho bạn chẳng hạn, đụng đầu vào bức tường đòi pass 1 cái là mất hứng.
4. Không có form nhập liệu, nhập trực tiếp trên sheet thì không sao. Nhưng chỗ cần nhấn chuột phải chọn mã KH cho khỏi nhập liệu nhầm thì không làm.
5. Trong bảng đối chiếu công nợ: Có mục chọn công nợ từ ngày ... đến ngày, nhưng dù chọn ngày bắt đầu là ngày mấy đi nữa, số dư đầu kỳ cũng là số dư đầu kỳ của ngày mở sổ (sheet THCNO). Và chỉ có 2 cells đơn giản PS nợ, có mà phải dùng VBA!
6. ....
Không thấy cải thiện gì hơn so với chương trình quản lý hàng hoá
Em cứ bị "dụ dổ" vì cái chổ này đây ---> Sửa 1 chổ đâu có được, vì cứ thấy ngứa mắt khi ngó sang chổ khác... thế là lại.. sửa tiếp ---> Sửa 1 hồi thành ra là.. SỬA TẤTTóm lại, là bất cứ ai muốn sửa vào file này đều phải làm rất nhiều việc, liên quan đến nhiều kiến thức, làm xong coi như chẳng còn gì là của "công ty NH_DK" cả. Do đó phải tự làm thôi.
Option Explicit
Sub tao_so()
Dim rng As Range
Dim eR As Long, iR As Long
Application.ScreenUpdating = False
S6.Range("A7:G65000").ClearContents
With s3
eR = .Range("A65535").End(3).Row
.Range("A2:A" & eR).Resize(, 3).Copy S6.Range("A7")
End With ' Kiem tra dum em code duoi nhe! Sao no lai khong ra ket qua dung!?
iR = S6.Cells(Cells.Rows.Count, "A").End(3).Row
Range("D7").Formula = "=SUMPRODUCT(--(TH_CNO!$C$4<=DATA!$A2),--(TH_CNO!$E$4>=DATA!A2),--(DATA!D2=TH_CNO!$A1),DATA!G2)"
Range("E7").Formula = "=SUMPRODUCT(--(TH_CNO!$C$4<=DATA!$A2),--(TH_CNO!$E$4>=DATA!A2),--(DATA!D2=TH_CNO!$A1),DATA!H2)"
Range("F7").Formula = "=max(C7+D7-e7,0)"
Set rng = S6.Range("D7:F" & iR)
Range("D7:F7").Copy rng
'rng.Value = rng.Value
Set rng = Nothing
End Sub
Thử sửa code lại như vầy xem có đúng không (chú ý những chỗ màu đỏ):Em đã làm thế này rùi mà vẫn chưa có kết quả mong muốn. Em nhờ các sư phụ sửa dùm em nha!
Sub tao_so()
Dim rng As Range
Dim eR As Long, iR As Long, [COLOR=red]iR1 As Long[/COLOR]
Application.ScreenUpdating = False
S6.Range("A7:G65000").ClearContents
With s3
eR = .Range("A65535").End(3).Row
[COLOR=red]iR1 = S1.[A65536].End(xlUp).Row[/COLOR]
.Range("A2:A" & eR).Resize(, 3).Copy S6.Range("A7")
End With
iR = S6.Cells(Cells.Rows.Count, "A").End(3).Row
[COLOR=red]Range("D7").Formula = "=SUMPRODUCT((TH_CNO!$C$4<=DATA!$A$2:$A$" & iR1 & ")*(TH_CNO!$E$4>=DATA!$A$2:$A$" & iR1 & ")*(DATA!$D$2:$D$" & iR1 & "=TH_CNO!A7),DATA!$G$2:$G$" & iR1 & ")"[/COLOR]
[COLOR=red] Range("E7").Formula = "=SUMPRODUCT((TH_CNO!$C$4<=DATA!$A$2:$A$" & iR1 & ")*(TH_CNO!$E$4>=DATA!$A$2:$A$" & iR1 & ")*(DATA!$D$2:$D$" & iR1 & "=TH_CNO!A7)*DATA!$H$2:$H$" & iR1 & ")"[/COLOR]
Range("F7").Formula = "=MAX(C7+D7-E7,0)"
Set rng = S6.Range("D7:F" & iR)
Range("D7:F7").Copy rng
'rng.Value = rng.Value
Set rng = Nothing
End Sub
Sub tao_so()
Dim eR As Long, iR As Long
Application.ScreenUpdating = False
S6.Range("A7:G65000").Clear
eR = s3.Range("A65535").End(3).Row
s3.Range("A2:A" & eR).Resize(, 3).Copy S6.Range("A7")
S5.[A18:G18].Copy: S6.[A7:G7].Resize(eR - 1).PasteSpecial Paste:=xlPasteFormats
S5.[D18:F18].Copy: S6.[D7:F7].Resize(eR - 1).PasteSpecial Paste:=xlPasteFormulas
S5.[A19:G19].Copy S6.[a7].Offset(eR - 1)
S6.[A7:H7].Resize(eR).Value = S6.[A7:H7].Resize(eR).Value
S5.[a21:H22].Copy S6.[a7].Offset(eR + 2)
End Sub
Em đã hoàn thiện file Quản lý công nợ này rùi. Nhưng có điều sao dung lượng của nó tăng lớn thế!? Nhờ các AC tư vấn thêm cho em nha!
Em đã hoàn thiện file Quản lý công nợ này rùi. Nhưng có điều sao dung lượng của nó tăng lớn thế!? Nhờ các AC tư vấn thêm cho em nha!
Xoá tất cả dòng thừa sheet CNO_CTI và sheet TH_CNO, file chỉ còn 148Kb.
Em đã sửa 1 số lỗi như anh hướng dẫn rùi. Còn cái này:Chính dòng lệnh sau đây tạo ra dòng thừa:
S6.Range("A7:G65000").Clear
Chỉ xoá đến dòng cuối có dữ liệu thôi.
Nhận xét:
Bạn không chú ý 1 vài điều tôi gợi ý ở trên:
- Khi chọn báo cáo từ ngày A đến ngày B, thì số dư đầu ngày A phải tính lại, chứ không phải lấy số dư đầu năm. Cụ thể là chưa tính toán cột C sheet tổng hợp.
- Tôi đã lưu ý là phương pháp này chậm, chỉ nên dùng cho khoảng tối đa 20 khách hàng.
- Sửa xong mấy cái này, chỉ có thể nói là hoàn thiện sheet THop, còn các sheet khác chưa ngó tới.
Vài gợi ý về code:
- Các câu lệnh gán công thức cho cợt C, D, E, F, có thể gán 1 lúc cho cả 1 range, không cần phải gán cho 1 dòng rồi copy xuống.
Thí dụ:
Range("C7:C" & endRow2).FormulaR1C1 = ...
- Thay vì copy danh mục thì gán trực tiếp giá trị: SheetA.Range(...).Value = SheetB.Range(...).Value
- Chưa có dòng lệnh xoá dòng không phát sinh & không có số dư đầu kỳ.
- ....
thì quả thật em chưa làm được.- Khi chọn báo cáo từ ngày A đến ngày B, thì số dư đầu ngày A phải tính lại, chứ không phải lấy số dư đầu năm. Cụ thể là chưa tính toán cột C sheet tổng hợp.
Cụ thể:- Tồn đầu ngày A = Vlookup(Mã KH, DSKH,n, 0) + SumProduct((ngày<ngàyA)*(mã = mãKH)*tien) - SumProduct((ngày<ngàyA) *(mã = mãKH) *thanhtoan)