所以,我一直在研究记录集this month on my blog,所以我可以告诉您,您的用例适合使用 ADO 记录集。
在下面的代码中,您可以看到我们有一个主集,然后我们可以过滤到一个子集。同样在代码中,我们对显示排序顺序的变量数组进行快照。然后我们在另一个字段上对主集进行排序,这改变了子集的排序,并且可以在第二个快照中看到。
Option Explicit
'* Tools->References
'ADODB Microsoft ActiveX Data Objects 6.1 Library C:\Program Files (x86)\Common Files\System\ado\msado15.dll
Sub Test()
Dim rstADO As ADODB.Recordset
Dim fld As ADODB.Field
Set rstADO = New ADODB.Recordset
With rstADO
.Fields.Append "Animal", adVarChar, 20
.Fields.Append "BirthDay", adDate, FieldAttributeEnum.adFldKeyColumn
.Fields.Append "ArrivalSequence", adInteger
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.LockType = adLockPessimistic
.Open
.AddNew Array("Animal", "BirthDay", "ArrivalSequence"), Array("Cow", Now() - 200, 1)
.AddNew Array("Animal", "BirthDay", "ArrivalSequence"), Array("Horse", Now() - 100, 2)
.AddNew Array("Animal", "BirthDay", "ArrivalSequence"), Array("Pig", Now() - 150, 3)
.AddNew Array("Animal", "BirthDay", "ArrivalSequence"), Array("Chicken", Now() - 120, 4)
.AddNew Array("Animal", "BirthDay", "ArrivalSequence"), Array("Goat", Now() - 180, 5)
.AddNew Array("Animal", "BirthDay", "ArrivalSequence"), Array("Dog", Now() - 140, 5)
.Filter = "Animal='Cow' or Animal='Dog' or Animal='Pig' or Animal='Horse'"
Dim vSnap As Variant
.MoveFirst
vSnap = .GetRows
Debug.Assert vSnap(0, 0) = "Cow"
Debug.Assert vSnap(0, 1) = "Horse"
Debug.Assert vSnap(0, 2) = "Pig"
Debug.Assert vSnap(0, 3) = "Dog"
'*
'* Now sort according to birthday
'*
.Sort = "BirthDay"
Dim vSnap2 As Variant
.MoveFirst
vSnap2 = .GetRows
Debug.Assert vSnap2(0, 0) = "Cow"
Debug.Assert vSnap2(0, 1) = "Pig"
Debug.Assert vSnap2(0, 2) = "Dog"
Debug.Assert vSnap2(0, 3) = "Horse"
End With
End Sub
Excel Development Platform: VBA - Fabricate an ADO Recordset for Sorting and Filtering