ThuNghi đã viết:
Tôi cũng dùng vòng lặp, nhưng hay lùng bùng các tham số dòng cột. Và bực nhất là dl nguồn thay đổi, số TT cột, dòng change.
Xin thọ giáo nữa:
1/Thay vì range(...).count hay WS.counta(), có nên cho nó giá trị count vào 1 cells() nào đó. Áp dụng trong tìm dòng cuối.
2/Khi tìm trong danh mục theo 1 tiêu thức nào đó, giống như đưa dl vào listbox (file của Hiếu), nên làm công thức index match, dùng vba copy công thức xuống, vẫn giữ formular, liệu có nhanh hơn là VBA hòan tòan (vòng lặp).
3/ Các cao thủ giúp cho tôi cú pháp và ví dụ vòng lặp for each...Phần này chưa hiểu lắm.
Xin cám ơn nhiều.
Theo mình nghĩ :
1. Không nên cho giá trị dòng cuối cùng vào 1 ô nào đó vì đó cũng là công thức mà, hơn nữa lại thêm 1 ô.
- Nếu để đặt name thì nên đặt giá trị này là 1 name luôn. VD : DC = counta(Data!A1:A65000)
Sau đó muốn lấy giá trị này để đặt name (dùng Offset) thì cứ gọi nó ra. Sau này có chỉnh sửa gì thì chỉ chỉnh sửa DC là được
- Nếu để tính toán trong VBA (dùng vòng lặp chẳng hạn), ta nên dùng cách DC = Range("A65000").End(xlUp).Row như vậy rất nhanh và không phụ thuộc vào ô nào cả (để nếu bị xóa . . thì vẫn không ảnh hưởng)
Nó chỉ tính toán 1 lần khi bắt đầu chạy Sub, còn nếu là ô thì cứ khi nào sheet đó tính toán là nó lại tính toán lần nữa. Như vậy tốc độ sẽ giảm đi.
2. Dùng công thức sau đó copy xuống các hàng dưới hay dùng VBA ??
Bản thân mình cũng đã suy nghĩ nhiều về nó.
Nếu chỉ có 1 ô thì đúng là dùng công thức nhanh hơn nhiều. Vì công thức cũng là một đoạn mã máy đã được tối ưu hoàn toàn. Nó cũng là một vòng lặp thôi.
VD : Countif : Nó phải duyệt qua tất cả các ô (vòng lặp đấy), sau đó ô nào thỏa mãn điều kiện thì nó sẽ tính là 1.
Hàm sum, counta, count . . . cũng thế.
Hãy thử tưởng tượng nhé :
Data của ta có 10.000 dòng. Bảng tổng hợp của ta có 4 cột, 200 hàng.
- Công thức : Như vậy nếu dùng công thức ta sẽ có 800 ô tương đương 800 công thức. Và để tính toán nó thì mỗi ô cũng đều là một vòng lặp, như vậy ta phải dùng 800 vòng lặp. Làm cách này thì dễ vì lập công thức không có gì là khó cả. Khi cần thay đổi thì rất nhanh
- Vòng lặp : Ta chỉ cần duyệt 1 lần thôi. Nhưng khi thay đổi điều kiện thì lại rất mất thời gian.
Vậy đấy, khi các ô chỉ có vài chục thì dùng công thức cũng không sao, tuy nhiên số lượng ô tính toán lên đến hàng trăm, hàng ngàn thì dùng vòng lặp sẽ tốt hơn (và khổ hơn)
3. Bác thử xem qua File này xem nhé. Em đang làm dở (chuyển từ AF sang vòng lặp, sử dụng Main, Sub)
Thân!