Mảng trong Worksheet và trong VBA
Em xin giải thích thêm
Kiểu giá trị mà một biến hay một hàm nhận và trả về gồm có: Integer, Double, Date, Long, Array, Variant, Object, Range,....
Dim Mang(10) As Long 'Là một mảng (kiểu Array)
Dim MyObj As Range
Set MyObj = Mang -->Sai kiểu giá trị !
Array <> Range
Em có mộ ví dụ thế này
Tạo một Name có tên
ARGs chứa mảng các giá trị
={1.2 ; 2.1 ; 3.3 ; 4.2 ; 5.4}
Như vậy ARGs trả về giá trị có kiểu mảng (Array)
Để truy cập vào từng phần tử của mảng trong Name
ARGs áp dụng cách của thủ tục
GetElements
Ví dụ tiếp theo
Hàm INT(Number) lấy phần nguyên của số Number. Giá trị trả về có kiểu số (Number)
Ví dụ =INT(1.2) kết quả là 1
Bây giờ em tạo tiếp một Name có tên
ARRI chứa công thức
=INT(ARGs)
ARGs là một mảng (Array) chứ không phải là một số (Number)
Nếu gõ công thức =INT(ARGs) kết quả bằng 1, hàm Excel sẽ lấy phần tử đầu tiên của mảng ARGs
(*) Khi biểu thức =INT(ARGs) tham gia vào biểu thức hay đặt trong một Name thì
Excel tự hiểu nó có ý nghĩa nếu là một biểu thức mảng (Number->Array). Chính vì vậy khi tạo Name ARRI chứa biểu thức =INT(ARGs) thì Excel tự hiểu ARRI là một mảng.
Nếu anh gõ công thức trên ô, bôi đen vung gồm 5 dòng rồi gõ =INT(ARGs) hoặc =ARRI kết thúc nhấn CTRL+SHIFT+ENTER Excel sẽ trả về một mảng giá trị
1
2
3
4
5
Em có thể dùng hàm INDEX để lấy phần tử trong mảng. Ví dụ lấy phần tử thứ 2 trong mảng ARRI
=INDEX(ARRI,2) hoặc =INDEX(
INT(ARGs),2)
Hai công thức trên kết quả là như nhau đều bằng 2
Excel hiểu INT(ARGs) là một mảng vì
(*)
Excel là một ứng dụng.
VBA là môi trường lập trình, nó tuân thủ những nguyên tắc riêng của nó (của ngôn ngữ Visual Basic).
Trong VBA, để truy cập vào phần tử mảng trong một Name trong Excel bắt buộc phải dùng hàm
Evaluate!
Ví dụ:
Dim Args As Variant
Args = Evaluate("ARGs") 'Trả về mảng trong Name "ARGs". Args có kiểu là mảng.
Không thể dùng
Args = Range("ARGs") vì "ARGs" không phải là địa chỉ tham chiếu
Nếu Args = Evaluate("ARRI") thì Args sẽ có kiểu là số vì công thức bên trong Name ARRI là =INT(ARGs) kết quả trả về giá trị là 1, kiểu giá trị là Number chứ không phải là Array. Vì đây làmôi trường phát triển VBA chứ khôngphải môi trường ứng dụng Excel nên
không có khái niêm
(*)
Khi
Args đã là một mảng thì ta có thể dùng các kỹ thuật nhận và gán giá trị cho các phần tử theo phương pháp thông thường.
Theo những giải thích trên anh có thể biết tại sao Name
ARR chứa công thức
=LARGE((WEEKDAY(NGAY)=1)*(ROW(Sheet1!7:37)),6-{1;2;3;4;5}) là mảng(Array) trong Excel chứ không phải là mảng trong VBA. Và tại sao dùng hàm INDEX thì được.
ptm0412 đã viết:
Dim Args
Nhờ TuanVNUNI giải thích hộ.
Khai báo trên tương đương với
Dim Args As Variant
Biến có kiểu Variant có thể nhận tất cả các loại giá trị: Integer, Double, Date, Long, Array, Object, Range,....
Em gửi kèm file các bác xem thêm.