befaint
|||||||||||||
- Tham gia
- 6/1/11
- Bài viết
- 14,516
- Được thích
- 19,702
Bài 13. Collection
(Danh sách các bài viết về VBA xem ở đây Index - Các bài viết về VBA)
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
2. Các phương thức (có 4 phương thức)
2.1. Add
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ụ:
2.2. Count
Trả về số Items có trong collection.
Ví dụ:
2.3. Item
Gọi tới Item của collection theo chỉ số của Item hoặc theo Key ứng với Item đó.
Ví dụ:
2.4. Remove
Xóa một Item trong collection theo chỉ số của Item hoặc Key ứng với Item đó.
Ví dụ:
3. Ứng dụng
- Lọc loại trùng
- Sắp xếp dữ liệu
3.1. Hàm kiểm tra sự tồn tại của một Key trong collection
3.2. Hàm lọc loại trùng trong một cột
3.3. Sắp xếp A-Z
3.4. Truyền các Items trong collection vào mảng 2 chiều
Ví dụ: Áp dụng sort A-Z
------------------------
Nguồn tham khảo:
http://analystcave.com/vba-collection/
(Danh sách các bài viết về VBA xem ở đây Index - Các bài viết về VBA)
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
PHP:
Dim myCol As Collection
Set myCol = New Collection
2. Các phương thức (có 4 phương thức)
2.1. Add
PHP:
myCol.Add (Item, [Key], [Before], [After])
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ụ:
PHP:
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
PHP:
myCol.Count
Ví dụ:
PHP:
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
PHP:
myCol.Item (Index)
'Hoặc:'
myCol(Index)
'Hoặc:'
myCol(Key)
Ví dụ:
PHP:
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
PHP:
mycol.Remove(Index)
'Hoặc:'
mycol.Remove(Key)
Ví dụ:
PHP:
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
3.1. Hàm kiểm tra sự tồn tại của một Key trong collection
PHP:
'// 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
3.2. Hàm lọc loại trùng trong một cột
PHP:
'// 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
PHP:
'// 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
3.4. Truyền các Items trong collection vào mảng 2 chiều
PHP:
'// 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
Ví dụ: Áp dụng sort A-Z
PHP:
'// Vi du SortingCollection:'
Sub Vidu_Sort()
Dim myCol As Collection, i As Long, arr()
Set myCol = New Collection
arr = Sheet1.Range("R2:R7").Value
For i = 1 To UBound(arr, 1)
myCol.Add arr(i, 1)
Next i
'Sort Collection'
SortingCollection myCol, 1, myCol.Count
'Truyen cac items cua collection vao array va gan xuong bang tinh'
Sheet1.Range("S2").Resize(UBound(arr, 1), 1) = CollectionToArray(myCol)
End Sub
------------------------
Nguồn tham khảo:
http://analystcave.com/vba-collection/
File đính kèm
Lần chỉnh sửa cuối: