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
 
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
Web KT

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

Back
Top Bottom