Truy xuất phần tử thứ n cũa 1 mãng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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
 
anhtuan1066 đã viết:
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
VD ta có mảng n cột, m hàng với hàng đầu tiên có số thứ tự là 0 Mang(m,n)

phần tử thứ i tại cột x là : Mang(i-1,x)

Thân!
 
Upvote 0
Mr Okebab đã viết:
VD ta có mảng n cột, m hàng với hàng đầu tiên có số thứ tự là 0 Mang(m,n) phần tử thứ i tại cột x là : Mang(i-1,x) Thân!
Đúng là cao thủ nói cao thủ hiểu. Hay quá nhưng chẳng hiểu gì cả. Trình độ mình còn non kém. Mong bác tuấn hay bác Okebab giải thích rõ và cho một VD đi . Thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Bắp cho hỏi thêm: Nếu tôi có 1 name mà giá trị cũa nó là 1 mãng.. Ví dụ name ARR = {9,10,11,12,13,14,15} (mãng ngang)
Vậy nếu tôi muốn truy xuất phần tử thứ 5 cũa mãng này thì cú pháp nó như thế nào?
(Đây là 1 mãng ảo, dc tạo ra nhờ công thức chứ nó ko nhìn thấy dc trong Worksheet)
 
Upvote 0
Làm gì có mảng ngang hay dọc nhỉ, chỉ có mảng 1 chiều hoặc n chiều thôi. Em không hiểu lắm câu hỏi của bác, nhưng em nghĩ nếu muốn truy xuất phần tử của mảng thì cứ chỉ ra số thứ tự của nó là được, trong trường hợp trên là 4 nếu để mặc định. Vì mảng trong VBA có số thứ tự bắt đầu là 0.
 
Upvote 0
He... he... Tôi ko biết trong VBA có khái niệm mãng ngang dọc hay ko chứ còn công thức thì có đấy đồng chí à... Nếu đồng chí ko nắm chắc nó là ngang hay dọc mà cứ nhắm mắt làm bừa thì sẽ bị sa bẩy ngay tức khắc...
Còn vấn đề tôi hỏi ở trên thì e rằng ko dễ ăn đâu nha... nhất là khi mãng ấy dc tạo bởi 1 name động
Xin các cao thủ trợ giúp dùm tôi trong trường hợp truy xuất mãng là các phần tử trong 1 name thì cứ pháp sẽ như thế nào (tôi đã thử, toàn bị lỗi)
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Bắp cho hỏi thêm: Nếu tôi có 1 name mà giá trị cũa nó là 1 mãng.. Ví dụ name ARR = {9,10,11,12,13,14,15} (mãng ngang)
Vậy nếu tôi muốn truy xuất phần tử thứ 5 cũa mãng này thì cú pháp nó như thế nào?
(Đây là 1 mãng ảo, dc tạo ra nhờ công thức chứ nó ko nhìn thấy dc trong Worksheet)

Dễ quá mà anh:
=INDEX(ARR,1,5) --=0
 
Upvote 0
Trời đất ơi... ý là trong VBA kìa... Trong VBA sẽ dùng cú pháp gì... Cứ cho là tôi dùng hàm INDEX luôn thì trong VBA chắc chắn sẽ bị lỗi ngay... Vì name này ko phải là 1 range
ANH TUẤN
 
Upvote 0
To: anhtuan1066,
Anh nên đọc bài về mãng trong CLB VEC.

Lê Văn Duyệt
 
Upvote 0
levanduyet đã viết:
To: anhtuan1066,
Anh nên đọc bài về mãng trong CLB VEC.
Nó nằm chổ nào đại ca ơi... tìm cực quá mà hỏng có thấy... Tốt nhất là cho luôn cái cú pháp cũa nó, đở mất công tìm...
Nói thật tôi cũng đã tìm nát trên Google rồi, truy xuất phần tử thứ n trong mãng người ta có nói khá nhiều nhưng tôi chưa tìm dc cái tôi cần.. là tìm phần tử thứ n trong 1 name... dùng công thức thì có hàng đóng, nào là VLOOKUP, INDEX, CHOOSE.. vân vân và vân vân.. vậy mà lại ko biết viết cú pháp trong VBA như thế nào... Bí quá dùng luôn Application.WorksheetFunction... cũng ko dc... Đơn giãn là vì name này ko phải là 1 name thông thường...
Chẳng biết nói sao cho các bạn hiểu nữa... Hay tôi cho các bạn 1 ví dụ nhé... Hãy xem file, trong này tôi truy xuất phần tử cũa mãng ARR bằng công thức... các bạn hãy chỉ cho tôi biết nếu dùng code thì làm như thế nào?
ANH TUẤN
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
ANH TUẤN xem cái này có giúp gì được không, nha.

Các bạn hãy chỉ cho tôi biết nếu dùng code thì làm như thế nào?
PHP:
Option Explicit
Sub MangName()
 Dim Rng As Range
 
 Set Rng = Range("Ten")
 MsgBox Rng.Cells(3, 1)
 
End Sub
 
Upvote 0
Ko dc anh SA ơi... như đã nói, cái name ARR cũa em nó ko phải là 1 Range
Trong file có 2 name: NGAY và ARR, nếu truy xuất NGAY thì ko có vấn đề, còn ARR thì.. thua... (vì NGAY đúng là Range)
Anh xem kỹ file em và giúp với... chủ yếu em muốn truy thằng ARR ấy
ANH TUẤN
 
Upvote 0
Anh vui lòng tham khảo file ở đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=4802&page=2

Thật sự ra theo em học VBA, không thể nào giống kiểu cứ hỏi A, trả lời A, hỏi B, trả lời B. Nhưng người học ráng cố gắng tự học và đọc tài liệu.
Đó là ý kiến theo kinh nghiệm của em.

Lê Văn Duyệt
 
Upvote 0
Cám ơn file cũa Duyệt.. xem như tôi cũng học thêm dc 1 chút...
Nhưng mà.. với cái mãng ARR mà tôi đã đặt trong Define name thì các cách mà cao thủ hướng dẫn vẩn chưa thành công...
Như tôi đã nói, cái mãng này nó tương đối đặt biệt, gần như ko tham chiếu đến bất cứ cell nào cã, vì thế nó ko phải là 1 range... áp dụng vào sẽ lập tức báo lỗi... Mãng ARR mà tôi dùng trong file ấy có 5 phần tử, giá trị luôn luôn biến động do quá trình tính toán cũa các công thức...
Nghi cũng lạ, nếu tôi show mãng ấy ra 5 cell trên bãng tính rồi dùng cú pháp truy xuất mãng lại ko có vấn đề... Vụ này có lần đã bàn trên diển đàn rồi, có khi giá trị của name đưa vào code nó lại chẳng hiễu... thế mới chết!
ANH TUẤN
 
Upvote 0
To: anhtuan1066,
Xin lỗi, em không trả lời. :)
Em biết rằng anh sẽ tìm ra câu trả lời trong nay mai. Lúc đó nhớ báo em nha !

Lê Văn Duyệt
 
Upvote 0
anhtuan1066 đã viết:
Cám ơn file cũa Duyệt.. xem như tôi cũng học thêm dc 1 chút...
Nhưng mà.. với cái mãng ARR mà tôi đã đặt trong Define name thì các cách mà cao thủ hướng dẫn vẩn chưa thành công...
Như tôi đã nói, cái mãng này nó tương đối đặt biệt, gần như ko tham chiếu đến bất cứ cell nào cã, vì thế nó ko phải là 1 range... áp dụng vào sẽ lập tức báo lỗi... Mãng ARR mà tôi dùng trong file ấy có 5 phần tử, giá trị luôn luôn biến động do quá trình tính toán cũa các công thức...
Nghi cũng lạ, nếu tôi show mãng ấy ra 5 cell trên bãng tính rồi dùng cú pháp truy xuất mãng lại ko có vấn đề... Vụ này có lần đã bàn trên diển đàn rồi, có khi giá trị của name đưa vào code nó lại chẳng hiễu... thế mới chết!
ANH TUẤN

Em cũng không hiểu hết TH này, tuy nhiên theo em nghĩ ARR không phải là một mảng vì nó không có số cột, không có số hàng (thử trong VBA sẽ thấy)
Nhưng nó là cái gì thì em không định nghĩa được (là một miền chăng?)

Vì vậy không thể truy xuất phần tử thứ bao nhiêu được.

Không biết ai có cao kiến gì không.

Thân!
 
Upvote 0
Tôi nghĩ như thế này:
Refers to của Name "ARR" là:
=LARGE((WEEKDAY(NGAY)=1)*(ROW(Sheet1!6:36)),6-{1;2;3;4;5})
Rõ ràng với công thức trên thì ARR không thể là 1 Range được (vì hàm Large trả về số lớn thứ k trong mảng).
Sử dụng công thức trên thì ARR sẽ nhận là giá trị (Number), vì khi đánh Công thức:
= TYPE(ARR) sẽ cho giá trị là 1 (tức ARR là Number).
Do vậy trong VBA nếu sử dụng Range("ARR") sẽ báo lỗi.
 
Upvote 0
Nhưng rõ ràng nó là 1 mãng... Cụ thể hãy quét chọn 5 cell dọc và gõ vào công thức này rồi Ctrl + Shift + Enter sẽ có kết quã... Một minh chứng nữa là có thể dùng INDEX đễ truy xuất ARR
Vậy các cao thủ có ý kiến gì trong trường hợp này ko?
ANH TUẤN

Các cao thủ cho tôi hỏi thêm 1 chút:
Về việc dò tìm 1 phần tử nào đó trong mãng thì các hàm Excel có rất nhiều, như: VLOOKUP, INDEX.. vân vân... Vậy cho hỏi trong VBA có hàm hay code nào gần tương tự như VLOOKUP hay INDEX ko?
ANH TUẤN
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Khi đặt tên ARR=LARGE((WEEKDAY(NGAY)=1)*(ROW(Sheet1!6:36)),6-{1;2;3;4;5})
thì Excel coi ARR trả về là một giá trị đơn chức không phải mảng.

Ctrl + Shift + Enter sẽ có kết quã... Một minh chứng nữa là có thể dùng INDEX đễ truy xuất ARR
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!

Nếu tạo Name ARGs như thế này:
ARGs = {1;2;3;4;5}
Như trên thì ARGs trả về là một mảng.

Một điều quan trọng là Array <> Range. Vì vậy, trong VBA không thể dùng RANGE("ARGs") được!

Vậy để truy cập vào các phần tử trong Name ARGs có kiểu mảng làm như sau:

Mã:
Sub GetElements()
    Dim index, lb, ub
    Dim Args
    
    Args = Evaluate("ARGs") 'Gan gia tri vao bien mang
    
    If Not VarType(Args) = (vbArray Or vbVariant) Then
        MsgBox "Kong phai la Array"
        Exit Sub
    End If
    
    lb = LBound(Args, 1)
    ub = UBound(Args, 1)
    
    Debug.Print "Type=" & VarType(Args), lb, ub
    'Excel coi Args la mang 2 chieu
    For index = lb To ub
        MsgBox Args(index, 1), , index
    Next index

End Sub
 
Upvote 0
Như vậy trong file của anhtuan, ARR không phải là Array.
Muốn truy xuất giá trị thứ n, anhtuan phải đặt name mới: ARR1 = F2:F6 (là 1 range)
rồi gán giá trị cho biến mảng ARR1
ARR1 = Evaluate ("ARR1")
Nhưng mình chưa hiểu tại sao khai báo biến đơn:
Nhờ TuanVNUNI giải thích hộ.
 
Lần chỉnh sửa cuối:
Upvote 0
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

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

Back
Top Bottom