Truy xuất phần tử thứ n cũa 1 mãng

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Các cao thủ cho hỏi: Trong VBA ta dùng code gì đễ truy xuất phần tử thứ n cũa 1 mãng cho trước?
ANH TUẤN
 
Oh... thế thì Array ko thể gọi là mãng sao nhỉ?
Vậy sao người ta vẫn gọi là công thức mãng trong những trường hợp này..
Chính xác Array là cái gì.. ??? và mãng là cái gì nhỉ? Và nếu chúng khác nhau thì tiếng Anh gọi mãng tên là gì?
Trước giờ tôi vẫn thường xem 2 thứ ấy là một...
Hic...
ANH TUẤN
 
Upvote 0
Thì TuanVNUNI đã giải thích rồi:
Khi nhấn CTRL+SH+ENTER thì chỉ Excel đã định dạng lại theo kiểu mảng để xử lý. Điều này chỉ thực hiện trong logic xử lý của phần mềm Excel mà thôi. Bản chất ARR không phải là mảng nên không thể truy cập vào từng phần tử được!
Như vậy:
Chính xác Array là cái gì.. ??? và mãng là cái gì nhỉ? Và nếu chúng khác nhau thì tiếng Anh gọi mãng tên là gì?
Array là mảng, còn cái mà mình nghĩ là mảng mình gọi là mảng, là Array, thì có trường hợp là không phải, chỉ là Excel xử lý như mảng do nhấn Ctrl - Shift - Enter

Cũng như:
A1 = 3
A2 = Left("04VND";2)
A3 = A1 + A2 = 7
Nhưng A2 bản chất vẫn không phải là number

Hoặc 02/02/2008 lấy từ DatePicker ra, là ngày, canh phải canh trái cũng là ngày, sum không được vẫn được Excel coi là ngày, vì dùng hàm ngày tháng với nó được.
 
Lần chỉnh sửa cuối:
Upvote 0
Ý tôi muốn hiểu thật sự bản chất Array... nếu các bạn nói cái công thức cũa tôi ko phải là Array thì tại sao nó lại là một tập hợp nhiều phần tử? Rõ ràng khi tôi bôi đen chử ARR trong công thức và bấm F9 thì thấy bên trong có 5 phần tử cơ mà
Nói chung tên gọi ko quan trọng, nhưng hiểu đúng vẫn quan trọng hơn... Vậy cái name mà tôi đặt trong file sẽ dc gọi tên chính xác tiếng Anh là thứ gì đây?
Còn các cao thủ khác có kiến thức sâu hơn xin giãi thích thêm giúp mọi người với
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
ptm0412 đã viết:
Hoặc 02/02/2008 lấy từ DatePicker ra, là ngày, canh phải canh trái cũng là ngày, sum không được vẫn được Excel coi là ngày, vì dùng hàm ngày tháng với nó được.
Vụ này em ko đồng ý với đại ca à nha! Em nghĩ chẳng chẳng qua Excel cố gắng chuyễn nó thành cái có thể tính dc thôi... Thực chất đánh chết em cũng hề tin nó là DATE... he...he...
Ái cha cha.... vụ này xem chừng càng lúc càng chuyên sâu... Hy vọng qua các bài viết cũa các cao thủ mình có thể thu thập dc chút kiến thức
Xin cãm ơn!
ANH TUẤN
 
Upvote 0
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.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom