Сортировка коллекции по значению - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть коллекция дат в формате "1801,1802,1803,1710,1711 и т. Д. Я хотел бы иметь возможность сортировать их по значению так, чтобы самые низкие сначала были, например, 1710, 1711, 1801, 1802, 1803.

Причина этого в том, что я могу поместить их в строку в правильном порядке.

Я не уверен, как это сделать, и любая помощь будет признательна. Спасибо

1 Ответ

0 голосов
/ 27 апреля 2018

Вот действительно простой пример:

Sub Nathan()
    Dim c As Collection, arr, brr
    Dim MyString As String

    Set c = New Collection

    '   Part 1 build Collection


    arr = Split("1801,1802,1803,1710,1711", ",")
    For Each a In arr
        c.Add Val(a)
    Next a

    '   Part 2 put Collection into an array

    ReDim brr(1 To c.Count)
    For i = 1 To c.Count
        brr(i) = c.Item(i)
    Next i

    '   Part 3 sort the array

    Call aSort(brr)

    '   make and output a css

    MyString = Join(brr, ",")
    MsgBox MyString

End Sub

Public Sub aSort(ByRef InOut)

    Dim i As Long, j As Long, Low As Long
    Dim Hi As Long, Temp As Variant

    Low = LBound(InOut)
    Hi = UBound(InOut)

    j = (Hi - Low + 1) \ 2
    Do While j > 0
        For i = Low To Hi - j
          If InOut(i) > InOut(i + j) Then
            Temp = InOut(i)
            InOut(i) = InOut(i + j)
            InOut(i + j) = Temp
          End If
        Next i
        For i = Hi - j To Low Step -1
          If InOut(i) > InOut(i + j) Then
            Temp = InOut(i)
            InOut(i) = InOut(i + j)
            InOut(i + j) = Temp
          End If
        Next i
        j = j \ 2
    Loop
    End Sub

enter image description here

Рассмотрите возможность использования словаря сценариев (поскольку сортировка уже встроена)

EDIT # 1:

Чтобы не писать sort, вы можете использовать System.Collection.ArrayList. Вот пример, который берет данные из столбца A , сортирует их и помещает результат в столбец B :

Sub AsortedAffair()
    Dim arr, o As Object, oc As Long, i As Long
    arr = Columns(1).SpecialCells(2)
    Set o = CreateObject("System.Collections.ArrayList")

    For Each a In arr
        o.Add a
    Next a

    o.Sort
    oc = o.Count
    For i = 1 To oc
        Cells(i, 2) = o.Item(i - 1)
    Next i

End Sub

enter image description here

Из этого так же легко построить строку через запятую.

Обратите внимание, что индекс этого свойства Item() начинается с нуля, а не с единицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...