[THI] Tạo sổ TH NXT với tốc độ nhanh nhất, dữ liệu 65,532 dòng

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,652
Được thích
10,142
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Cuộc thi tạo sổ tổ hợp nhập xuất tồn trong Excel tốc độ nhanh nhất

MỤC ĐÍCH
Trao đổi học tập để cùng nâng cao trình độ lập trình VBA về tối ưu code chạy nhanh và rõ ràng.

ĐỐI TƯỢNG THAM GIA
Là tất cả các thành viên GPE từ thành viên thường đến các Admin của GPE
Tôi cũng tham gia. Thực tế tôi đã viết code lâu rồi để phục vụ công việc quản lý kho, bản thân thấy chạy khá nhanh nhưng vẫn tin nó chưa phải hoàn hảo.
Nếu code của ai tối ưu nhất hoặc rõ ràng nhất sẽ trình bày code và giải thích cặn kẽ kỹ thuật để làm được ra nó trong topic này để mọi người tham khảo và học hỏi.

GIẢI THƯỞNG
Giải thưởng là cho tất cả thành viên của diễn đàn GPE được các bài học tốt về lập trình VBA trong Excel trong việc làm sổ sách tổng hợp.

THỜI GIAN DỰ THI, GỬI BÀI VÀ CÔNG BỐ
Dự thi từ ngày 10/02/2014.
Bài gửi chậm nhất là 12hAM ngày 15/02/2014.
Thời gian công bố kết quả đánh giá 14h 17/02/2014
Tất cả các bài dự thi, kết quả đánh giá sẽ được upload lên trang đầu của topic này.

Các bạn nén file đáp án rồi gửi bài vào email:
duytuan@bluesofts.net hoặc email của một thành viên BQT GPE (tôi bổ sung sau)
(Tôi sẽ là người nộp sớm nhất không sợ copy của người khác :) )

ĐỀ BÀI:
Tôi cung cấp tập tin dữ liệu với 65,532 dòng cùng module chứa các hàm và thủ tục đo tốc tộ, cấu trúc lệnh.
Bảng dữ liệu:
dlkho.jpg
Nếu các bạn thắc mắc về phương pháp lập sổ tôi sẽ giải thích bài sau
Cấu trúc code:
[GPECODE=vb]Sub DoThoiGian()
Dim T1@, T2@, Freq@, Overhead@
QueryPerformanceFrequency Freq
QueryPerformanceCounter T1
QueryPerformanceCounter T2
Overhead = T2 - T1
QueryPerformanceCounter T1

'Thủ tuc của bạn

LapSo 'Thủ tuc của bạn phải làm

'Kết thúc chạy, đo thời gian thực hiện
QueryPerformanceCounter T2
'Debug.Print (T2 - T1 - Overhead) / Freq * 1000; "milliseconds(ms)"
MsgBox "milliseconds(ms): " & (T2 - T1 - Overhead) / Freq * 1000
End Sub[/GPECODE]


DoThoiGian là thủ tục mẹ được gán vào nút lệnh "Thực hiện" trên bảng tính. Nội dung trong thủ tục này bạn không được sửa. Bạn cần phải tạo thủ tục LapSo để lập sổ tổng hợp NXT.

[GPECODE=vb]Sub LapSo()
'Code của bạn để tạo ra sổ
End Sub[/GPECODE]

Kết quả thực hiện phải ra được sổ có cấu trúc và dữ liệu như sau
thnxt.jpg

Lưu ý, sổ mẫu đã được định dạng vì vậy bạn không cần viết code để định dạng để giảm các yếu tốt ảnh hưởng tới tốc độ của code.

(Nếu bạn không biết lập trình VBA có thể lập công thức Excel thông thường. Tuy nhiên nó có thể được dùng để so sánh giữa lập trình VBA "thiện chiến" thế nào với cách lập công thức Excel thông thường mà thôi).

[TIP]Hướng dẫn tính toán
Các thành viên lưu ý. Sheet "Setting" có thông tin về ngày lập sổ: Từ ngày...đến ngày với các name NGAY1, NGAY2. Điều kiện để lập sổ phải dựa vào thời gian và Loại_phieu

Lượng Tồn đầu = lượng nhập với ngày < NGAY1 - lượng xuất với ngày < NGAY1
Lượng Nhập trong kỳ = lượng nhập với ngày >= NGAY1 và ngày <= NGAY2
Lượng Xuất trong kỳ = lượng xuất với ngày >= NGAY1 và ngày <= NGAY2
Lượng tồn cuối = Lượng Tồn đầu + Lượng Nhập trong kỳ - Lượng Xuất trong kỳ

Tương tự khi tính giá trị...[/TIP]

TIÊU CHÍ ĐÁNH GIÁ
Tìm ra các code đạt tốc độ nhanh nhất. Các bài làm cố gắng trình bày dễ hiểu và kèm comment trong code để giải thích.
Tất cả các bài với các phương pháp khác nhau cũng sẽ đăng lên để chúng ta học được nhiều phương pháp từ đó có thể vận dụng linh hoạt trong các việc khác.

Xin nói trước với các bạn là ta có thể đánh giá ở mức tương đối. Tất cả các code sẽ chạy trên một máy tính. Excel sẽ được khởi động lại với mỗi code mới, mỗi code được chạy 3 lần rồi lấy tốc độ trung bình. Tất cả các bài dự thi được upload lên đây để tất cả mọi người tham khảo.

Với tinh thần cầu thị, tạo sân chơi chung cho mọi người tôi rất mong chúng ta cùng tham gia. Mong các thành viên đừng e ngại về trình độ của mình thế này thế khác, cứ xác định tham gia để học để biết mình đã làm được gì và cần cải tiến cái gì về lập trình VBA.

-----------------
Đã có bài tổng hợp kết quả test và các file có mã nguồn của các tác giả gửi. Các thành viên xem bài #175 để download.
-----------------
 

File đính kèm

  • THNXT_FAST_dulieu.rar
    1.2 MB · Đọc: 419
  • THNXT_FAST - Nguyen Duy Tuan.rar
    1.2 MB · Đọc: 474
Lần chỉnh sửa cuối:
Hàng khủng quá. Anh Nghĩa cũng chuẩn bị bài giải trình về cách là đi nha.
Thời gian còn nhiều mà Anh Tuân ơi, nhiều cây đại thụ chưa xuất hiện mà, làm sao em dám múa rìu qua mắt thợ được ạ. Em vẫn mong học được cách cải thiện code nhanh hơn nữa ạ.
 
Upvote 0
GIẢI THƯỞNG
Giải thưởng là cho tất cả thành viên của diễn đàn GPE được các bài học tốt về lập trình VBA trong Excel trong việc làm sổ sách tổng hợp.

Đọc sơ sơ , thì thấy giải thưởng lạ quá, thật là khó hiểu???
Giải thưởng là cho tất cả .... - nghĩa là gì đây, tức là giải thưởng sẽ phát cho tất cả các thành viên...
Hy vọng chủ topic giải thích cho rõ???
(hỏi vì thấy đọc lạ, còn giơ tay chào thua với kiểu bài vba này)
 
Upvote 0
Em nghĩ rất nhiều cao thủ chưa ra tay, tại thấy mỗi lần tham gia "phê bình" ai đó rất tích cực, hoặc lý thuyết rất "dữ dội", chắc những người đó sẽ làm nhanh lắm! Em tin rằng sẽ có người cho kết quả chừng một nửa thời gian của em.

Không phải tôi "nhột" với từ "cao thủ", bởi vì từ này không thể áp dụng cho tôi.
Chỉ là ở đây tôi không thể "ra tay" vì tốc độ là điểm nhược của tôi. Mỗi lần tôi cỡi xe máy đi SG-Vũng Tàu mất ít nhất 4 tiếng.
 
Upvote 0
Đọc sơ sơ , thì thấy giải thưởng lạ quá, thật là khó hiểu???
Giải thưởng là cho tất cả .... - nghĩa là gì đây, tức là giải thưởng sẽ phát cho tất cả các thành viên...
Hy vọng chủ topic giải thích cho rõ???
(hỏi vì thấy đọc lạ, còn giơ tay chào thua với kiểu bài vba này)

Ý của mình đơn giản là các thành viên được trao đổi và học tập lẫn nhau để thêm kiến thức.
 
Upvote 0
Các anh chị viết Code nhanh quá, em cũng xin góp 1 tay trong topic này hy vọng sẽ có thêm 1 phương án cho các thành viên mới của GPE.

Mình đã nhận được file bạn gửi trong email. Code của bạn cũng chạy rất nhanh.
 
Upvote 0
Đọc sơ sơ , thì thấy giải thưởng lạ quá, thật là khó hiểu???
Giải thưởng là cho tất cả .... - nghĩa là gì đây, tức là giải thưởng sẽ phát cho tất cả các thành viên...
Hy vọng chủ topic giải thích cho rõ???
(hỏi vì thấy đọc lạ, còn giơ tay chào thua với kiểu bài vba này)
Nhìn được CODE là phần thưởng cho tất cả các thành viên rồi...
 
Upvote 0
Nếu làm hầu hết bằng công thức (99,99%) thì ban giám khảo tính sao đây ta?

,,,,,,,,,,,,,,,,,,,,,
 
Upvote 0
Nếu làm hầu hết bằng công thức (99,99%) thì ban giám khảo tính sao đây ta?

,,,,,,,,,,,,,,,,,,,,,

Công thức cũng được ạ. Miễn là tự động hoàn toàn (số mã hàng không cố định). Nếu để công thức sống (còn link) thì thử tốc độ bằng cách, lấy đồng hồ ra, thay đổi giá trị trong sheet "KHO", bấm đồng hồ thật nhanh rồi vào sheet "THNXT" xem % của calculation, đến khi 100% thì bấm đồng hồ xem bao nhiều giây :=\+.
 
Upvote 0
Công thức cũng được ạ. Miễn là tự động hoàn toàn (số mã hàng không cố định). Nếu để công thức sống (còn link) thì thử tốc độ bằng cách, lấy đồng hồ ra, thay đổi giá trị trong sheet "KHO", bấm đồng hồ thật nhanh rồi vào sheet "THNXT" xem % của calculation, đến khi 100% thì bấm đồng hồ xem bao nhiều giây :=\+.
Lu bu chỗ mã hàng không cố định, chỉ ghi ra mã hàng nào có phát sinh chứ không lấy tất theo DM VLSPHH.
Untitled.jpg
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Lu bu chỗ mã hàng không cố định, chỉ ghi ra mã hàng nào có phát sinh chứ không lấy tất theo DM VLSPHH.
attachment.php

Đương nhiên lấy những mã hàng phát sinh trong điều kiện thời gian nhất định thôi.

Nhanh lắm bác Ba Tê ơi, có khi thử trên một máy thì code của bác ăn chắc em luôn đó!
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Em đã nhận được hàng bác Ba Tê gửi rồi nhé. Hàng của bác cũng ngon đấy :). Chỉ có điều bác thay "LapSo" thành "ToTiTe" làm em tìm hoa cả mắt --=0 .

Cảm ơn bác.
Xin lỗi Tuân nhé, vì mình đọc đề bài rồi viết Sub, xong gán vào nút lệnh của Tuân mà không đọc thấy dòng này:
'Khong sua noi dung trong thu tuc "DoThoiGian". Thu tuc nay duoc gan vao nut lenh "Thuc hien" trong sheet "THNXT"
 
Lần chỉnh sửa cuối:
Upvote 0
Anh Tuân ơi, cho hỏi rằng khi đã hết thời gian nộp bài, vậy tất cả các code đã nộp có được đưa lên đây để mọi người tham khảo hay không?
 
Upvote 0

File đính kèm

  • HINH TEST3.jpg
    HINH TEST3.jpg
    210.1 KB · Đọc: 94
Upvote 0
Upvote 0
Web KT
Back
Top Bottom