I have created a sort function to allow a collection of instances of a custom object to be sorted based on one of the objects properties. Is it possible to extend the existing collections class in VBA? I do not believe inheritance is supported in VBA, so I am not sure how to go about this in the proper way. I could just create a new module and place the function in that module, but that doesn't seem like the best way of doing it.
Thanks for the responses. I ended up creating my own class which extends the Collections class in VBA. Below is the code if anyone is interested.
'Custom collections class is based on the Collections class, this class extendes that
'functionallity so that the sort method for a collection of objects is part of
'the class.
'One note on this class is that in order to make this work in VBA, the Attribute method has to be added
'manually.  To do this, create the class, then export it out of the project.  Open in a text editor and
'add this line Attribute Item.VB_UserMemId = 0 under the Item() function and this line
'Attribute NewEnum.VB_UserMemId = -4 under the NewEnum() function.  Save and import back into project.
'This allows the Procedure Attribute to be recognized.
Option Explicit
Private pCollection As Collection
Private Sub Class_Initialize()
    Set pCollection = New Collection
End Sub
Private Sub Class_Terminate()
    Set pCollection = Nothing
End Sub
Function NewEnum() As IUnknown
    Set NewEnum = pCollection.[_NewEnum]
End Function
Public Function Count() As Long
    Count = pCollection.Count
End Function
Public Function item(key As Variant) As clsCustomCollection
    item = pCollection(key)
End Function
'Implements a selection sort algorithm, could likely be improved, but meets the current need.
Public Sub SortByProperty(sortPropertyName As String, sortAscending As Boolean)
    Dim item As Object
    Dim i As Long
    Dim j As Long
    Dim minIndex As Long
    Dim minValue As Variant
    Dim testValue As Variant
    Dim swapValues As Boolean
    Dim sKey As String
    For i = 1 To pCollection.Count - 1
        Set item = pCollection(i)
        minValue = CallByName(item, sortPropertyName, VbGet)
        minIndex = i
        For j = i + 1 To pCollection.Count
            Set item = pCollection(j)
            testValue = CallByName(item, sortPropertyName, VbGet)
            If (sortAscending) Then
                swapValues = (testValue < minValue)
            Else
                swapValues = (testValue > minValue)
            End If
            If (swapValues) Then
                minValue = testValue
                minIndex = j
            End If
            Set item = Nothing
        Next j
        If (minIndex <> i) Then
            Set item = pCollection(minIndex)
            pCollection.Remove minIndex
            pCollection.Add item, , i
            Set item = Nothing
        End If
        Set item = Nothing
    Next i
End Sub
Public Sub Add(value As Variant, key As Variant)
    pCollection.Add value, key
End Sub
Public Sub Remove(key As Variant)
    pCollection.Remove key
End Sub
Public Sub Clear()
    Set m_PrivateCollection = New Collection
End Sub
                        One popular option is to use an ADO disconnected recordset as a sort of hyperpowered collection/dictionary object, which has built-in support for Sort. Although you are using ADO, you don't need a database.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With