Nhờ mọi người giúp đỡ, chạy Sub Total rất lâu.

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

ndphongskr

Thành viên mới
Tham gia
24/4/20
Bài viết
26
Được thích
4
Chào các bác ạ, nhờ các bác giúp đỡ mình file này với, khi mình chạy từng sub riêng của nó thì nhanh nhưng khi chạy Sub Total của nó thì lại rất lâu, đợi mãi chả thấy được mà bị đơ luôn cả máy ạ. Mình có kiểm tra thì thấy có vẻ như nó bị ở mục Sub CheckNorm mà mình ko hiểu sao lại bị, vậy kính mong các bác giúp đỡ ạ. Cám ơn!
 

File đính kèm

  • File Chay.xlsm
    1.6 MB · Đọc: 26
  • File du lieu.xlsx
    6.3 MB · Đọc: 20
Lúc đầu, khi ai đó viết code thì chắc chắn là chạy tốt. Đến 1 lúc dữ liệu loạn rồi thì sinh chuyện. Chừ thì ai viết cho bạn thì nhờ người ấy sửa chứ.
 
Upvote 0
Hic! Tự viết thì bạn phải biết debug chứ nhỉ?
nhưng khổ nỗi là nó ko debug bác ợ, mình chạy từng sub riêng lẻ thì lại rất bình thường, ko có vấn đề gì ạ, nhưng khi chạy sub total tổng hợp tất cả các sub thì nó rất lâu đến nỗi đơ cả máy luôn á bác :(
 
Upvote 0
Mình thử mở sub total lên, nó call 1 loạt sub thì không lâu mới lạ.
Bạn tung hỏa mù lên thì khó đấy.
1. Dòng bị lỗi ở đâu?
2. File nhiều sub thì cấu trúc chạy file như thế nào, các bước bấm có ảnh hưởng gì không ?
1686195086152.png
 
Upvote 0
nhưng khổ nỗi là nó ko debug bác ợ, mình chạy từng sub riêng lẻ thì lại rất bình thường, ko có vấn đề gì ạ, nhưng khi chạy sub total tổng hợp tất cả các sub thì nó rất lâu đến nỗi đơ cả máy luôn á bác :(
Debug là 1 hành động của người viết code để dò lỗi chứ không phải là hành động của "nó" như bạn nói.

Nếu chạy riêng tuần tự từng sub không sao nhưng dùng sub khác gọi chúng liên tiếp với nhau thì đơ máy thì nên xem lại vị trí cell bắt đầu của sub chạy sau có giống như khi chạy riêng không, xem lại có thông số gì kế thừa nhưng không phù hợp, xem lại.... Muốn vậy thì phải debug.
 
Upvote 0
Mình thử mở sub total lên, nó call 1 loạt sub thì không lâu mới lạ.
Bạn tung hỏa mù lên thì khó đấy.
1. Dòng bị lỗi ở đâu?
2. File nhiều sub thì cấu trúc chạy file như thế nào, các bước bấm có ảnh hưởng gì không ?
View attachment 291182
vâng, vì mình cũng mới vọc vạch VBA nên cũng ko hiểu rõ về nó lắm, cứ nghĩ đơn giản là khi làm Sub riêng lẻ OK rồi thì làm Total để nó chạy từng sub thôi chứ ko biết nó ảnh hưởng vậy :(
 
Upvote 0
Mười mấy cái button rải trên sheet và mười mấy cái sub này, khi muốn chỉnh sửa, bảo trì chắc khóc ra tiếng Mán.
Sao không làm cái Userform mà sắp xếp hết lên trên đó, vừa nhẹ code mà khỏi phải call hết sub này tới sub kia?
 
Upvote 0
Debug là 1 hành động của người viết code để dò lỗi chứ không phải là hành động của "nó" như bạn nói.

Nếu chạy riêng tuần tự từng sub không sao nhưng dùng sub khác gọi chúng liên tiếp với nhau thì đơ máy thì nên xem lại vị trí cell bắt đầu của sub chạy sau có giống như khi chạy riêng không, xem lại có thông số gì kế thừa nhưng không phù hợp, xem lại.... Muốn vậy thì phải debug.
ý bác vị trí chạy cell bắt đầu của sub chạy sau có giống như chạy riêng ko là như thế nào ạ? Bác thông cảm, mình cũng chỉ mới vọc vạch VBA nên nhiều khi cũng ko hiểu rõ bản chất của VBA ạ.
 
Upvote 0
Mười mấy cái button rải trên sheet và mười mấy cái sub này, khi muốn chỉnh sửa, bảo trì chắc khóc ra tiếng Mán.
Sao không làm cái Userform mà sắp xếp hết lên trên đó, vừa nhẹ code mà khỏi phải call hết sub này tới sub kia?
Bác có thể gợi ý cho em học hỏi khi sắp xếp lên userform được không
 
Upvote 0
Mười mấy cái button rải trên sheet và mười mấy cái sub này, khi muốn chỉnh sửa, bảo trì chắc khóc ra tiếng Mán.
Sao không làm cái Userform mà sắp xếp hết lên trên đó, vừa nhẹ code mà khỏi phải call hết sub này tới sub kia?
dạ mình làm mấy cái button đấy để làm từng bước thôi bác ạ, xong thì mình sẽ bỏ hết các button đấy đi còn 1 cái Enter kia thôi, làm cái Userform kiểu gì mình cũng ko biết làm bác ạ, mình cũng mới vọc vạch VBA cũng chỉ biết sơ sơ như vậy thôi chứ ko hiểu bản chất sâu của vấn đề ạ. Để mình tìm hiểu thêm ạ.
 
Upvote 0
dạ mình làm mấy cái button đấy để làm từng bước thôi bác ạ, xong thì mình sẽ bỏ hết các button đấy đi còn 1 cái Enter kia thôi, làm cái Userform kiểu gì mình cũng ko biết làm bác ạ, mình cũng mới vọc vạch VBA cũng chỉ biết sơ sơ như vậy thôi chứ ko hiểu bản chất sâu của vấn đề ạ. Để mình tìm hiểu thêm ạ.
1- Về Useform trong VBA thì bạn google ra đầy, chỉ gợi ý thôi, còn thì bạn tự tìm hiểu. Vì bạn đã vọc vạch được 20 cái sub kia thì cái này là muỗi
2- Về việc code chạy được mà lâu quá, bạn có thể vào từng sub, chèn cái msgbox hiển thị cái timer (sau khi chạy sub xong, 1 cái msgbox sẽ hiện thị thời gian chạy của cái sub đó) . VD:
PHP:
sub abc
Dim t
...
t=timer
<main code>
msgbox timer-t
end sub
 
Upvote 0
1- Về Useform trong VBA thì bạn google ra đầy, chỉ gợi ý thôi, còn thì bạn tự tìm hiểu. Vì bạn đã vọc vạch được 20 cái sub kia thì cái này là muỗi
2- Về việc code chạy được mà lâu quá, bạn có thể vào từng sub, chèn cái msgbox hiển thị cái timer (sau khi chạy sub xong, 1 cái msgbox sẽ hiện thị thời gian chạy của cái sub đó) . VD:
PHP:
sub abc
Dim t
...
t=timer
<main code>
msgbox timer-t
end sub
dạ OK, cám ơn bác ạ, để mình tìm hiểu và sửa, theo như các bác khai sáng thì lỗi là do mình thôi, để mình tìm xem lỗi ở đâu. Cám ơn các bác nhiều nhé :D
 
Upvote 0
Về lý thuyết, mười mấy sub con sẽ quản lý tốt hơn là 1 sub khủng. Tuy nhiên thực tế thì việc test lại phải kỹ càng hơn.
Một trong những cách test:
Chạy sub 1. Test kết quả và lỗi nếu có
Gọi ra chạy 2 sub 1 rồi tới 2: Test kết quả và lỗi nếu có
Gọi ra chạy 3 sub, 1 tới 2 rồi tới 3, Test kết quả và lỗi nếu có
....
Gọi hết các sub.
 
Upvote 0
vâng, vì mình cũng mới vọc vạch VBA nên cũng ko hiểu rõ về nó lắm, cứ nghĩ đơn giản là khi làm Sub riêng lẻ OK rồi thì làm Total để nó chạy từng sub thôi chứ ko biết nó ảnh hưởng vậy :(
Thôi. Bạn search từ khóa "debug" đi! Trên mạng hoặc trong GPE có cả đống. Viết code được mà không tự debug được là xem như chưa được.
 
Upvote 0
Vấn đề là "chạy lâu", chứ không phải là "không chạy", sao lại đưa "debug" với cả "test" từng sub vào đây nhỉ!
VD: Sub tong trong đó call từ sub1 tới sub 18.
VẬy ở cái sub 10 chẳng hạn, mình cấy msgbox vào.
Vẫn thấy lâu quá mà không có cái msgbox xuất hiện thì giới hạn lại sub 7 hay 8 chẳng hạn, thì sẽ tìm ra cái sub nào chạy lâu thôi.
 
Upvote 0
Báo 1 tin buồn là sau khi thêm 2 dòng tmr vào như ảnh, thì kết quả ra như 2 ảnh sau.
Rất buồn vì không nhận được treo máy.
 

File đính kèm

  • 1686201417103.png
    1686201417103.png
    22.9 KB · Đọc: 30
  • 1686201441703.png
    1686201441703.png
    53.6 KB · Đọc: 31
  • 1686201454214.png
    1686201454214.png
    463.9 KB · Đọc: 30
Upvote 0
Vấn đề là "chạy lâu", chứ không phải là "không chạy", sao lại đưa "debug" với cả "test" từng sub vào đây nhỉ!
VD: Sub tong trong đó call từ sub1 tới sub 18.
VẬy ở cái sub 10 chẳng hạn, mình cấy msgbox vào.
Vẫn thấy lâu quá mà không có cái msgbox xuất hiện thì giới hạn lại sub 7 hay 8 chẳng hạn, thì sẽ tìm ra cái sub nào chạy lâu thôi.
Đó là 1 trong những việc debug đó, vì tại sao chúng chạy lâu đến mức phải đơ máy.
 
Upvote 0
Về lý thuyết, mười mấy sub con sẽ quản lý tốt hơn là 1 sub khủng. Tuy nhiên thực tế thì việc test lại phải kỹ càng hơn.
Một trong những cách test:
Chạy sub 1. Test kết quả và lỗi nếu có
Gọi ra chạy 2 sub 1 rồi tới 2: Test kết quả và lỗi nếu có
Gọi ra chạy 3 sub, 1 tới 2 rồi tới 3, Test kết quả và lỗi nếu có
....
Gọi hết các sub.
Về lý thuyết, cỡ phức tạp như vầy thì code phải có chú thích nó làm gì và ước lượng đầu vào, đấu ra.
Hàm chính phải có giải thích nó gọi những hàm phụ làm gì.
Không có chỗ giải thích rõ thù đây là lúc mà thiếng Anh gọi là: "it turns around and bites you hard on the ass"

Ít nhất người muốn sử code phỉa hiểu rõ nhnwgx chỗ họ cắt và thêm khong làm thay đổi mục đích code.
 
Upvote 0
Web KT
Back
Top Bottom