Попытка отсортировать пользовательский список - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь отсортировать список в Excel. Учитывая набор данных:

1

2A

3

2

3

5A

6

7

Я хочу сначала отсортировать по номеру, а затем по букве. Пример: я хочу, чтобы 2А был раньше 3, а не после 7.

Я пробовал поиск в Google, но мне нужен макрос, а не то, чтобы человек нажимал на функцию сортировки в Excel.

Sub original_sort_code()
    Dim a, i As Long
    With Cells(1).CurrentRegion
        a = .Value
        ReDim Preserve a(1 To UBound(a, 1), 1 To UBound(a, 2) + 1)
        With CreateObject("VBScript.RegExp")
            .Pattern = "\d+(\.\d+)?"
            For i = 2 To UBound(a, 1)
                If .test(a(i, 1)) Then a(i, UBound(a, 2)) = _
                Format$(.Execute(a(i, 1))(0), String(20, "0")) & a(i, 1)
            Next
        End With
        VSortM a, 2, UBound(a, 1), UBound(a, 2), 1
        .Value = a
    End With
End Sub

Private Sub VSortM(ary, LB, UB, ref, Optional ord As Boolean = 1)
    Dim M As Variant, i As Long, ii As Long, iii As Long, temp
    i = UB: ii = LB
    M = ary(Int((LB + UB) / 2), ref)
    Do While ii <= i
        If ord Then
            Do While ary(ii, ref) < M: ii = ii + 1: Loop
        Else
            Do While ary(ii, ref) > M: ii = ii + 1: Loop
        End If
        If ord Then
            Do While ary(i, ref) > M: i = i - 1: Loop
        Else
            Do While ary(i, ref) < M: i = i - 1: Loop
        End If
        If ii <= i Then
            For iii = LBound(ary, 2) To UBound(ary, 2)
                temp = ary(ii, iii): ary(ii, iii) = ary(i, iii): ary(i, iii) = temp
            Next
            ii = ii + 1: i = i - 1
         End If
    Loop
    If LB < i Then VSortM ary, LB, i, ref, ord
    If ii < UB Then VSortM ary, ii, UB, ref, ord
End Sub

Я хочу сначала отсортировать по номеру, а затем по букве. Пример: я хочу, чтобы 2А был раньше 3, а не после 7.

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