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

Liên hệ QC

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

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

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
Bạn thử ghi lại thời lượng dành cho mỗi thằng/con macro thân iêu của bạn được không?
Xin cảm ơn bạn!
 
Upvote 0
Bạn thử ghi lại thời lượng dành cho mỗi thằng/con macro thân iêu của bạn được không?
Xin cảm ơn bạn!
Đây bác ạ, mình thử tách ra và chạy thì đến đoạn sub CheckNorm là nó rất là lâu, chạy 1% một luôn
1686208458635.png1686208463931.png1686208468526.png
nhưng tắt file đi nhấn chạy sub test2 1 lần nữa thì lại OK
1686208693058.png
 
Upvote 0
Đó 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.
Chạy lâu cũng là 1 lỗi, và tôi cũng ghi rõ là thêm từng sub để thấy lỗi. Lạ 1 cái là "cao thủ" như bebo mà không nhận ra người khác nói gì, cứ cho là mình đúng nhất.
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.
Ở mức độ chủ đề này và trình độ chủ bài, tôi còn chưa đề nghị chạy ngược 5 4 3 2 1
 
Upvote 0
Chạy lâu cũng là 1 lỗi, và tôi cũng ghi rõ là thêm từng sub để thấy lỗi. Lạ 1 cái là "cao thủ" như bebo mà không nhận ra người khác nói gì, cứ cho là mình đúng nhất.

Ở mức độ chủ đề này và trình độ chủ bài, tôi còn chưa đề nghị chạy ngược 5 4 3 2 1
vâng, cháu cũng đã thử như cách của chú nói chạy 1 2 3 từng sub 1 đến sub thứ 4 thì bị lỗi, lỗi ở đây là nó chạy rất là lâu ạ, nhưng vấn đề là do trình độ có hạn nên cháu cũng ko biết giải quyết như thế nào nữa :(
1686211445308.png
 
Upvote 0
Đây là phần trích từ 'Sub' đang chậm của bạn
PHP:
 Sub CheckNorm()
    Dim lastRow As Long
   
    Sheets("Product_Qty").Select
    lastRow = Cells(Rows.Count, "C").End(xlUp).Row
     With Range(Cells(2, "O"), Cells(lastRow, "O"))
        .Formula = "=IFERROR(VLOOKUP(C2,Check!A:B,2,0),"""")"
        .Value = .Value
     End With
     ' . . . . . .
     With Range(Cells(2, "Y"), Cells(lastRow, "Y"))
        .Formula = "=IFERROR(VLOOKUP(C2,Check!U:V,2,0),"""")"
        .Value = .Value
     End With
  End Sub

Mình đề nghị bạn xen lại chuyện xài VLOOKUP() cả vùng gồm tròn 2 cột là sao (?)
 
Upvote 0
Đây là phần trích từ 'Sub' đang chậm của bạn
PHP:
 Sub CheckNorm()
    Dim lastRow As Long
  
    Sheets("Product_Qty").Select
    lastRow = Cells(Rows.Count, "C").End(xlUp).Row
     With Range(Cells(2, "O"), Cells(lastRow, "O"))
        .Formula = "=IFERROR(VLOOKUP(C2,Check!A:B,2,0),"""")"
        .Value = .Value
     End With
     ' . . . . . .
     With Range(Cells(2, "Y"), Cells(lastRow, "Y"))
        .Formula = "=IFERROR(VLOOKUP(C2,Check!U:V,2,0),"""")"
        .Value = .Value
     End With
  End Sub

Mình đề nghị bạn xen lại chuyện xài VLOOKUP() cả vùng gồm tròn 2 cột là sao (?)
VLOOKUP() cả vùng gồm tròn 2 cột là sao (?)
Câu hỏi này của bác mình vẫn chưa hiểu lắm ạ, bác có thể chỉ rõ ra chút được ko ạ, hàm vlookup đấy của mình chỉ đơn giản là tìm trả về giá trị tương ứng ô C2 thôi bác ạ.
 
Upvote 0
À mình cho rằng bạn tìm ở 1 vùng gồm 2 cột với 99 dòng sẽ khác với vùng 2 cột 999 999 dòng
vâng để mình thử lại
đã sửa lại theo vùng nhưng ko đỡ hơn được bao nhiêu bác ợ, cũng chả hiểu là do đâu. mà như bác @cantl chạy cả sub đấy chưa đầy 26 giây đã xong :((
 
Lần chỉnh sửa cuối:
Upvote 0
À mình cho rằng bạn tìm ở 1 vùng gồm 2 cột với 99 dòng sẽ khác với vùng 2 cột 999 999 dòng
cám ơn bác nhé, đã kiểm tra kỹ lại thì có vẻ như việc chạy vlookup 2 cột nó lâu hơn nên mình đã khoanh vùng giới hạn lại chạy rất nhanh, tổng thời gian chạy file hết tầm 23s :D, chân thành cám ơn các bác đã đóng góp ý kiến ạ.
 
Upvote 0

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

Back
Top Bottom