Расширять Коллекции Класса VBA - PullRequest
3 голосов
/ 18 ноября 2009

Я создал функцию сортировки, которая позволяет сортировать коллекцию экземпляров пользовательского объекта на основе одного из свойств объектов. Можно ли расширить существующий класс коллекций в VBA? Я не верю, что наследование поддерживается в VBA, поэтому я не уверен, как это правильно сделать. Я мог бы просто создать новый модуль и поместить функцию в этот модуль, но это не самый лучший способ сделать это.

Ответы [ 3 ]

6 голосов
/ 19 ноября 2009

Спасибо за ответы. Я закончил тем, что создал свой собственный класс, который расширяет класс Collections в VBA. Ниже приведен код, если кому-то интересно.

'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
2 голосов
/ 19 ноября 2009

Один из популярных вариантов - использовать отключенный набор записей ADO в качестве некоего сверхспособного объекта коллекции / словаря, который имеет встроенную поддержку Сортировка . Хотя вы используете ADO, вам не нужна база данных .

0 голосов
/ 18 ноября 2009

Я хотел бы создать класс-оболочку, который предоставляет свойства объекта коллекции, заменяя функцию сортировки своей собственной.

...