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ư.