Hoàng Nhật Phương
Thành viên gắn bó
- Tham gia
- 5/11/15
- Bài viết
- 1,894
- Được thích
- 1,214
Xin chào các Bạn,
Đầu xuân chúc mọi người luôn mạnh khỏe & bình an.
----
Như tiêu đề OT đã nêu, OT có đọc bài viết của Bạn Collection @befaint nhưng có lẽ do kiến thức còn hạn hẹp nên chưa thể hiểu hết về sự khác biệt giữa Dictionary & Collection,
Ví dụ trong 2 đoạn code dưới đây sử dụng Dictionary & Collection cho cùng một công việc:
Trên máy tính của OT có vẻ như Collection nhanh hơn Dictionary :
Nhờ các bạn chỉ dẫn cho OT hiểu rõ thêm trong trường hợp nào thì dùng cái nào sẽ tối ưu hơn?
Tại sao Collection nhanh hơn Dictionary mà không thấy mọi người sử dụng Collection mà thường sử dụng Dictionary hơn hay do thói quen ạ?
Đầu xuân chúc mọi người luôn mạnh khỏe & bình an.
----
Như tiêu đề OT đã nêu, OT có đọc bài viết của Bạn Collection @befaint nhưng có lẽ do kiến thức còn hạn hẹp nên chưa thể hiểu hết về sự khác biệt giữa Dictionary & Collection,
Ví dụ trong 2 đoạn code dưới đây sử dụng Dictionary & Collection cho cùng một công việc:
Bài 13. Collection
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...
www.giaiphapexcel.com
Mã:
Option Explicit
Sub CollectionFilter()
Dim TT As Double
TT = Timer
Dim myCol As Collection
Set myCol = New Collection
Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long
With Sheet1
lRow = .Range("B" & Rows.Count).End(xlUp).Row
ArrData = .Range("B2:D" & lRow).Value2
lRow = UBound(ArrData, 1)
ReDim Result(1 To lRow, 1 To 4)
For i = 1 To lRow
sKey = ArrData(i, 1)
If sKey <> "" Then
If KeyExists(myCol, sKey) = False Then
j = j + 1
myCol.Add j, sKey
Result(j, 1) = j
Result(j, 2) = sKey
Result(j, 3) = ArrData(i, 2)
Result(j, 4) = ArrData(i, 3)
Else
Result(myCol.Item(sKey), 4) = Result(myCol.Item(sKey), 4) + ArrData(i, 3)
End If
End If
Next i
If j > 0 Then
.Range("M2").Resize(100, 4).ClearContents
.Range("M2").Resize(j, 4) = Result
.Range("Q7") = Timer - TT
End If
End With
End Sub
Sub DictionaryFilter()
Dim TT As Double
TT = Timer
Dim Dic As Object
Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
lRow = .Range("B" & Rows.Count).End(xlUp).Row
ArrData = .Range("B2:D" & lRow).Value2
lRow = UBound(ArrData, 1)
ReDim Result(1 To lRow, 1 To 4)
For i = 1 To lRow
sKey = ArrData(i, 1)
If sKey <> "" Then
If Not Dic.Exists(sKey) Then
j = j + 1
Dic.Add sKey, j
Result(j, 1) = j
Result(j, 2) = sKey
Result(j, 3) = ArrData(i, 2)
Result(j, 4) = ArrData(i, 3)
Else
Result(Dic.Item(sKey), 4) = Result(Dic.Item(sKey), 4) + ArrData(i, 3)
End If
End If
Next i
If j > 0 Then
.Range("H2").Resize(100, 4).ClearContents
.Range("H2").Resize(j, 4) = Result
.Range("L7") = Timer - TT
End If
End With
End Sub
Nhờ các bạn chỉ dẫn cho OT hiểu rõ thêm trong trường hợp nào thì dùng cái nào sẽ tối ưu hơn?
Tại sao Collection nhanh hơn Dictionary mà không thấy mọi người sử dụng Collection mà thường sử dụng Dictionary hơn hay do thói quen ạ?
File đính kèm
Lần chỉnh sửa cuối: