Collection

tuhocvba

Administrator
Thành viên BQT
1. Collection là gì?
Collection là Object (đối tượng).
Đây không phải là lần đầu trên diễn đàn nói tới Collection, thật vậy, hãy xem lại một bài viết .
Gần đây, liên quan tới Collection, chúng ta cũng đã có một chủ đề nói về .
Quay trở lại Collection, nó là nơi chứa Key và Item. Bạn có thể lưu trữ là ký tự hay là số đều được.
Tuy nhiên, Key thì phải có tính duy nhất, không được trùng lặp.
Như vậy bạn đã thấy nó giống với chưa nào.
Khác với Collection, Dictionary không thể cất giữ nhiều kiểu dữ liệu khác nhau. (Mình sẽ kiểm chứng sau, tạm thời dịch đúng nguyên văn).
Collection hoàn toàn có thể sử dụng thay thế cho Dictionary. Tuy nhiên nó có ít phương thức hơn, và tốc độ xử lý chậm hơn một chút so với Dictionary, vì vậy thông thường mọi người vẫn lựa chọn sử Dictionary.
2. Cách sử dụng Collection
2.1 Thuộc tính:

Count: Số Item mà Collection lưu trữ
2.2 Phương thức:
Add item, key, index1, index2: Thêm một hạng mục ứng với từ khóa key, số chỉ mục có thể chỉ định index1 hoặc index2.
Remove key|index : Xóa hạng mục có Key hoặc index tương ứng.
Item(key|index) : Thêm hạng mục có Key hoặc index tương ứng.
3. Cách khai báo:
Có thể khai báo theo các cách dưới đây:
Mã:
Dim Collection_Name As Collection
Set Collection_Name = New Collection
Hoặc cũng có thể khai báo theo cách dưới đây:
Mã:
Dim Collection_Name As New Collection
4. Khởi tạo và thêm bằng phương thức Add:
<Phần này sẽ trình bày sau>
Nguồn tham khảo:
 

Euler

Administrator
Thành viên BQT
4. Khởi tạo và thêm bằng phương thức Add:
Với Collection, ta sử dụng phương thức Add để thêm Item mới.
Đối số thứ nhất là hạng mục, đối số thứ hai là Key, đối số thứ ba và đối số thứ bốn ta chỉ định index.
Ta có thể giản lược đối số. Nào, hãy đi vào ví dụ cụ thể:
Mã:
Sub macro1()
    'Khai bao Collection
    Dim myCol As Collection
    Set myCol = New Collection
   
    'Them Item
    With myCol
        .Add "Taro", "Last Name" 'Giá trị Item là Taro, Key là Last Name
        .Add "Yamada", "First Name" 'Giá trị Item là Yamada, Key là First Name
        .Add "Tokyo", "Address" 'Giá trị Item là Tokyo, Key là Address
        .Add 20, "Age" 'Giá trị Item là 20, Key là Age
    End With
End Sub
Chú ý là Key ở sau, giá trị Item ở trước. Điều này ngược với Dictionary đấy nhé.
5. Ta có thể tìm số Item có trong Collection bằng Count:
Thuộc tính Count sẽ cho ta biết số lượng Item có trong Collection. Hãy chạy thử đoạn code sau:
Mã:
Sub macro2()
    'Khai báo Collection
    Dim myCol As Collection
    Set myCol = New Collection
    
    'Khởi tạo
    With myCol
        .Add "Taro", "Last Name"  'Giá trị Item là Taro, Key là Last Name
        .Add "Yamada", "First Name"  'Giá trị Item là Yamada, Key là First Name
        .Add "Tokyo", "Address" 'Giá trị Item là Tokyo, Key là Address
        .Add 20, "Age" 'Giá trị Item là 20, Key là Age
    End With
    
    'Số Item
    MsgBox "So luong Item: " & myCol.Count, vbInformation
End Sub
6. Tìm Item bằng Key:
Ta sẽ sử dụng phương thức Item để tìm kiếm. Hãy chạy thử đoạn code sau:
Mã:
Sub macro3()
    'Khai báo Collection
    Dim myCol As Collection
    Set myCol = New Collection
    
    'Khởi tạo
    With myCol
        .Add "Taro", "Last Name" 'Giá trị Item là Taro, Key là Last Name
        .Add "Yamada", "First Name" 'Giá trị Item là Yamada, Key là First Name
        .Add "Tokyo", "Address" 'Giá trị Item là Tokyo, Key là Address
        .Add 20, "Age" 'Giá trị Item là 20, Key là Age
    End With
    
    'Hiển thị kết quả
    MsgBox myCol.Item("First Name") & vbCrLf & _
            myCol("First Name") & vbCrLf & _
            myCol(2), vbInformation
End Sub
Các bạn sẽ thấy thông báo hiển thị là Yamada.
Ở trên tôi đã sử dụng 3 cách myCol.Item("First Name")myCol("First Name")myCol(2) chúng đều cho kết quả là Yamada.
Ở cách viết myCol("First Name"), tôi đã giản lược không ghi tên phương thức Item nhưng nó vẫn tìm ra Item tương ứng với Key = "First Name".
Còn với cách viết myCol(2), tôi sử dụng index = 2 để lấy Item ứng với chỉ mục index = 2.
 

vbano1

SMod
Thành viên BQT
7. Bằng For Each, chúng ta list các Item của Collection ra thành danh sách.
Từng phần tử Item mà ta duyệt bằng For Each, chúng sẽ có kiểu dữ liệu là Variant.
Mã:
Sub macro4()
    'Khai bao Collection
    Dim Var As Variant
    Dim myCol As Collection
    Set myCol = New Collection
 
    'Khoi tao Item
    With myCol
        .Add "Taro", "Last Name" 'key = Last Name, Item Value = Taro
        .Add "Yamada", "First Name" ' key = First Name, Item Value = Yamada
        .Add "Tokyo", "Address" 'key = Address, Item Value = Tokyo
        .Add 20, "Age"
    End With
 
    'List danh sach cac Item
    Dim str As String, i As Integer
    For Each Var In myCol
        i = i + 1
        str = str & i & " : " & Var & vbCrLf
    Next Var
 
    MsgBox str, vbInformation
End Sub
Bạn cần đăng nhập để thấy đính kèm


8. Phương pháp kiểm tra tính tồn tại của Item
Khác với SortedList là chúng có thể xác định Item tồn tại hay không bằng phương thức, nhưng Collection thì không có phương thức hỗ trợ kiểm tra tính tồn tại. Tuy nhiên, nếu muốn kiểm tra tính tồn tại, ta có thể xây dựng hàm riêng.
Bây giờ ta sẽ xây dựng hàm riêng để thực hiện điều đó.
Mã:
Sub macro6()
    'Khai bao Collection
    Dim myCol As Collection
    Set myCol = New Collection
 
    'Khoi tao Item
    With myCol
        .Add "Taro", "Last Name"
        .Add "Yamada", "First Name"
        .Add "Tokyo", "Address" 'Key = Address, Item = Tokyo
        .Add 20, "Age"
    End With
 
    'Kiem tra Item co ton tai hay khong
    MsgBox isExists(myCol, "Tokyo"), vbInformation
End Sub

Function isExists(col As Collection, item As Variant) As Boolean
    Dim Var  As Variant
    For Each Var In col
        If Var = item Then
            isExists = True
            Exit Function
        End If
    Next Var
 
    isExists = False
End Function
Kết quả:
Bạn cần đăng nhập để thấy đính kèm


9. Kiểm tra Key có tồn tại hay không.
Cả Dictionary và SortedList đều có thể kiểm tra Key tồn tại hay không bằng phương thức có sẵn. Nhưng với Collection thì ta phải xây dựng hàm riêng.
Mã:
Sub macro7()
    'Khai bao Collection
    Dim myCol As Collection
    Set myCol = New Collection
 
    'Khoi tao Item
    With myCol
        .Add "Taro", "Last Name"
        .Add "Yamada", "First Name"
        .Add "Tokyo", "Address" 'Key = Address, Item = Tokyo
        .Add 20, "Age"
    End With
 
    'Kiem tra Item co ton tai hay khong
    MsgBox ExistsCollection(myCol, "Address"), vbInformation
End Sub
Function ExistsCollection(ByRef c As Collection, ByRef key) As Boolean
    On Error Resume Next
    Call c.item(key)
    If Err.Number <> 0 Then
        ExistsCollection = False
    Else
        ExistsCollection = True
    End If
    On Error GoTo 0
End Function
Kết quả:
Bạn cần đăng nhập để thấy đính kèm


10. Xóa bỏ phần tử trong Collection bằng Remove:
Ta có thể chỉ định bằng Key hoặc Index để thực hiện Remove.
Mã:
Function ExistsCollection(ByRef c As Collection, ByRef key) As Boolean

    On Error Resume Next

    Call c.item(key)

    If Err.Number <> 0 Then

        ExistsCollection = False

    Else

        ExistsCollection = True

    End If

    On Error GoTo 0

End Function

Sub thvba_remove()
    Dim Var As Variant
    'khai bao Collection
    Dim myCol As Collection
    Set myCol = New Collection
    'Khoi tao gia tri
    With myCol
        .Add "Taro", "Last Name"
        .Add "Yamada", "First Name"
        .Add "Tokyo", "Address"
        .Add 20, "Age"
    End With
   
    'Xoa
    If ExistsCollection(myCol, "Address") Then 'Kiem tra Key co ton tai hay khong?
        myCol.Remove "Address"  'Thuc hie xoa phan tu co key = Address
    Else
        MsgBox "Khong the xoa duoc vi khong ton tai", vbInformation
    End If
   
    'Hien thi danh sach
    Dim str As String, i As Integer
    For Each Var In myCol
        i = i + 1
        str = str & i & " : " & Var & vbCrLf
    Next Var
   
    MsgBox str, vbInformation
End Sub
Kết quả chạy thủ tục thvba_remove là:
Bạn cần đăng nhập để thấy đính kèm


Key "Address" đã bị xóa bỏ. Chú ý trong code trên, trước khi xóa bỏ ta cần kiểm tra đối tượng cần xóa bỏ có thực sự tồn tại hay không.

Như vậy trên đây diễn đàn đã giới thiệu xong về Collection, chúng tôi mong rằng các bạn có thể sử dụng nó trong các chương trình của mình. Chúc các bạn thành công.
 
Top