Cách tính nhập xuất tồn bằng VBA?

Liên hệ QC

moihocvba

Thành viên thường trực
Tham gia
16/8/20
Bài viết
207
Được thích
49
Dạ em chào anh chị GPE ạ!
Em đang làm file xuất nhập tồn em xin anh chị hỗ trợ giúp em ạ!

Em có ý tưởng như thế này: Đầu tiên khi làm Phiếu nhập kho hay Phiếu xuất kho em lưu lại trong bảng Data bằng cách dùng phép nối chuỗi để mỗi phiếu nó nằm 1 dòng (Để dữ liệu nhẹ hơn khi về lâu dài) (dấu * để ngăn cách Tên hàng và số lượng, dấu ~ để ngăn cách giữa các sản phẩm vì một Phiếu có thể có nhiều sản phẩm).

Sau đó mỗi khi tính nhập xuất tồn thì em dùng VBA để tách toàn bộ số phiếu trong dữ liệu Data để dán vào sheet thành 2 bảng (Nhập và xuất), sau đó dùng dữ liệu 2 bảng Nhập và Xuất đó kết hợp hàm SUMIFS để tính nhập xuất tồn cho một khoảng thời gian bất kỳ

1633921622645.png

Và đây là bảng nhập xuất tồn em dùng SUMIFS để tổng hợp dữ liệu từ 2 bảng sau khi tách:
1633921885105.png


Vấn đề em gặp phải ở đây là về lâu về dài nếu hóa đơn lưu nhiều (khoảng từ 50.000 hóa đơn trở lên) thì dữ liệu sau khi tách nó hàng trăm ngàn dòng có khi vượt quá 1 triệu dòng, với cả thời gian tính toán sẽ rất chậm.

Vậy em viết bài này em nhờ các anh chị một thuật toán nào để giúp em tối ưu hơn ạ!
Em cám ơn anh chị rất nhiều!
 

File đính kèm

  • Nhap Xuat Ton kho.xlsx
    1.4 MB · Đọc: 28
Bạn thử tham khảo đề tài này:
https://www.giaiphapexcel.com/diendan/threads/phát-triển-bài-toán-tổng-hợp-xuất-nhập-tồn-hàng-hóa-bằng-các-ngôn-ngữ-lập-trình-khác.157974/page-3#post-1049361

Trong bài #1 cũng có đề tài gốc về tính toán Xuất/nhập/tồn.
 
Upvote 0
Bạn thử tham khảo đề tài này:
https://www.giaiphapexcel.com/diendan/threads/phát-triển-bài-toán-tổng-hợp-xuất-nhập-tồn-hàng-hóa-bằng-các-ngôn-ngữ-lập-trình-khác.157974/page-3#post-1049361

Trong bài #1 cũng có đề tài gốc về tính toán Xuất/nhập/tồn.
Dạ em cám ơn ạ!
bài này em cũng đã tham khảo qua, nhưng nó không phù hợp với các lưu Data của em ạ!
 
Upvote 0
Ngạc nhiên hết sức vì í tưởng của bạn: Lần đầu tiên trong đời đó nha;
Dù gì cũng thêm vài câu góp ý:
HH (Hàng hóa) phải có đơn vị tính, không có nó là không xong!
HH phải có mã, cái này bạn cũng chưa có & với mình nó là cột sống; Không có cái này thì mình hết ý . . . .

Có thể HH nhập & xuất nhốt chung 1 trang tính;

Với 1 hóa đơn, bao giờ cũng chứa 2 phần:
Phần chung, gồm người mua, kẻ bán, ngày bán/mua hay giao nhận HH, địa chỉ, MST,. . . .
Phần chi tiết, gồm Mã HH, Tên HH, DVT, Đơn giá, Số lượng,. . . .
2 phần này cũng có thể tách riêng nhau ra & quan hện với nhau theo kiểu 1- Nhiều

Chỉ là vài lời, nến chưa ưng ý thì bỏ qua dùm nhen!
 
Upvote 0
Dạ em chào anh chị GPE ạ!
Em đang làm file xuất nhập tồn em xin anh chị hỗ trợ giúp em ạ!

Em có ý tưởng như thế này: Đầu tiên khi làm Phiếu nhập kho hay Phiếu xuất kho em lưu lại trong bảng Data bằng cách dùng phép nối chuỗi để mỗi phiếu nó nằm 1 dòng (Để dữ liệu nhẹ hơn khi về lâu dài) (dấu * để ngăn cách Tên hàng và số lượng, dấu ~ để ngăn cách giữa các sản phẩm vì một Phiếu có thể có nhiều sản phẩm).

Sau đó mỗi khi tính nhập xuất tồn thì em dùng VBA để tách toàn bộ số phiếu trong dữ liệu Data để dán vào sheet thành 2 bảng (Nhập và xuất), sau đó dùng dữ liệu 2 bảng Nhập và Xuất đó kết hợp hàm SUMIFS để tính nhập xuất tồn cho một khoảng thời gian bất kỳ

View attachment 267505

Và đây là bảng nhập xuất tồn em dùng SUMIFS để tổng hợp dữ liệu từ 2 bảng sau khi tách:
View attachment 267506


Vấn đề em gặp phải ở đây là về lâu về dài nếu hóa đơn lưu nhiều (khoảng từ 50.000 hóa đơn trở lên) thì dữ liệu sau khi tách nó hàng trăm ngàn dòng có khi vượt quá 1 triệu dòng, với cả thời gian tính toán sẽ rất chậm.

Vậy em viết bài này em nhờ các anh chị một thuật toán nào để giúp em tối ưu hơn ạ!
Em cám ơn anh chị rất nhiều!
Bạn muốn thuật toán gì: tách dữ liệu hay là tính thẳng nhập xuất tồn từ data?
 
Upvote 0
Dạ em cám ơn ạ!
bài này em cũng đã tham khảo qua, nhưng nó không phù hợp với các lưu Data của em ạ!
Bạn bảo là không áp dụng được, tôi thử lại với data của bạn theo đúng Form của bài gốc, tôi thấy gần như không khác gì, còn chi tiết hơn.
Sheet Report click thực hiện.
 

File đính kèm

  • moihocvba_XNT.xlsb
    108.5 KB · Đọc: 34
Upvote 0
Bạn bảo là không áp dụng được, tôi thử lại với data của bạn theo đúng Form của bài gốc, tôi thấy gần như không khác gì, còn chi tiết hơn.
Sheet Report click thực hiện.
Ý của chủ thớt là làm thẳng từ đây chứ không đưa về dạng bảng chuẩn
1634003855070.png
 
Upvote 0
Ý của chủ thớt là làm thẳng từ đây chứ không đưa về dạng bảng chuẩn
Xây dựng CSDL như vậy cũng giống như mã hóa dữ liệu vậy nhỉ?
Làm khó người khác soi mói, thì cũng tự làm khó mình & sờ xễnh là CSDL thành đống rác tấp lự!
 
Upvote 0
Chính xác như bác SA_DQ nói, cái ý tưởng này của bạn nó lạ nhưng sai hoàn toàn nên bỏ nó đi. Không bao giờ có chuyện xây dựng CSDL kiểu ghép chuỗi cho nhẹ file như bạn cả. Sau này lên cả triệu dòng, dòng nào muốn xử lý cũng qua công đoạn tách chuỗi vậy chắc ứng dụng nó chạy tới tối. Mà cái lợi ích nhẹ file chẳng phải là mục tiêu chính, mục tiêu là truy vấn, xử lý ra kết quả nhanh, gọn. Cái này là bạn tự mình đưa vô chỗ chết đây.

Screen Shot 2021-10-12 at 09.26.08.png
 
Upvote 0
Dữ liệu của bạn cũng không ổn. Data nhập kho là phát sinh nhập kho chứ làm gì có chuyện dòng của ngày 30/9 lại lấy nó làm số đầu kỳ tháng 10?
Tồn đầu tháng 10 là em lấy Tổng Nhập trước tháng 10 - Tổng Xuất trước tháng 10, tức là từ 30/9 trở về trước ạ!
Trong ví dụ trên em để dữ liệu tháng 9 có nhập nhưng không có xuất, như vậy số lượng nhập nó sẽ chuyển về tồn đầu tháng 10!
Đây là cách em làm nhập tồn kho theo kiểu truyền thống ạ!

Lý do em làm nối chuỗi kiểu này nó làm nhẹ dữ liệu và lưu được nhiều phiếu hơn trong một bảng tính Excel (vì mỗi phiếu chỉ tốn 1 dòng lưu)
Bài đã được tự động gộp:

Ngạc nhiên hết sức vì í tưởng của bạn: Lần đầu tiên trong đời đó nha;
Dù gì cũng thêm vài câu góp ý:
HH (Hàng hóa) phải có đơn vị tính, không có nó là không xong!
HH phải có mã, cái này bạn cũng chưa có & với mình nó là cột sống; Không có cái này thì mình hết ý . . . .

Có thể HH nhập & xuất nhốt chung 1 trang tính;

Với 1 hóa đơn, bao giờ cũng chứa 2 phần:
Phần chung, gồm người mua, kẻ bán, ngày bán/mua hay giao nhận HH, địa chỉ, MST,. . . .
Phần chi tiết, gồm Mã HH, Tên HH, DVT, Đơn giá, Số lượng,. . . .
2 phần này cũng có thể tách riêng nhau ra & quan hện với nhau theo kiểu 1- Nhiều

Chỉ là vài lời, nến chưa ưng ý thì bỏ qua dùm nhen!
Dạ em hiểu ý anh, trong phiếu xuất và nhập em có đầy đủ thông tin, tuy nhiên data lưu em chỉ lưu các thông tin cần thiết để trích xuất ra con số mình cần thôi (ở đây là số lượng nhập xuất tồn kho). Chứ các thông tin anh nêu trên em đều có. Trên đây là em trích ra một phần data cần thiết để mọi người chỉ em cách code từ Data ra bảng Nhập Xuất Tồn cách nào cho nhẹ và tiện lợi thôi ạ!
 
Upvote 0
Lý do em làm nối chuỗi kiểu này nó làm nhẹ dữ liệu và lưu được nhiều phiếu hơn trong một bảng tính Excel (vì mỗi phiếu chỉ tốn 1 dòng lưu)
Gộp nhiều mặt hàng và SL cũng không nên dùng dấu * và dấu ~.
Sao không nhập: "A:10; B:20; ..."
 
Upvote 0
Tồn đầu tháng 10 là em lấy Tổng Nhập trước tháng 10 - Tổng Xuất trước tháng 10, tức là từ 30/9 trở về trước ạ!
Trong ví dụ trên em để dữ liệu tháng 9 có nhập nhưng không có xuất, như vậy số lượng nhập nó sẽ chuyển về tồn đầu tháng 10!
Đây là cách em làm nhập tồn kho theo kiểu truyền thống ạ!

Lý do em làm nối chuỗi kiểu này nó làm nhẹ dữ liệu và lưu được nhiều phiếu hơn trong một bảng tính Excel (vì mỗi phiếu chỉ tốn 1 dòng lưu)
Giả sử tôi làm bài này cho bạn thì tôi không thể lấy dòng 1634007705254.png làm số tồn đầu kỳ.
Vậy thì số đầu kỳ phải có chỗ để lấy chứ! Nếu không, code sẽ lủng phần đầu kỳ đấy.
 
Upvote 0
Chính xác như bác SA_DQ nói, cái ý tưởng này của bạn nó lạ nhưng sai hoàn toàn nên bỏ nó đi. Không bao giờ có chuyện xây dựng CSDL kiểu ghép chuỗi cho nhẹ file như bạn cả. Sau này lên cả triệu dòng, dòng nào muốn xử lý cũng qua công đoạn tách chuỗi vậy chắc ứng dụng nó chạy tới tối. Mà cái lợi ích nhẹ file chẳng phải là mục tiêu chính, mục tiêu là truy vấn, xử lý ra kết quả nhanh, gọn. Cái này là bạn tự mình đưa vô chỗ chết đây.

View attachment 267561

Em đã test thử tốc độ rồi ạ, ví dụ lưu theo cách thông thường, giả sử mỗi phiếu có 10 sản phẩm, thì 50.000 hóa đơn sẽ tốn 500.000 dòng của Excel, như vậy bảng tính sẽ rất nặng.
Còn nếu ghép chuỗi như em, 50.000 hóa đơn chỉ tốn 50.000 dòng, nó nhẹ hơn rất nhiều so với cách trên.
Còn thao tác tách chuỗi em cũng đã test 50.000 phiếu thì tốc độ cũng rất nhanh dưới 1 giây.
Vấn đề em gặp phải là bảng dữ liệu sau khi tách dữ liệu nếu nhiều dòng thì làm file excel nặng đi, nên em muốn học cách tách ra xong rồi tính nhập xuất tồn luôn sau đó mới dán ra sheet ạ!
 
Upvote 0
Em đã test thử tốc độ rồi ạ, ví dụ lưu theo cách thông thường, giả sử mỗi phiếu có 10 sản phẩm, thì 50.000 hóa đơn sẽ tốn 500.000 dòng của Excel, như vậy bảng tính sẽ rất nặng.
Còn nếu ghép chuỗi như em, 50.000 hóa đơn chỉ tốn 50.000 dòng, nó nhẹ hơn rất nhiều so với cách trên.
Còn thao tác tách chuỗi em cũng đã test 50.000 phiếu thì tốc độ cũng rất nhanh dưới 1 giây.
Vấn đề em gặp phải là bảng dữ liệu sau khi tách dữ liệu nếu nhiều dòng thì làm file excel nặng đi, nên em muốn học cách tách ra xong rồi tính nhập xuất tồn luôn sau đó mới dán ra sheet ạ!
50.000 hóa đơn là bạn lưu cho 1 năm hay 10 năm?
Nếu là 1 năm thì thua, còn 10 năm sao không tách ra mỗi năm 1 file, chỉ cần lấy tồn cuối năm trước làm tồn đầu năm sau.
 
Upvote 0
Giả sử tôi làm bài này cho bạn thì tôi không thể lấy dòng View attachment 267567 làm số tồn đầu kỳ.
Vậy thì số đầu kỳ phải có chỗ để lấy chứ! Nếu không, code sẽ lủng phần đầu kỳ đấy.

Dạ ý tưởng lấy số tồn đầu kỳ, là chúng ta sẽ lấy Tổng số nhập - Tổng số xuất trước ngày 1/10/2021 (Ngày này có thể tùy chọn trong bảng Nhập xuất tồn)
Trong File excel đính kèm em có làm công thức Excel trong bảng nhập xuất tồn theo ý tưởng trên. Nhưng để làm được cách này thì phải tách 2 data dán vào sheet sau đó mới áp dụng cách này.

Nên giờ em muốn tách ra và tính toán luôn rồi mới dán ra sheet cho đỡ nặng ạ!
 
Upvote 0
Giả sử tôi làm bài này cho bạn thì tôi không thể lấy dòng View attachment 267567 làm số tồn đầu kỳ.
Vậy thì số đầu kỳ phải có chỗ để lấy chứ! Nếu không, code sẽ lủng phần đầu kỳ đấy.
Tôi tự thiết kế cho bạn như sau:
1/ Bảng tồn kho đầu kỳ tại vùng từ ô J5 của sheet1 (tôi đã sửa tên sheet theo file tôi làm)
2/ Nhập tháng cần báo cáo tại ô Q1
3/ Sau khi chạy ra bảng kết quả, lấy thông tin tồn kho cuối tháng báo cáo nối thành chuỗi theo quy ước, điền nối vào bảng tồn kho. Nếu chạy lại báo cáo (đã có tồn kho tháng đó) thì chỉ sửa lại thông tin tồn kho.
 

File đính kèm

  • Nhap Xuat Ton kho_moihocvba.xlsm
    1.4 MB · Đọc: 35
Upvote 0
Upvote 0
Web KT
Back
Top Bottom