Сортировка коллекции объектов в VBA с помощью компаратора - PullRequest
0 голосов
/ 20 июня 2019

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

Что у меня есть: список объектов с разными свойствами, наиболее важными из которых являются продолжительность определенного действия.

Что мне нужно: я хочу отсортированный список объектов с помощью компаратора, основанного на свойстве времени (длительность определенного действия).

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

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Я решил довольно похожую проблему с помощью типов.

Option Compare Database
Option Explicit
Type tPersonalData
    FamilyName As String
    Name As String
    BirthDate As Date
End Type
Type tHuman
    PersonalData As tPersonalData
    Height As Integer
    CashAmount As Integer
End Type
Public Sub subUsage()
    Dim Humans(10) As tHuman
    Dim HumanCurrent As tHuman
    With HumanCurrent
        .CashAmount = 100
        .Height = 190
        .PersonalData.FamilyName = "Smith"
        .PersonalData.Name = "John"
        .PersonalData.BirthDate = CDate("01.01.1980")
    End With
    Humans(1) = HumanCurrent
End Sub

Таким образом, после этого вы можете реализовать свои собственные функции сортировки для массива, используя данное поле.

1 голос
/ 25 июня 2019

Я создал метод сортировки на основе Ван Нга, чтобы сортировать мои объекты следующим образом:

 Public Sub sortedCollectionByDuration()

 Dim vItm As ClsCron
 Dim i As Long, j As Long
 Dim vTemp As Variant

 Set vTemp = New ClsCron
 Set vItm = New ClsCron

For i = 1 To myCol.Count - 1
        For j = i + 1 To myCol.Count
            If myCol(i).Duration > myCol(j).Duration Then

               Set vTemp = myCol(j)

                myCol.Remove j

                myCol.add vTemp, , i
            End If
        Next j
    Next i

   -- testing or logging

    For Each vItm In myCol
        Debug.Print vItm.ModuleName & " " & vItm.FunctionName & VBA.Format(vItm.Duration, "HH:MM:SS")

    Next vItm


End Sub
...