...
Thưa chú. Cứ thi thoảng lại thấy cái chữ VBA.xxxx
Thay vì chữ đó : a = array(xxx)
b = array(xxx)
Thì khả năng nó xảy ra cái gì không mà cứ thấy nó lạ lạ ạ?
Vụ này tôi giải thích vài lần rồi. Nhưng mà cũng hơi lâu. Tôi cũng không ngại nhắc lại cho các bạn hiếu học.
1. VBA là một trong những ngôn ngữ tồi nhất về tiêu chuẩn. Nó có cả đống hàm không thống nhất, gọi qua kiểu x thì làm việc
hơi khác với gọi qua kiểu y.
2. Vì quan hệ mật thiết với bảng tính cho nên VBA phải phân loại mặc định cho Lower Bound (LBound) của mảng. Luật chung như sau:
- bất cứ mảng nào từ bảng tính ra thì mặc định LBound là 1.
- các mảng từ hàm VBA (Array, Split,...) cho ra thì mặc định LBound là 0.
3. Khi
xuất hiện bên trong code thì "VBA" là từ khóa tên của đối tượng có tên là VBA. Vì vậy, hàm hay hằng đi với tiền tố (prefix) "VBA." là hàm/hằng
tiêu chuẩn xác định của VBA. Không có tiền tố này thì có hai trường hợp xảy ra:
(i) hàm chưa chắc của VBA, mà có thể của đối tượng khác. Điển hình Evaluate là hàm của đối tượng bảng tính.
(ii) hàm rõ ràng là của VBA, nhưng chưa chắc theo
tiêu chuẩn mặc định của VBA. Xem lại câu 1 ở trên, đó là ý của từ
"hơi khác".
Điển hình (đây là câu trả lời trực tiếp ngay câu hỏi của bạn), hàm Array trả về mảng với LBound mặc định là 0.
NHƯNG, nếu ở đầu module có lệnh "Option Base 1" thì hàm này sẽ tuân thủ theo lệnh đó: LBound mặc định là 1. Lưu ý là Option không hẳn chỉ có một chỗ để tuyên bố là đầu module, trên thực tế bạn có cách tuyên bố cho cả project. Vì GPE chỉ viết code lẻ cho nên họ chỉ quen module mà ít kinh nghiệm về project.
Để tránh ba cái mớ ốp-sần lộn xộn, người lười viết như tôi sẽ dùng cách
ép hàm tuân thủ theo tiêu chuẩn đã xác định: gọi Array qua đối tượng VBA, tức là ghi rõ tiền tố "VBA.". Với thủ thuật này tôi an tâm coi như LBound của mảng là 0, không bao giờ sợ bất ngờ (do Option).
Lỡ code của tôi lụm đâu đó chạy theo kiểu mặc định LBound là 1 cho hàm Array thì tôi làm ngược lại, xóa các tiền tố "VBA.", và thêm Option Base 1 ở đầu.
Chú thích 1: người ta có thể nói tiền tố VBA làm cho hàm nhanh hay chậm hơn, tùy theo kiến thức cá nhân. Điều này đối với tôi không quan trọng. Nếu muốn nhanh thì tôi code C++. Đã code VBA thì tôi chỉ quan tâm mức độ đáng tin cậy của code.
Chú thích 2: Option là lệnh dẫn trình dịch chứ không phải code. Ở GPE này chỉ dùng Option Explicit cho nên người học quên bẵng là còn nhiều Options khác.
Chú thích 3
(quan trọng): tiền tố còn được dùng để gọi hàm/biến/hằng mà bên trong module đã bị phiên bản nội che mất.
Ví dụ Module 1 có hàm Public ChungChung(). Module 2 cũng có hàm này. Bên trong Module 2 mà gọi ChungChung thì đó là hàm của Module 2. Muốn gọi hàm kia thì dùng "Module1.ChungChung"
Tương tự, nếu bạn có đặt hàm nào đó trùng tên với hàm của VBA thì lúc gọi, bạn sẽ được hàm của mình. Muốn gọi hàm VBA thì thêm "VBA."