tốc độ sử lý của vòng lập for each next và for next (1 người xem)

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

diemhuyenanh

Thành viên hoạt động
Tham gia
6/9/09
Bài viết
167
Được thích
58
trong file đính kèm mình dùng 2 vòng lập for each và for i trên 2 thu tục khác nhau để sử lý một vấn đề nhưng không hiểu sao vòng lập for each cho tốc độ sự lý chậm hơn rất nhiều so với vòng lập for i . Bạn nào có thể giải thích hộ mình với.
 

File đính kèm

trong file đính kèm mình dùng 2 vòng lập for each và for i trên 2 thu tục khác nhau để sử lý một vấn đề nhưng không hiểu sao vòng lập for each cho tốc độ sự lý chậm hơn rất nhiều so với vòng lập for i . Bạn nào có thể giải thích hộ mình với.

Đã lập phép so sánh, thì 2 các yếu tố liên quan cũng phải tương đồng, nhưng mình thấy ở 2 code của bạn có 1 vài điểm không tương đồng với nhau :
Ví dụ :
Mã:
lastRow = Sheet1.Range("G65536").End(4).Row
Set Arr = Sheet1.Range("G3:G" & lastRow)
Và :
Mã:
lastRow = Sheet1.Range("G65536").End(xlUp).Row
Arr = Sheet1.Range("G3:H" & lastRow).Value
*2 code trên, giá trị Arr khác nhau hoàn toàn về cả chất và lượng
*Nếu Arr là một mảng thì mảng này là mảng 2 chiều , vòng lặp for each sẽ duyệt tất cả các phần tử trong mảng này theo thứ tự từ trên xuống dưới, từ trái sang phải
* Tuỳ trường hợp cụ thể mà dùng for each, và for .. next !
 
Lần chỉnh sửa cuối:
Upvote 0
mình mới biết về vba cho nên mình cũng không hiểu bản chất của 2 vòng lập trên.
trong vòng lập for each mình dùng mảng 1 chiều
còn for next mình dùng mảng 2 chiều.
vậy tại sao lại có sự khác biệt như vậy
 
Upvote 0
mình mới biết về vba cho nên mình cũng không hiểu bản chất của 2 vòng lập trên.
trong vòng lập for each mình dùng mảng 1 chiều
còn for next mình dùng mảng 2 chiều.
vậy tại sao lại có sự khác biệt như vậy
khác biệt 1 phần là do 2 code của bạn khác biệt , mình đã nói ở trên là : giá trị Arr mà bạn tạo ra trong 2 code khác nhau cả về chất và lương,do đó không thể so sánh kiểu này được :
Bạn kiểm tra lại :
dùng 2 câu lệnh sau cho từng code :
Mã:
Msgbox Arr.rows.count
Mã:
Msgbox Ubound(Arr,1)
bạn có thấy 2 giá trị tương đồng không ? ,
1 vùng Arr tận 65536 dòng, trong khi Arr kia chỉ có 74 hàng, --> Nếu bạn viết for each cho code dưới , có khi bạn sẽ có kết luận ngược lại đấy!|||||
 
Lần chỉnh sửa cuối:
Upvote 0
đúng rồi mình đã dùng sai lastRow= sheet1.range("G65536").end(4).row
đáng ra phải thế này lastRow= sheet1.range("G65536").end(xlup).row
Cảm ơn bạn!
 
Upvote 0
For counter = ... là cấu trúc kết nối sớm; trình dịch VBA đã biết kiểu của counter.
For each item in ... là cấu trúc kết nối trễ; kiểu của item bắt buộc phải là Variant, trình dịch VBA không biết kiểu thật cho đến khi thật sự xét collection.

Trên nguyên tắc, kết nối sớm luôn luôn nhanh hơn kết nối trễ. Tuy nhiên, cỡ collection đôi ba trăm phần tử thì không đủ thấy được đâu.
 
Upvote 0

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

Back
Top Bottom