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

Liên hệ QC

Người dùng đang xem chủ đề này

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,846
Được thích
10,340
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

Lần chỉnh sửa cuối:
Em có thắc mắc chút xíu về dữ liệu:
Cột SO_CT 2 kí tự đầu là thể hiện việc nhập kho (NK) và xuất kho (XK), nhưng hình sau sẽ không phải như vậy???

1.jpg
 
Upvote 0
Em có thắc mắc chút xíu về dữ liệu:
Cột SO_CT 2 kí tự đầu là thể hiện việc nhập kho (NK) và xuất kho (XK), nhưng hình sau sẽ không phải như vậy???

View attachment 116114
Nếu không dựa vào điều kiện 2 kí tự đầu ở cột SO_CT thì dựa vào cột LOAI_PHIEU + thêm 1 điều kiện nữa thì kết quả như sau:

2.jpg
 
Upvote 0
Mình cho hiện kết quả tại [D1] là:
1039.252835
 
Upvote 0
Em có thắc mắc chút xíu về dữ liệu:
Cột SO_CT 2 kí tự đầu là thể hiện việc nhập kho (NK) và xuất kho (XK), nhưng hình sau sẽ không phải như vậy???

View attachment 116114

Xin lỗi các anh chị vì số chứng từ và ký hiệu chứng từ không được khớp. Do là mình phải copy pase để tạo nhiều dữ liệu nên số lượng các mặt hàng nhập xuất nó không được đẹp nên đã tự ý đổi "LOẠI_PHIEU" mà không đổi số phiếu cho logic. Vậy các anh chị và các thành viên chỉ dựa vào cột "LOẠI_PHIEU" để xác định phiếu nhập hay phiếu xuất, còn SO_CT bỏ qua.

Bác HYen17 làm nhanh thật, tốc độ cũng nhanh đó.

Trân trọng.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ ăn gian đó: 973.707795

PHP:
Sub LapSo()
 Dim Rws As Long, J As Byte, W As Byte
 Dim SNh As Double, TNh As Double
 Dim Rng As Range, Sh As Worksheet, WF As Object
 ReDim sArr(1 To 12, 1 To 1):           ReDim dArr(1 To 12, 1 To 6)
     
5 Set Sh = ThisWorkbook.Worksheets("KHO")
 Rws = Sh.[b4].CurrentRegion.Rows.Count
7 Set Rng = Sh.[b3:B65535].Resize(, 10)
 sArr() = [C12].Resize(12).Value
9 Set WF = Application.WorksheetFunction
 For J = 1 To 12
11    Sh.[ac4].Value = sArr(J, 1)
    For W = 1 To 2
13       Sh.[ad2].Value = Choose(W, "N", "X")
        If W = 1 Then
15            SNh = WF.DSum(Rng, Sh.[H3], Sh.Range("AA1:AD2"))
            TNh = WF.DSum(Rng, Sh.[k3], Sh.Range("AA1:AD2"))
17            dArr(J, 3) = WF.DSum(Rng, Sh.[H3], Sh.Range("Ac1:Af2"))
            dArr(J, 4) = WF.DSum(Rng, Sh.[k3], Sh.Range("Ac1:Af2"))
19        Else
            dArr(J, 1) = SNh - WF.DSum(Rng, Sh.[H3], Sh.Range("AA1:AD2"))
21            dArr(J, 2) = TNh - WF.DSum(Rng, Sh.[k3], Sh.Range("AA1:AD2"))
            dArr(J, 5) = WF.DSum(Rng, Sh.[H3], Sh.Range("Ac1:Af2"))
23            dArr(J, 6) = WF.DSum(Rng, Sh.[k3], Sh.Range("Ac1:Af2"))
        End If
25    Next W
 Next J
27 [f12].Resize(12, 6).Value = dArr()
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
PHP:
Sub LapSo()
 Dim Rws As Long, J As Byte, W As Byte
 Dim SNh As Double, TNh As Double
 Dim Rng As Range, Sh As Worksheet, WF As Object
 ReDim sArr(1 To 12, 1 To 1):           ReDim dArr(1 To 12, 1 To 6)
     
 Set Sh = ThisWorkbook.Worksheets("KHO")
 Rws = Sh.[b4].CurrentRegion.Rows.Count
 Set Rng = Sh.[b3:B65535].Resize(, 10)
 sArr() = [C12].Resize(12).Value
 Set WF = Application.WorksheetFunction
 For J = 1 To 12
    Sh.[ac4].Value = sArr(J, 1)
    For W = 1 To 2
        Sh.[ad2].Value = Choose(W, "N", "X")
        If W = 1 Then
            SNh = WF.DSum(Rng, Sh.[H3], Sh.Range("AA1:AD2"))
            TNh = WF.DSum(Rng, Sh.[k3], Sh.Range("AA1:AD2"))
            dArr(J, 3) = WF.DSum(Rng, Sh.[H3], Sh.Range("Ac1:Af2"))
            dArr(J, 4) = WF.DSum(Rng, Sh.[k3], Sh.Range("Ac1:Af2"))
        Else
            dArr(J, 1) = SNh - WF.DSum(Rng, Sh.[H3], Sh.Range("AA1:AD2"))
            dArr(J, 2) = TNh - WF.DSum(Rng, Sh.[k3], Sh.Range("AA1:AD2"))
            dArr(J, 5) = WF.DSum(Rng, Sh.[H3], Sh.Range("Ac1:Af2"))
            dArr(J, 6) = WF.DSum(Rng, Sh.[k3], Sh.Range("Ac1:Af2"))
        End If
    Next W
 Next J
 [f12].Resize(12, 6).Value = dArr()
End Sub
Ủa, code của bác chạy nhanh chư chớp, tốc độ của nó là "296.xxxx". Quá nhanh so với quy định :).
Bác kiểm tra giúp sao em copy vào file dữ liệu để chạy thì toàn ra số 0?
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Làm sao Tuân có thiết trí vùng [AA1:Af5 ] của trang thẻ kho, nó nè

| aa | ab | ac | ad | ae | af 1 |ngay_ct|ngay_ct|ma_vlsphh|loai_phieu|ngay_ct|ngay_ct
2 |=">"&aa4|="<"&ab4|="=" &ac4||=">="&ab4|="<="&ab5
3 ||
4 |=min(kho!b:b)-1|=ngay1|;;;;;;;;;;;|||
5 ||=ngay2||||
 
Upvote 0
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ị...

Mong các thành viên có kinh nghiệm tham gia nhiều hơn để các thành viên khác được học hỏi.
 
Upvote 0
| aa | ab | ac | ad | ae | af 1 |ngay_ct|ngay_ct|ma_vlsphh|loai_phieu|ngay_ct|ngay_ct
2 |=">"&aa4|="<"&ab4|="=" &ac4||=">="&ab4|="<="&ab5
3 ||
4 |=min(kho!b:b)-1|=ngay1|;;;;;;;;;;;|||
5 ||=ngay2||||

Anh làm vào file rồi gửi file kế quả em chạy xem được không?

Cảm ơn anh.
 
Upvote 0
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ị...

Mong các thành viên có kinh nghiệm tham gia nhiều hơn để các thành viên khác được học hỏi.
Dùng ADO chỉ có thể ra kết quả có thời gian như trên thôi, em xem như thua cuộc, đang đợi học hỏi đây anh ơi.
 
Upvote 0
)(&&@@ )(&&@@ )(&&@@

Nhấn cảm ơn giúp, một khi đã down file!

Bác làm tuyệt thật. Nhưng bác có thể nâng cấp thêm để tự động hóa 100%. Tức là người dùng chỉ cần nhấn nút "Thực hiện" là xong.
+ Bổ sung thêm code để tự điền công thức hoặc giá trị vào các cột B,C,D,E,L,M
+ Khi danh mục hàng có thể lên tới hàng trăm mã hàng, nhưng trong sổ KHO phát sinh với số mã có thể ít hơn. Vậy trong sổ THNXT chỉ hiện những mã có phát sinh chứng từ mà thôi.

Bác chuẩn bị giúp viết bài hướng dẫn cách làm sổ theo phương pháp của bác để thành viên được hiểu hơn nhé. Tuần sau em tổng hợp lại rồi sẽ đăng tất cả. Cảm ơn bác.

Mong các thành viên tiếp tục làm và gửi kết quả nhé. Mình đã thấy có 2 cách giải quyết vấn đề rồi đó. Chắc chắn là còn nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
Dùng ADO chỉ có thể ra kết quả có thời gian như trên thôi, em xem như thua cuộc, đang đợi học hỏi đây anh ơi.

ADO cũng được, nhưng so sánh về thời gian mình chưa biết ai hơn ai trong topic này. Anh cứ tìm cách làm đi, chỉnh sửa code cho dễ hiểu rồi gửi. Quan trọng các thành viên sẽ có tập hợp các phương pháp hay để học hỏi.

Mình xin đính chính lại. Khi tổng kết các bài thi sẽ đánh giá bài nào đạt tốc độ cao nhất. 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.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Tuyệt thật. Nhưng bác có thể nâng cấp thêm để tự động hóa 100%. Tức là người dùng chỉ cần nhấn nút "Thực hiện" là xong.

Người ta đang đánh theo cách du kích, thầy lại bảo đánh theo cách hiện đại thì có mà toi với chàng ADO còn gì!

Bác chuẩn bị giúp bài viết hướng dẫn cách làm sổ theo phương pháp của bác để thành viên được hiểu hơn nhé. Tuần sau em tổng hợp lại rồi sẽ đăng tất cả.
Sẵn lòng thôi, cách này giống như người sơ cấp VBA cũng mần được tuốt mà.

Có nhiều người chưa gởi bài vì lúng túng khâu Nhập-Xuất-Tồn là chuyên môn sâu, cần nghiền ngẫm đó thôi!
Mình có bài sớm vì trước đây đã hỗ trợ file i chang cho thành viên trong cộng đồng chúng ta đó thôi.

Chúc xuân vui vẻ & nhiều thành công!

 
Upvote 0
Ở sheet KHO, có dòng "Dữ liệu nguồn - Không sửa", vậy cho hỏi có được sắp xếp (sort) được không vậy?
 
Upvote 0
)(&&@@ )(&&@@ )(&&@@

Nhấn cảm ơn giúp, một khi đã down file!
Em chưa có down vì có file đâu mà down, mà cũng nhấn cảm ơn được không bác Sa?

Dùng ADO chỉ có thể ra kết quả có thời gian như trên thôi, em xem như thua cuộc, đang đợi học hỏi đây anh ơi.
Chớ vội, ở máy này tốc độ cho khác, ở máy khác cho tốc độ khác, vì thế khi kiểm tra chỉ cần sử dụng 1 máy mới biết thủ tục của ai nhanh ai chậm.
 
Upvote 0
Em chưa có down vì có file đâu mà down, mà cũng nhấn cảm ơn được không bác Sa?
Nhấn hay không tùy Nghĩa thôi, nhưng mình nghỉ rằng Nghĩa làm & nộp bài đi đã;
Sau đó đọc code với thiết kế bên trên thì mò tiếp đi, không được lười!

Chớ vội, ở máy này tốc độ cho khác, ở máy khác cho tốc độ khác, vì thế khi kiểm tra chỉ cần sử dụng 1 máy mới biết thủ tục của ai nhanh ai chậm.
Hoàn toàn đúng; Mà không biết excel 2003 hay E2010-E2007 có ảnh hưởng không ta?

Dù gì cũng đã làm chàng ADO rúng động là mình vui rồi!


Chúc xuân vui vẻ!
 
Upvote 0
Ở sheet KHO, có dòng "Dữ liệu nguồn - Không sửa", vậy cho hỏi có được sắp xếp (sort) được không vậy?

Nếu sắp xếp thì phải dùng lệnh VBA để làm, lệnh này bị tính vào thời gian chạy :). "Dữ liệu nguồn - Không sửa" ý là không sửa thủ công, nếu sửa thì phải bằng code mà chỉ liên quan đến Sort mà thôi.
 
Upvote 0
Hướng dẫn nghiệp vụ lập sổ THNXT - Tổng hợp nhập xuất tồn

Hướng dẫn nghiệp vụ lập sổ THNXT - Tổng hợp nhập xuất tồn
demothnxt.jpg

Các cột trong sheet KHO (dữ liệu nguồn)
SO_CT: số phiếu nhập, phiếu xuất. Không cần quan tâm
NGAY_CT: ngày của các phiếu khi nhập, xuất kho. Cột này được dùng để biết các phiếu thực hiện thời gian nào.
MA_KH: Không cần quan tâm
MA_NB: Không cần quan tâm
MA_NV: Không cần quan tâm
KHO: Không cần quan tâm
MA_VLSPHH: Chỉ ra mã vật tư, hàng hóa nào nhập hoặc xuất
SLG: Số lượng hàng nhập, xuất. Được dùng để tổng hợp số lượng trong báo cáo.
DON_GIA: Là đơn giá nhập, xuất cho một đơn vị hàng hóa. Không cần quan tâm
LOAI_PHIEU: Chỉ ra dòng/bản ghi này thuộc loại phiếu nhập(N) hay là xuất(X)
THANH_TIEN: Tính bằng SLG*DON_GIA. Cột này được dùng để tính tổng số tiền nhập hoặc xuất.

Cách tính toán để đưa vào sổ th nxt
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ị...

Ví dụ: Nhìn vào hình trên ta tính cho HH001 với khoảng thời gian từ NGAY1(02/08/2005) đến NGAY2(31/08/2005)
+ Lượng Tồn đầu. Tra trên dòng những ngày < 02/08/2005 với mặt hàng HH001 ta có
Nhập=4
Xuất=3
Lượng Tồn đầu = 4-3 = 1
+ Lượng Nhập, Xuất trong kỳ. Tra trên dòng có ngày trong khoảng [02/08/2005-31/08/2005] với mặt hàng HH001 ta có
Nhập=2+4=6
Xuất=3

+ Lượng tồn cuối = 1 + 6 - 3 = 4

Hy vọng bài hướng dẫn này chúng ta đều nắm được yêu cầu tính toán để bắt tay vào code.
 
Upvote 0
[THongbao]Ở sheet KHO, có dòng "Dữ liệu nguồn - Không sửa", vậy cho hỏi có được sắp xếp (sort) được không vậy?[/Thongbao]

Nghĩa thử viết câu lệnh sắp xếp (SX) CSDL ấy lại xem tốn bao nhiêu là thời gian?
Riêng chuyện SX này cầm thua ADO là cái chắc luôn!

Riêng mình thì suýt sấp bẫy 2 mã hàng 'BE' & 'BE1'

Còn chuyện này hỏi luôn thầy Tuan nè:
Ở cột [THANH_TIEN] sao có mặt hàng nhập do được cho hay fải xuất đem hối lộ hay sao mà không có thu/chi tiền làm vậy?
 
Upvote 0
[THongbao]Ở sheet KHO, có dòng "Dữ liệu nguồn - Không sửa", vậy cho hỏi có được sắp xếp (sort) được không vậy?[/Thongbao]

Nghĩa thử viết câu lệnh sắp xếp (SX) CSDL ấy lại xem tốn bao nhiêu là thời gian?
Riêng chuyện SX này cầm thua ADO là cái chắc luôn!

Riêng mình thì suýt sấp bẫy 2 mã hàng 'BE' & 'BE1'

Còn chuyện này hỏi luôn thầy Tuan nè:
Ở cột [THANH_TIEN] sao có mặt hàng nhập do được cho hay fải xuất đem hối lộ hay sao mà không có thu/chi tiền làm vậy?

Dạ, đó là đồ được biếu đấy bác à /-*+/
 
Upvote 0
Những công cụ đặc thù như ADO (sắp xếp và tổng hợp qua cổ máy Access?) chúng có "vùng mượt" (sweet spot) của chúng. Tuỳ theo mật độ dữ liệu mà tốc độ có tối ưu hay không. Chỉ dùng một nhóm dữ liệu thì không thể kết luận gì khi so sánh được.

Các kỹ thuật lập trình cũng có nhiều môn như vậy. Ví dụ SX (sort) có đến vài phương pháp, tuỳ theo số lượng và tình trạng dữ liệu mà hiệu quả của chúng khác nhau.
 
Upvote 0
Đã 70 lượt download dữ liệu rồi mà chưa thấy thêm người trao đổi gì? Các Admin một số Smod hình như cũng không quan tâm?

Theo đánh giá của tôi thì với ví dụ về lập sổ này chắc chắn chúng ta sẽ học được nhiều về VBA. Cùng kết quả nhưng sẽ có nhiều hướng giải quyết. Với diễn đàn GPE sẽ có thêm loạt bài chất lượng và sống động thực sự!
 
Upvote 0
Đã 70 lượt download dữ liệu rồi mà chưa thấy thêm người trao đổi gì? Các Admin một số Smod hình như cũng không quan tâm?

Theo đánh giá của tôi thì với ví dụ về lập sổ này chắc chắn chúng ta sẽ học được nhiều về VBA. Cùng kết quả nhưng sẽ có nhiều hướng giải quyết. Với diễn đàn GPE sẽ có thêm loạt bài chất lượng và sống động thực sự!
Có thể đang tìm phương án tối ưu đó anh Tuân, theo em thời hạn chỉ có 5 ngày kể từ ngày 10/02/2014 thì nó quá ngắn phải không anh?
 
Upvote 0
Có thể đang tìm phương án tối ưu đó anh Tuân, theo em thời hạn chỉ có 5 ngày kể từ ngày 10/02/2014 thì nó quá ngắn phải không anh?

Cũng có thể với 5 ngày là hơn ngắn. Hy vọng các thành viên tập trung nghiên cứu để làm được ví dụ này.
 
Upvote 0
Tốc độ ghê vậy ta?

Tốc độ vậy được chứ Anh Tuân?--=0
 

File đính kèm

  • VBA_Test.jpg
    VBA_Test.jpg
    218.6 KB · Đọc: 147
Upvote 0
Quá được luôn. Hàng cũng khủng đấy /-*+/

Đang lo mình được giải khuyến khích mất thôi. :(
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.
 
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.

Với topic này chúng ta hoan nghênh những người tham gia thi và cổ vũ, động viên :) .
 
Upvote 0
[ThoNgBao]Quá được luôn. Hàng cũng khủng đấy

Đang lo mình được giải khuyến khích mất thôi. :([/ThoNgBao]

Té ra thầy này vừa ra đề, vừa có bài thi thố à?
???????????????????,,,,,,,,,,,,,,,,,,,,,
 
Upvote 0
[ThoNgBao]Quá được luôn. Hàng cũng khủng đấy

Đang lo mình được giải khuyến khích mất thôi. :([/ThoNgBao]

Té ra thầy này vừa ra đề, vừa có bài thi thố à?
???????????????????,,,,,,,,,,,,,,,,,,,,,
Bài thi có lẽ gửi ở bài đầu tiên với file rar đó bác Chanh, nhưng file này đã bị khóa rồi.
 
Upvote 0
Bài thi có lẽ gửi ở bài đầu tiên với file rar đó bác Chanh, nhưng file này đã bị khóa rồi.

Có tham gia thi và nộp bài đầu tiên tại trang đầu (hết hạn nộp bài thì mới báo cáo mật khẩu). Nhưng theo đánh giá hiện nay thì có thể chiếu cố được giải khuyến khích thôi --=0
 
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.
 
Upvote 0
Code đã chỉnh sửa lại hợp lý.

Đây là hình ảnh test trên máy tính để bàn:
 

File đính kèm

  • TangToc.jpg
    TangToc.jpg
    96.9 KB · Đọc: 123
Upvote 0
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: 95
Upvote 0
Upvote 0
pivot table thì thời gian vẫn chậm hơn của bạn 1 chút
hình đây
để tôi xem có thể nhanh hơn được nữa không . Nếu được mới gửi bài
Cũng chú ý kết quả tổng tồn (Thành tiền)
Trên màn hình:88.579.860.386
Trong khi: 75.600.000+303.140.240.252-214.560.379.866 = 88.655.460.386
 
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?

Như mình đã viết tại trang đầu, tất cả các code sẽ gửi lên hết, các tác giả giải thích cách làm để toàn thể thành viên được học. Đây chính là bữa tiệc VBA - Phần thưởng cho tất cả mọi người.

Xin nói rõ lại với các thành viên là tôi mở ra cuộc thi và tổng hợp, đánh giá các bài một cách khách quan cho mọi người. Bản thân tôi cũng là người dự thi, đồ rằng có thể mang giải khuyến khích về.
 
Lần chỉnh sửa cuối:
Upvote 0
Bài dự thi viết code ngắn nhất

/-(ầu như chỉ với 1 dòng lệnh!
,,,,,,,,,,,,,,,,,,,,,
 

File đính kèm

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)

Đúng là cuộc thi lạ, và giải thưởng cũng lạ, Nhưng như thế mới là GPE bạn ah, chắc là lính mới cóc hiểu gì (?)

----------
Topic của cuộc thi, bài dạng này quá giản đơn - bác bate, concogia (và quanghai, chanhTQ) viết suốt giúp thành viên hàng ngày - sao lại lấy ra thi??

Tuy thế thời gian so sánh cũng là vấn đề vì chênh nhau chắc không nhiều, và tốc độ máy khác nhau

Để tiện so sánh chúng ta hãy chạy cùng một sub "test thời gian" (theo cách đo như code của NDT) trong file kèm sau, hãy bấm nút test thời gian, chạy 10 lần, lấy trung bình tại Q5 --> và báo con số lên đây (mở màn là bác bate nhé) --> khi đó mới có con số so sánh --> suy luận tốc độ so với ng khác -> làm căn cứ khi báo con số này cùng con số thời gian của sub lapso (lưu ý: chạy cùng ngay thời điểm đó nhé, vì windows xử lý đa luồng, nên tùy thuộc vào thời điểm bạn đang chạy thì nó chạy cung nhiều chương trình khác bên cạnh excel nữa)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đúng là cuộc thi lạ, và giải thưởng cũng lạ, Nhưng như thế mới là GPE bạn ah, chắc là lính mới cóc hiểu gì (?)

----------
Topic của cuộc thi, bài dạng này quá giản đơn - bác bate, concogia (và quanghai, chanhTQ) viết suốt giúp thành viên hàng ngày - sao lại lấy ra thi??

Tuy thế thời gian so sánh cũng là vấn đề vì chênh nhau chắc không nhiều, và tốc độ máy khác nhau

Để tiện so sánh chúng ta hãy chạy cũng một thủ tục test thời gian (theo cách đo như code của NDT) trong file kèm sau, hãy bấm nút test thời gian, chạy 10 lần, lấy trung bình tại Q5 --> và báo con số lên đây (mở màn là bác bate nhé) --> khi đó mới có con số so sánh --> suy luận tốc độ so với ng khác -> làm căn cứ khi báo con số này cùng con số thời gian của sub lapso (lưu ý: chạy cùng ngay thời điểm đó nhé, vì windows xử lý đa luồng, nên tùy thuộc vào thời điểm bạn đang chạy thì nó chạy cung nhiều chương trình khác bên cạnh excel nữa)
Hổng hiểu, nhưng bấm thử 10 lần, O5=ROUND(AVERAGE(O6:O35);3)=1212.16
Bấm nút Test THời gian 10 lần Q5=843.655
HicHic.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Hổng hiểu, nhưng bấm thử 10 lần, O5=ROUND(AVERAGE(O6:O35);3)=1212.16

Và code của bác thì chạy con số bao nhiêu??? BẤM "Test thời gian" mới đúng bác nhé --> Kết quả ở ô Q5 (còn O5 là đê chạy code lapso sau khi lắp code vào - dĩ nhiên người lập trình phải ghép vào các sheet data)

ví dụ code của bác chạy 350 và test thời gian (Q5) là 1212.16
code của 1 anh A khác chạy 330 và test thời gian 1000

--> quy đổi nếu code của bác bate chạy trên máy tính của anh A là =350*1000/1212.16 = 288.74 mls - con số này nhỏ hơn 330mls (sub lapso của anh A) ==> code của bác bate thắng , chúc mừng chúc mừng

Ví dụ thế
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng là cuộc thi lạ, và giải thưởng cũng lạ, Nhưng như thế mới là GPE bạn ah, chắc là lính mới cóc hiểu gì (?)

----------
Topic của cuộc thi, bài dạng này quá giản đơn - bác bate, concogia (và quanghai, chanhTQ) viết suốt giúp thành viên hàng ngày - sao lại lấy ra thi??

Có lẽ vẫn chưa hiểu lắm sao anh hỏi vậy? Ai lấy cái gì của ai đi thi?
Bài thi này có phải đố về độ khó để tìm ra kết quả đâu. Các thành viên dùng mọi cách có thể để làm sao tốc độ thực thi code chạy nhanh nhất.
 
Lần chỉnh sửa cuối:
Upvote 0
Có lẽ vẫn chưa hiểu lắm sao anh hỏi vậy? Ai lấy cái gì của ai đi thi?
Bài thi này có phải đố về độ khó để tìm ra kết quả đâu. Các thành viên dùng mọi cách có thể để làm sao tốc độ thực thi code chạy nhanh nhất.

ý là , lấy dạng bài này đó

Nếu đó là ý muốn của chủ topic thì không có gì để bàn cả, chỉ thấy đó là vấn đề đã giải nhiều trên GPE, và so sánh tốc độ ở bài dạng này, dường như không khác biệt nhau nhiều lắm, vài phần % giây nên Không rõ đánh giá thế nào, như thế khó tạo ra được cách biệt, ý tôi chỉ thế thôi,

Và muốn nói thế, để chỉ ra các thành viên khác đừng lo việc khi ai đó nói là đã chạy 400mls hay ít hơn , tiếp tục thử theo cách của riêng đi- vì nó phụ thuộc vào máy tính và trạng thái máy tính chạy ghi đó (RAM, CPU , các chương trình đang chạy vv) - - con nếu máy tính khác nhau thì đã khác nhau tốc độ là cái chắc - nên có khi chạy 400mls ở máy này thì sang máy khác lại là 600mls .

Có lẽ bạn chủ topic nên công bố thời gian chạy thử nghiệm các bài nộp đã gửi đến -- như thế thì mới dễ so sánh hơn (vì thử trên cùng 1 môi trường gần như nhau). và người có bài nộp cũng biết cần hoàn thêm để cải thiện tốc độ nữa hay không (?)

Đôi lời bàn vậy thôi.
 
Upvote 0
Để so sánh thời gian với nhau nên đảm bảo các yếu tố như sau:

1. Phải chạy trên cùng một máy tính
2. Tắt tất cả các ứng dụng đang chạy, các chương trình thường trú cũng tắt đi nếu không liên quan đến Windows để giảm những tác động đến Windows và Excel.
3. Một một bài thi phải được test theo quy trình như sau
b1. Tắt Excel (nếu đang mở)->Mở Excel -->đảm bảo môi trường "sạch"
b2. Mở file Excel cần đo thời gian. Hãy đợi một lúc đảm bảo Excel đã thực hiện các công việc của nó xong. Hãy nhấn CTRL+ALT+DEL để mở "Task Manager", trong tab "Processes" đảm bảo dòng có EXCEL.EXE, CPU và Memory đang ở con số ổn định (không thay đổi liên tục).
b3. Nhấn chạy thủ tục và ghi nhận thời gian thực hiện. Nên thực hiện tối thiểu 3 lần chạy để lấy 3 kết quả khác nhau rồi tính trung bình. Mỗi lần trước bấm nút "Thực hiện" hãy đảm bảo trong Process, CPU và Memory của dòng EXCEL.EXE đang ổn định.

Đến code của bài dự thi khác lại lập lại từ b1.
 
Lần chỉnh sửa cuối:
Upvote 0
Topic này tôi thấy ngay khi mới tạo, nhưng chưa kịp xem, thậm chí còn không thấy chữ [THI], nên cứ tưởng Tuân giới thiệu 1 thành quả nào đó của mình.

Mãi đến khi đọc fb mới thấy Nghĩa khích bác tận tên tôi, vào đây lại thấy khích nữa:

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.

Tính tôi vẫn thế, sai thì tôi phê, không chính xác thì tôi nói, copy paste mà nhận là tự dịch thì tôi vạch ra. Ăn nói hồ đồ thì tôi mắng. Vậy đấy.

Còn bài trong topic này tôi viết theo kiểu truyền thống, máy Core 2 Dual 2.9, kết quả tốc độ 537.77551409. Viết xong thì khuya rồi nên chưa sửa, chưa comment.
 
Upvote 0
Có lẽ bạn chủ topic nên công bố thời gian chạy thử nghiệm các bài nộp đã gửi đến -- như thế thì mới dễ so sánh hơn (vì thử trên cùng 1 môi trường gần như nhau). và người có bài nộp cũng biết cần hoàn thêm để cải thiện tốc độ nữa hay không (?)

Đôi lời bàn vậy thôi.

Hiện nay em mới có trong tay 2 bài gửi chính thức. Nên để sau 12hAM ngày 15 sẽ upload lên để mọi người test với điều kiện test thống nhất. Từ giờ đến lúc đó mọi người vẫn đi tìm giải pháp cho chính mình để gửi bản cuối cùng.

Việc máy tính khác nhau, hệ điều hành khác nhau, Excel khác nhau, các ứng dụng đang chạy thường trú khác nhau, quy trình test khác nhau chính là các yếu tố làm cho kết quả đo tốc độ giữa các máy là không giống nhau với cùng một code. Vậy các thành viên cứ tự mình tìm các giải pháp rồi tự so sánh trên máy mình rồi cho ra sản phẩm cuối cùng.

Các cách làm giống nhau (cùng phái võ), chỉ khác nhau chút ít thì tốc độ đương nhiên chênh lệch ít (nếu không có thêm bí quyết). Các thành viên đã có một số cách khác hẳn nhau, tìm được bí quyết chắc chắn sẽ là khác nhau.
 
Upvote 0
Hổng hiểu, nhưng bấm thử 10 lần, O5=ROUND(AVERAGE(O6:O35);3)=1212.16
Bấm nút Test THời gian 10 lần Q5=843.655
View attachment 116191

Q5=843.655 ==> máy tính của bác khá mạnh, laptop của em giá trị thời gian này là 1168.259
Hẳn nào code bạn chạy có chưa đến nửa giây cho khối lượng dữ liệu lớn vậy (>65000 dòng)
 
Lần chỉnh sửa cuối:
Upvote 0
Test với các khoảng thời gian khác nhau để đảm bảo rằng code chỉ thể hiện các dòng có đầu kỳ và có phát sinh trong kỳ, thì tôi thấy số lượng tính toán khác nhau sẽ cho thời gian khác nhau. Dù rằng vẫn dùng vòng lặp duyệt bằng đó dòng.







Riêng Pivot table, nếu chỉ dùng code refresh để test tốc độ thì có lẽ rất nhanh.
 
Upvote 0
Test với các khoảng thời gian khác nhau để đảm bảo rằng code chỉ thể hiện các dòng có đầu kỳ và có phát sinh trong kỳ, thì tôi thấy số lượng tính toán khác nhau sẽ cho thời gian khác nhau. Dù rằng vẫn dùng vòng lặp duyệt bằng đó dòng.

Vì thế nên em mới viết bổ sung về cách test và vì sao thực hiện ít nhất 3 lần rồi lấy trung bình tốc độ.

Để so sánh thời gian với nhau nên đảm bảo các yếu tố như sau:

1. Phải chạy trên cùng một máy tính
2. Tắt tất cả các ứng dụng đang chạy, các chương trình thường trú cũng tắt đi nếu không liên quan đến Windows để giảm những tác động đến Windows và Excel.
3. Một một bài thi phải được test theo quy trình như sau
b1. Tắt Excel (nếu đang mở)->Mở Excel -->đảm bảo môi trường "sạch"
b2. Mở file Excel cần đo thời gian. Hãy đợi một lúc đảm bảo Excel đã thực hiện các công việc của nó xong. Hãy nhấn CTRL+ALT+DEL để mở "Task Manager", trong tab "Processes" đảm bảo dòng có EXCEL.EXE, CPU và Memory đang ở con số ổn định (không thay đổi liên tục).
b3. Nhấn chạy thủ tục và ghi nhận thời gian thực hiện. Nên thực hiện tối thiểu 3 lần chạy để lấy 3 kết quả khác nhau rồi tính trung bình. Mỗi lần trước bấm nút "Thực hiện" hãy đảm bảo trong Process, CPU và Memory của dòng EXCEL.EXE đang ổn định.

Đến code của bài dự thi khác lại lập lại từ b1.
 
Upvote 0
Ý của tôi là test với khoảng thời gian (kỳ báo cáo) bên sheet setting khác nhau. trong 3 hình trên, tôi test với những khoảng thời gian (kỳ báo cáo):
- 01/08/05 - 31/12/06
- 01/09/05 - 31/12/06
- 01/09/05 - 31/12/05

Số vòng lặp như nhau, nhưng khối lượng tính toán khác nhau.

Cũng code đó, bây giờ test lại thì 461.84781

 
Upvote 0
Anh không thay đổi gì chạy mỗi lần một con số khác mà.
 
Upvote 0
Anh không thay đổi gì chạy mỗi lần một con số khác mà.

Có thay đổi bên sheet setting. Tuân xem kỹ tiêu đề báo cáo sẽ thấy kỳ báo cáo khác nhau. Vả lại, trong hình 3, chỉ thể hiện 4 dòng. Các mặt hàng khác không phát sinh trong năm 2015.

Theo thuật toán của tôi, trong vòng lặp chính (lặp 65 ngàn lần), nếu ngày < ngay1 thì tính 2 cột tồn đầu, nếu ngày < ngay2 thì tính 4 cột nhập xuất. Do đó số lượng dòng có ngày < ngay1 càng nhiều thì tính càng nhanh do chỉ tính 2 cột.

Hai cột tồn cuối tính trong vòng lặp nhỏ, chỉ lặp 12 lần, không đáng kể.

Chỉnh sửa 1 chút, giảm số lần tính toán, và thay phép nhân bằng phép cộng, có giảm 1 chút: 418.898



Cách thực hiện trong code:
1 Dictionary
1 Array nguồn
1 Array tạm
1 Array kết quả
1 vòng lặp 65 ngàn vòng

Array tạm cũng đã là kết quả của việc tính tổng, nhưng chạy thêm 1 vòng lặp 12 vòng để kiểm tra mặt hàng không có phát sinh thì loại ra.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi làm một chương trình thì người thực hiện phải hoạch định xem mình sẽ làm gì để chương trình chạy mượt mà hơn.

Thứ hai là phải cân nhắc giữa cái nhanh và việc lường trước các lỗi phát sinh.

Với bài tập này, thay vì tôi chọn code chạy 450 ms thì tôi sẽ chọn loại 550 ms.

Lý do:

1) Tôi phải kiểm tra dữ liệu nguồn, cụ thể là sheet KHO có trạng thái AutoFilter hay không, nếu có thì tôi sẽ bỏ chế độ này. Một cơ sở dữ liệu mà đang bị Filter thì có khả năng chúng ta không thể gán vào Array đầy đủ.

2) Kiểm tra xem dữ liệu trong sheet KHO đã được nhập dòng nào chưa, nếu chưa nhập thì thông báo.

3) Kiểm tra xem Từ ngày, Đến ngày đã được nhập vào hay chưa, nếu chưa nhập hoặc không phải là dạng ngày cũng phải thông báo.

4) Xóa dữ liệu cũ trên biểu mẫu, bởi khi dữ liệu sắp nhập vào ít hơn dữ liệu cũ trên biểu mãu sẽ bị trộn dữ liệu.

5) Trong biểu mẫu, tôi luôn bảo toàn một số hàng nhất định, trong trường hợp này, tôi bảo toàn số hàng là 15 dòng. Vì vậy, tôi phải kiểm tra trước xem biểu mẫu đó có đủ 15 dòng chưa, nếu đủ thì thôi, không đủ thì Insert thêm, còn nếu hơn thì Delete đi, làm sao cho Insert hoặc Delete phải bảo toàn 15 dòng. Mặt khác ta phải xem số hàng mà ta sắp gán vào biểu mẫu có nhiều hơn 15 dòng hay không, nếu nhiều hơn thì ta Insert thêm (vẫn đảm bảo cấu trúc định dạng), không để tình trạng dữ liệu tràn.

------------------------------------------------
Tôi vẫn dùng Dictionary để thực hiện code vì nó đảm bảo mã vật tư không trùng.
 
Lần chỉnh sửa cuối:
Upvote 0
Mặc dù đã qua các bước kiểm tra và thực hiện trên Excel 2003 và máy tính bàn WindowXP, thì tốc độ code vẫn đảm bảo 415 ms cho 3 lần thực hiện.

attachment.php


attachment.php


attachment.php


attachment.php
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    141.7 KB · Đọc: 84
  • Picture2.jpg
    Picture2.jpg
    117.7 KB · Đọc: 83
  • Picture3.jpg
    Picture3.jpg
    119.4 KB · Đọc: 81
  • Picture4.jpg
    Picture4.jpg
    38.4 KB · Đọc: 85
Upvote 0
Q5=843.655 ==> máy tính của bác khá mạnh, laptop của em giá trị thời gian này là 1168.259
Hẳn nào code bạn chạy có chưa đến nửa giây cho khối lượng dữ liệu lớn vậy (>65000 dòng)

Sao máy của bạn nhanh thế? Máy của tôi là quãng 4200
------------
Theo tôi để đo tốc độ chỉ cần GetTickCount là đủ. Vì sao?
Một code dài thì bản thân code đó, chạy trên cùng một máy, ở thời điểm gần như nhau với trạng thái máy như nhau (các phần mềm đang chạy) đã cho các kết quả khác nhau rồi. Nếu code chạy mất vd. 800 ms và ta giả thiết là kết quả giữa các lần thử khác nhau là 25 phần nghìn thì có nghĩa là kết quả thực là 800 +- 20 ms.
Như thế sai số có thể là 20 ms. Vậy thì chả lý gì lại phải dùng QueryPerformanceFrequency + QueryPerformanceCounter. Với sai số cỡ đó thì dùng GetTickCount là đủ.

QueryPerformanceFrequency + QueryPerformanceCounter ta chỉ dùng khi mà phải đo tốc độ với độ chính xác cực lớn. Tức vd. đo tốc độ của code mà thời gian chạy nó là rất rất nhỏ. Nói cách khác dùng để đo khoảng thời gian cực ngắn.
------------
Ngay cả khi so sánh 2 code mà thời gian cho code 1 là 500 còn cho code 2 là 510 thì code nào nhanh hơn? Chạy cùng trên một máy, cùng "môi trường" nhưng chưa chắc đó là 2 môi trường như nhau. Vậy khi mà 2 kết quả khác nhau một lượng nằm trong giới hạn sai số do "dao động" trong system thì khó mà có thể phán code nào chạy nhanh hơn. Tất nhiên khi lượng khác nhau đó là lớn (tỉ lệ "lượng khác nhau" / thời gian gần đúng) thì có thể "yên tâm" đánh giá.
---
Vả lại nếu cần so sánh 2 gói đường mà chúng khác nhau ít nhất là cỡ 1 gam thì chả cần dùng cân có độ chính xác là 1 phần trăm (phần nghìn) gam
 
Lần chỉnh sửa cuối:
Upvote 0
Tại sao máy laptop có cấu hình như hình dưới mà chạy chậm hơn máy tính bàn vậy các Anh Chị?

Laptop nó chậm hơn máy bàn 30-40% chứ không phải là ít đâu! Quá ngạc nhiên luôn!

Máy này:

attachment.php


So với máy bàn này:

attachment.php
 

File đính kèm

  • CauHinh.jpg
    CauHinh.jpg
    93.4 KB · Đọc: 78
Lần chỉnh sửa cuối:
Upvote 0
ăn gian mà chạy như thế này được không bạn hiền. THÔNG THƯỜNG TÔI VIẾT CODE NÀY THÌ CHẠY KHOẢNG 1200--1500 . NHƯNG ĂN GIAN GIẢM 10 LẦN. MÀ CHẲNG ẢNH HƯỞNG ĐẾN KẾT QUẢ( TÀ ĐẠO)
ẸC ẸC
 

File đính kèm

  • HINH TEST4.jpg
    HINH TEST4.jpg
    237.8 KB · Đọc: 85
Lần chỉnh sửa cuối:
Upvote 0
kinh quá! Chắc không dám nộp bài quá! Vì mình thấy chênh lệch giữa máy tính bàn và máy laptop khá xa! Hihihihi.
tôi cung laptop nè . Nhưng khi test mấy lần đều không cho kết quả như nhau.chênh lêch khoảng 30%.
Nếu viết code tạo mới 1 pivot table kết hợp code tạo định dạng như báo cáo hoàn chỉnh là khoảng 1800--2400
NẾU ADD PIVOT VÀO THEO CÁCH CỦA SƯ PHỤ PTM0412 CODE REFRESH+... HET KHOẢNG 650---1100

CHỈ CÓ TÀ ĐẠO LÀ MỚI DƯỚI 100 THÔI.
 
Lần chỉnh sửa cuối:
Upvote 0
ăn gian mà chạy như thế này được không bạn hiền. THÔNG THƯỜNG TÔI VIẾT CODE NÀY THÌ CHẠY KHOẢNG 1200--1500 . NHƯNG ĂN GIAN GIẢM 10 LẦN. MÀ CHẲNG ẢNH HƯỞNG ĐẾN KẾT QUẢ( TÀ ĐẠO)
ẸC ẸC

Đã ăn gian thì tới bến luôn chứ sao lại nửa vời thế

Mã:
Sub DoThoiGian()
Dim arr
    Dim T1@, T2@, Freq@, Overhead@
    
    arr = he
    Sheets("THNXT").[B12].Resize(UBound(arr), 12).Value = arr
    
    QueryPerformanceFrequency Freq
    QueryPerformanceCounter T1
    QueryPerformanceCounter T2
    Overhead = T2 - T1
    QueryPerformanceCounter T1
    QueryPerformanceCounter T2
    
    MsgBox "milliseconds(ms): " & (T2 - T1 - Overhead) / Freq * 1000
End Sub

Trong đó he là hàm làm "mọi việc" và trả về mảng kết quả.
---
96 đã là gì. Tôi chạy code trên vài lần, trong đó có lần cho kết quả 0.
 
Lần chỉnh sửa cuối:
Upvote 0
đã ăn gian thì tới bến luôn chứ sao lại nửa vời thế

Mã:
sub dothoigian()
dim arr
    dim t1@, t2@, freq@, overhead@
    
    arr = he
    sheets("thnxt").[b12].resize(ubound(arr), 12).value = arr
    
    queryperformancefrequency freq
    queryperformancecounter t1
    queryperformancecounter t2
    overhead = t2 - t1
    queryperformancecounter t1
    queryperformancecounter t2
    
    msgbox "milliseconds(ms): " & (t2 - t1 - overhead) / freq * 1000
end sub

trong đó he là hàm làm "mọi việc" và trả về mảng kết quả.
không anh ơi. Code này không đụng đến. Anh tuân đã comments rồi.
ĂN GIAN NHƯNG KẾT QUẢ PHẢI ĐÚNG CHỨ AI LẠI ĐI SỬA CODE DO THỜI GIAN
TRONG EXCEL KẾT QUẢ MỚI LÀ QUAN TRỌNG.GIỐNG NHƯ CHÚNG TA THAM GIA GIAO THÔNG THÔI. MÁY BAY,Ô TÔ, TÀU LỬA,XE MÁY .MỖI NGƯỜI CHỌN PHƯƠNG TIỆN ĐI KHÁC NHAU DO HOÀN CẢNH, NHƯNG CUỐI CÙNG CŨNG ĐẾN ĐÍCH
ẸC ẸC
Bài của em mà nộp nếu chấm điểm sẽ bị loại. Vì không thuộc tiêu chí nào..

THÔI TÔI VẪN NỘP BÀI.
 
Lần chỉnh sửa cuối:
Upvote 0
Ăn gian vầy chắc được:
PHP:
Sub taoso()
 msgbox "milliseconds(ms): " & 50.000001 & "he he"
End sub

Chụp hình đúng thời điểm và post lên
 
Upvote 0
Để so sánh thời gian code của người này với người khác nên đảm bảo các yếu tố như sau:

1. Tất cả phải chạy trên cùng một máy tính
Phần cứng máy tính khác nhau, hệ điều hành khác nhau (Phiên bản Windows, 32, 64-bit), phiên bản Excel khác nhau, các ứng dụng đang chạy thường trú khác nhau, quy trình test khác nhau chính là các yếu tố làm cho kết quả đo tốc độ giữa các máy là không giống nhau với cùng một code.

2. Tắt tất cả các ứng dụng đang chạy, các chương trình thường trú cũng tắt đi nếu không liên quan đến Windows để giảm những tác động đến Windows và Excel.

3. Một bài thi phải được test theo quy trình như sau
b1. Tắt Excel (nếu đang mở)->Mở Excel -->đảm bảo môi trường "sạch"
b2. Mở file Excel cần đo thời gian. Hãy đợi một lúc đảm bảo Excel đã thực hiện các công việc của nó xong. Hãy nhấn CTRL+ALT+DEL để mở "Task Manager", trong tab "Processes" đảm bảo dòng có EXCEL.EXE, CPU và Memory đang ở con số ổn định (không thay đổi liên tục).
b3. Nhấn chạy thủ tục và ghi nhận thời gian thực hiện. Nên thực hiện tối thiểu 3 lần chạy để lấy 3 kết quả khác nhau rồi tính trung bình. Mỗi lần trước bấm nút "Thực hiện" hãy đảm bảo trong Process, CPU và Memory của dòng EXCEL.EXE đang ổn định.

Đến code của bài dự thi khác lại lập lại từ b1.
 
Upvote 0
Cái bảng dữ liệu ở sheet kho như thế hình như vẫn sao sao ấy, không biết các kho vật tư như thế nào, riêng kho cảng thì nhập lô hàng nào, khi xuất thì thanh lý, cho nên làm tới đâu tính tới đó.

Trường hợp nhập CSDL thế này thì 2-3 năm kiểm tra lại, lấy số tồn của thời gian trước ngày TỪ NGÀY thì phải quét hết những năm trước luôn, khi dữ liệu xuất ra thì chắc chắn sẽ có mã hàng có TỒN CUỐI là 0. Với CSDL như vậy sẽ không được hay lắm thì phải.

Nếu lọc kiểu này thì phải thêm 1 vòng lặp nữa xét nếu mã nào có tồn cuối là 0 thì loại ra.

Đôi lời góp ý.
 
Upvote 0
Cái bảng dữ liệu ở sheet kho như thế hình như vẫn sao sao ấy, không biết các kho vật tư như thế nào, riêng kho cảng thì nhập lô hàng nào, khi xuất thì thanh lý, cho nên làm tới đâu tính tới đó.

Trường hợp nhập CSDL thế này thì 2-3 năm kiểm tra lại, lấy số tồn của thời gian trước ngày TỪ NGÀY thì phải quét hết những năm trước luôn, khi dữ liệu xuất ra thì chắc chắn sẽ có mã hàng có TỒN CUỐI là 0. Với CSDL như vậy sẽ không được hay lắm thì phải.

Nếu lọc kiểu này thì phải thêm 1 vòng lặp nữa xét nếu mã nào có tồn cuối là 0 thì loại ra.

Đôi lời góp ý.

CSDL đơn giản để phục vụ cho làm bài tập này thôi. Còn để làm nghiệp chọn vẹn thì trong CSDL này phải thêm nhiều cột nữa. Anh Nghĩa cứ tạm thế nhé.
 
Upvote 0
... chắc chắn sẽ có mã hàng có TỒN CUỐI là 0. Với CSDL như vậy sẽ không được hay lắm thì phải.

Nếu lọc kiểu này thì phải thêm 1 vòng lặp nữa xét nếu mã nào có tồn cuối là 0 thì loại ra.

Đôi lời góp ý.
Không phải tồn cuối bằng 0 thì loại ra, mà là đầu kỳ bằng 0, cả nhập cả xuất đều bằng 0 thì mới loại ra.
Nếu đầu kỳ = 0, nhập 100, xuất 100, tồn cuối = 0 mà loại ra thì sai.
 
Upvote 0

Mình đã nhận được bài của bạn Lê Duy Thưởng. Tốc độ code trong thủ tục "AN_GIAN" rất nhanh :). Mình có chút góp ý mong bạn chỉnh thêm.

Trong sổ THNXT, nếu người dùng xóa từ dòng 12 đến một số dòng nào đó thì code sẽ báo lỗi. Có thể trong sheet THNXT bạn đã "iểm bùa" Pivot Table? Nếu là Pivot Table cũng là một giải pháp nhưng ta nên làm nhứ sau trong code để không bị "gian".
Viết code kiểm tra Pivot đã tồn tại chưa? Nếu chưa thì tạo nó. Trước khi chạy "Thực hiện" để đo tốc độ sheet THNXT phải chưa có Pivot.
Trong một chương trình ứng dụng, nếu mỗi báo cáo ta lưu cấu trúc Pivot dung lượng file sẽ nặng, vậy trước khi lệnh Save được thực hiện cần xóa Pivot (một trong các yếu tốt quan trọng làm cho file Excel chạy nhanh và dung lượng nhẹ là xóa liên kết, công thức). Vậy nên trong thực tế ứng dụng theo cách tạo pivot, lần đầu tạo sổ THNXT sẽ bị chậm vì phải tạo, còn lần sau (khi chưa lưu) chạy sẽ rất nhanh.
 
Lần chỉnh sửa cuối:
Upvote 0
OK, đã gửi bài tham gia rồi Anh Tuân nhé! Hy vọng được bổ sung kiến thức từ mọi người qua cuộc thi này!
 
Upvote 0
Sao e chưa thấy thầy ndu96081631 và ThuNghi nạp bài vậy ta.Thầy ơi tranh thủ làm 1 bài nộp đi...
 
Upvote 0
Sửa lại dùm em cái này anh Anh Tuân, copy mà không sửa lại:

Mã:
    If m Then
        Dim ArrProcessing()
        ReDim ArrProcessing(1 To m, 1 To 12)
        For c = 1 To 12
            For r = 1 To m
                ArrProcessing(r, c) = ArrReport(GetRows(r), c)
            Next
        Next
        Call RowCorrect(m)
        Range("BasicName").Resize(m, 12) = [B][COLOR=#ff0000]ArrProcessing[/COLOR][/B]
    Else
        Call RowCorrect(n)
        Range("BasicName").Resize(n, 12) = ArrReport
    End If

Sửa lại chỗ màu đỏ anh nhé! Thanks.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0

Bài viết mới nhất

Back
Top Bottom