Nhờ sửa VBA chạy chậm

Liên hệ QC

tiendat210

Thành viên mới
Tham gia
3/5/11
Bài viết
25
Được thích
5
Xin nhờ mọi người sửa dùm mình 2 cái code. 2 code hiện tại thì chạy đúng ý mình rồi, nhưng nó còn chạy chậm và khi chạy thì nó báo Not Responding khoảng 10 giây rồi nó mới hiện kết quả ạ.
Mình có file đính kèm cả code ạ
 

File đính kèm

  • test.xlsm
    2.3 MB · Đọc: 24
Duyệt mảng mà bạn gán giá trị từng cell như thế chạy chậm là đúng rồi. Đây là một giải pháp nhé, còn 1 giải pháp nhanh hơn nữa là dùng Dic nhưng mình không rành cái đó lắm.
 

File đính kèm

  • test.xlsm
    2.3 MB · Đọc: 14
Upvote 0
Xin nhờ mọi người sửa dùm mình 2 cái code. 2 code hiện tại thì chạy đúng ý mình rồi, nhưng nó còn chạy chậm và khi chạy thì nó báo Not Responding khoảng 10 giây rồi nó mới hiện kết quả ạ.
Mình có file đính kèm cả code ạ
1665380080582.pngCái hàm ExtractNumber kia không có trong code. Dẫn đến nó bị lỗi.Bạn có thể dùng mảng thử xem
 
Upvote 0
Duyệt mảng mà bạn gán giá trị từng cell như thế chạy chậm là đúng rồi. Đây là một giải pháp nhé, còn 1 giải pháp nhanh hơn nữa là dùng Dic nhưng mình không rành cái đó lắm.
Mình xem code của bạn rồi, mình chưa học youtube tới mảng nên chưa hiểu lắm, nhưng nó đã chạy nhanh đúng ý của mình rồi. Cám ơn bạn và mọi người nhé
 
Upvote 0
Chào bạn, @BuiQuangThuan @vu_tuan_manh_linh lại phiền lần nũa ạ
Giờ mình mới kiểm tra là mình lấy cột firstcolumn bị sai, nên nếu nhấn nút tính tổng trước, rồi nhấn nút tính ngày thì nó sẽ bị sai so với tính ngày trước rồi nhấn tính tổng. Mong bạn sửa lại cái cột firstcolumn trong code dùm mình được không ạ? Xin cám ơn rất nhiều ạ
 
Upvote 0
...Cái hàm ExtractNumber kia không có trong code. Dẫn đến nó bị lỗi.Bạn có thể dùng mảng thử xem
VBA của 365 tự thêm cái "@" để báo cho bảng tính biết rằng "không dùng hàm mảng động". Excel 365 tự biết sử lý.
Muốn sử dụng được ở các phiên bản cũ hơn thì dùng thuộc tính Formula2 thay vì Formula.
 
Upvote 0
Em xin phép chấm ở đây để học hỏi. Cảm ơn chủ bài viết.
Tôi cũng chấm ở đây. Nhưng cái điểm tôi cần "học hỏi" có lẽ khác bạn.

Tôi cần học hỏi tại sao 10 giây gọi là chậm.
Đối với tôi, 1/2 tiếng đồng hồ mà ra kết quả đúng thì chấp nhận.
1/2 giây ra kết quả mà nhìn vào code chả hiểu gì cả thì không chấp nhận.
Điển hình vấn đề bài #7, gặp kết quả không đúng ý mà không biết tự chỉnh là do chả hiểu code ấy được viết như thế nào cả.
 
Upvote 0
Tôi cũng chấm ở đây. Nhưng cái điểm tôi cần "học hỏi" có lẽ khác bạn.

Tôi cần học hỏi tại sao 10 giây gọi là chậm.
Đối với tôi, 1/2 tiếng đồng hồ mà ra kết quả đúng thì chấp nhận.
1/2 giây ra kết quả mà nhìn vào code chả hiểu gì cả thì không chấp nhận.
Điển hình vấn đề bài #7, gặp kết quả không đúng ý mà không biết tự chỉnh là do chả hiểu code ấy được viết như thế nào cả.
Mỗi người có 1 cách học khác nhau, mình cũng không thể nói được gì. Đúng là mình chưa học về mảng nên mình chưa hiểu, nhưng giờ đã biết trên đời này có cái gì đó gọi là mảng và nó làm cho code chạy nhanh hơn. Và thế là, 1 vài ngày tới mình sẽ tìm các kênh nói về mảng. Code mình chạy là 38s, nhờ sự giúp đỡ, nó còn khoảng đâu đó 4-5s. Một mũi tên trúng 2 đích. Quá tuyệt vời
 
Upvote 0
Chào bạn, @BuiQuangThuan @vu_tuan_manh_linh lại phiền lần nũa ạ
Giờ mình mới kiểm tra là mình lấy cột firstcolumn bị sai, nên nếu nhấn nút tính tổng trước, rồi nhấn nút tính ngày thì nó sẽ bị sai so với tính ngày trước rồi nhấn tính tổng. Mong bạn sửa lại cái cột firstcolumn trong code dùm mình được không ạ? Xin cám ơn rất nhiều ạ
Tôi có hiểu công thức bạn muốn tính toán như thế nào đâu mà sửa giúp bạn được. Phần này bạn phải tự mò thôi, code của bạn mà!
 
Upvote 0
Mỗi người có 1 cách học khác nhau, mình cũng không thể nói được gì. ....
Cũng có thể nói nỗi người có một cách chỉ dẫn khác nhau. Nhưng điều này thì tôi nói được.
Diễn đàn không phải là trường học, và vì vậy cách học cũng như cách chỉ dẫn không thể bắt buộc.
Và có những cách chỉ dẫn không hiệu quả cũng như có những cách học không nhiệu quả.
Chỉ dẫn không hiệu quả là do trình thấp, hoặc do chủ quan. Học không hiệu quả là do ỷ lại và lười biếng.

Những lời ở bài #9 trên, vã cũng như những lời tôi nói sau đây là tôi nói với những người khác trên diễn đàn, không phải với bạn. Bạn chỉ là cái vấn đề điển hình để tôi chỉ dẫn thôi.

- Các cells, ranges trên bảng tính được VBA truy cập qua một gaio diện thỏa thuận giữa Excel và VBA. Giao diện Cells/Ranges nằm trong code của đối tượng Cells/Ranges và mang nhiều thuộc tính cho nên khá nặng. Để từ Range này sang Range khác, VBA không có hàm trực tiếp mà phải trao "handshake" cho giao diện.
- Mảng là cấu trúc căn bản của lập trình. Mọi ngôn ngữ lập trình đếu có code sử dụng mảng. Khi tôi nói "mọi" thì có nghĩa là "tất cả", một đôi rường hợp ngoại lệ là tối đa, và các ngoại lệ này ta không cần biết tới. Vì là cấu trúc cơ bản cho nên mọi ngôn ngữ đều dùng code (bên trong) rất hiệu quả. Sử dụng mảng là cách tiết kiệm code và tiết kiệm năng lượng máy cao nhất. Điều kiện bó buộc duy nhất của mảng là mảng phải chiếm một vùng nhớ liên tục trong bộ nhớ chi nên việc co/dãn độ lớn của mảng hơi bị bó buộc.
- Giao diện giữa đối tượng Cells/Ranges và mảng VBA chứa vài hàm dùng để "kéo" dữ kiệu từ Cells/Ranges vào mảng và ngược lại "trút" dữ liệu từ mảng vào Cells/Ranges. MS biết VBA cần làm việc này cho nên mấy cái hàm "kéo/trút" này đợc cải tiến thường xuyên và rất hiệu quả.

Túm lại, nếu phải làm việc với một khoảng Range liên tục (điều kiện liên tục là bắt buộc) thì người ta có vài cách sau đây để thực hiện cho nhanh:
1. Dùng hàm Evaluate cho cả range. Điều kiện là con toán khá giản dị.
2. Tạo một hàm cho cell đầu tiên và fill cho các cells còn lại. Với con toán hơi phức tạp hơn một chút.
3. Trường hợp khá phức tạp: Kéo dữ liệu vào một mảng. Xào nấu cho đúng, hoặc trên chính mảng này, hoặc tạo ra mảng khác. Chép mảng kết quả vào range.

Chú: mảng cần một vùng nhớ liên tục cho nên VBA không thể vét các mẩu nhỏ trong bộ nhớ mà phải lấy một vùng mới nguyên. Hậu quả là mảng lớn thì các máy cấu hình thấp có thể không chịu nổi. Tôi nói "chịu nổi" ở đây là lượng RAM, chứ đối với CPU thì không thành vấn đề. Các máy có nhiều RAM thì cứ vô tư.
 
Upvote 0
Web KT

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

Back
Top Bottom