Home » VBA Excel » VBA Excel Collection trong Excel VBA

VBA Excel Collection trong Excel VBA

viết bởi Lê Quốc Thái
  1. Loạt các bài viết có liên quan chuyên đề VBA:
  2. VBA Excel Hộp thoại thông báo
  3. VBA Excel Biến trong VBA Excel
  4. VBA Excel sử dụng Scripting Dictionary
  5. VBA Excel Biến trong VBA Excel
  6. VBA Excel Workbook, worksheet
  7. VBA Excel Range, Cells
  8. VBA Excel Hàm trong Excel VBA
  9. VBA Excel Events, Application Object
  10. VBA Excel Function and Sub Excel VBA
  11. VBA Excel Array Mảng trong Excel VBA
  12. VBA Excel FileSystemObject trong Excel VBA
  13. VBA Excel Collection trong Excel VBA
  14. VBA Excel Hashtable trong Excel VBA
  15. VBA Excel Stack trong Excel VBA
  16. VBA Excel Queue trong Excel VBA
  17. VBA Excel SortedList Excel VBA
  18. VBA Excel ArrayList Excel VBA
  19. VBA Excel Ví dụ về Scripting Dictionary
  20. Sách VBA Excel 2016 power programming with vba (pdf)

Collection trong VBA là một cấu trúc dữ liệu đơn giản có sẵn trong VBA để lưu trữ các đối tượng. Các collections trong VBA linh hoạt hơn so với Array trong VBA vì chúng không giới hạn ở kích cỡ của chúng vào bất kỳ thời điểm nào và không yêu cầu phải dò lại kích thước bằng tay. 
Collection rất hữu dụng khi ta không muốn sử dụng các cấu trúc dữ liệu phức tạp hơn (nhưng khá tương tự) như ArrayList hay Dictionary.

1. Khai báo Collection

Dim myCol As Collection
Set myCol = New Collection

2. Các phương thức (có 4 phương thức)

2.1. Add

myCol.Add (Item, [Key], [Before], [After])

Thêm một Item vào collection.
Item: Bắt buộc. Item nhận kiểu dữ liệu là số hoặc chuỗi bất kỳ, giá trị đơn hoặc một mảng (array).
Key: Không bắt buộc. Nếu có nhập Key thì yêu cầu Key đó chưa tồn tại trong collection, Key chỉ nhận giá trị kiểu chuỗi.
Before: Không bắt buộc. Chỉ định vị trí của Item thêm vào trước một Item đã có trong collection (theo chỉ số của Item đó).
After: Không bắt buộc. Chỉ định vị trí của Item thêm vào đứng sau một Item đã có trong collection (theo chỉ số của Item đó).
Ví dụ:

Sub AddMethod()
    Dim myCol As Collection
    Set myCol = New Collection
    'mycol.Add (Item, [Key], [Before], [After]) '
    myCol.Add 2                 'Item: 2    '
    myCol.Add "B"               'Item: 2, "B"   '
    myCol.Add "C", key:="KeyC"  'Items: 2, "B", "C" '
    myCol.Add "A", "KeyA", before:=2    'Items: 2, "A","B","C"  '
    myCol.Add 1, , After:=4             'Items: 2, "A","B","C",1    '
    myCol.Add Array(5, 20)              'Items: 2, "A","B","C",1, array(5,20)'
End Sub

2.2. Count

myCol.Count

Trả về số Items có trong collection.
Ví dụ:

Sub CountMethod()
    Dim myCol As Collection, i As Long
    Set myCol = New Collection
    For i = 1 To 10
        myCol.Add i
    Next i
    MsgBox myCol.Count
End Sub

2.3. Item

myCol.Item (Index)
'Hoặc:
myCol(Index)
'Hoặc:
myCol(Key)

Gọi tới Item của collection theo chỉ số của Item hoặc theo Key ứng với Item đó.
Ví dụ:

Sub ItemMethod()
    Dim myCol As Collection
    Set myCol = New Collection
    myCol.Add "A", "KeyA"
    MsgBox myCol.Item(1)
    MsgBox myCol(1)
    MsgBox myCol("KeyA")
End Sub

2.4. Remove

mycol.Remove(Index)
'Hoặc
mycol.Remove(Key)

Xóa một Item trong collection theo chỉ số của Item hoặc Key ứng với Item đó.
Ví dụ:

Sub Remove()
    Dim myCol As Collection
    Set myCol = New Collection
    myCol.Add "A", "KeyA"
    myCol.Add 10, "2"
    myCol.Add 20, "Key3"
    myCol.Remove (2)
    myCol.Remove ("Key3")
    MsgBox myCol.Count
End Sub

3. Ứng dụng

– Lọc loại trùng
– Sắp xếp dữ liệu

'// Kiem tra su ton tai cua mot key trong Collection'
Public Function KeyExists(myCol As Collection, ByVal keyCheck As String) As Boolean
    KeyExists = False
    On Error GoTo EndFunction
    myCol.Item keyCheck
    KeyExists = True
EndFunction:
End Function

'// Loc loai trung mot cot'
Public Function UniqueColumnCollection(ByVal Rng As Range) As Variant
    If Rng.Count = 1 Then UniqueColumnCollection = Rng.Value: Exit Function
    Dim myCol As Collection, i As Long, j As Long, arr(), Result(), sKey As Variant
    Set myCol = New Collection
    arr = Rng.Value
    For i = LBound(arr, 1) To UBound(arr, 1)
        sKey = arr(i, 1)
        If sKey <> "" Then
            If KeyExists(myCol, sKey) = False Then
                myCol.Add "", sKey
                j = j + 1
                ReDim Preserve Result(1 To j)
                Result(j) = sKey
            End If
        End If
    Next i
    UniqueColumnCollection = Result
End Function

'// Sort A-Z cac Item trong Collection'
Public Sub SortingCollection(myCol As Collection, firstIndex As Long, lastIndex As Long)
  Dim valCentre As Variant, vTemp As Variant
  Dim valMin As Long
  Dim valMax As Long
  valMin = firstIndex
  valMax = lastIndex
  valCentre = myCol((firstIndex + lastIndex) \ 2)
  Do While valMin <= valMax
    Do While myCol(valMin) < valCentre And valMin < lastIndex
      valMin = valMin + 1
    Loop
    Do While valCentre < myCol(valMax) And valMax > firstIndex
      valMax = valMax - 1
    Loop
    If valMin <= valMax Then
      ' Swap values
      vTemp = myCol(valMin)
      myCol.Add myCol(valMax), After:=valMin
      myCol.Remove valMin
      myCol.Add vTemp, before:=valMax
      myCol.Remove valMax + 1
      ' Move to next positions
      valMin = valMin + 1
      valMax = valMax - 1
    End If
  Loop
  If firstIndex < valMax Then SortingCollection myCol, firstIndex, valMax
  If valMin < lastIndex Then SortingCollection myCol, valMin, lastIndex
End Sub

'// Truyen cac Items cua Collection vao Array (2 chieu)
Public Function CollectionToArray(myCol As Collection) As Variant
    Dim arr() As Variant, i As Long
    ReDim arr(1 To myCol.Count, 1 To 1)
    For i = 1 To myCol.Count
        arr(i, 1) = myCol.Item(i)
    Next i
    CollectionToArray = arr
End Function

Tải file ví dụ: Collection

Bài viết liên quan

Viết ý kiến của bạn