Поскольку я не уверен, как ваш код обрабатывает массив (или коллекцию), а вы не показали мне реальный код, я написал этот POC, но он плохо закодирован.
По сути, я кодирую-декодирую строки, отдавая приоритет тем, что, по-видимому, является вашим критерием сортировки (включая знаки + и -).
Sub test()
Dim array_unsorted(1 To 6) As String
Dim i As Long
Dim recoded(1 To 6) As String
Dim temp As String
Dim target As String
array_unsorted(1) = "S+01a"
array_unsorted(2) = "S+02a"
array_unsorted(3) = "S+03a"
array_unsorted(4) = "S-01a"
array_unsorted(5) = "S-01b"
array_unsorted(6) = "S-02a"
For i = 1 To 6
target = array_unsorted(i)
temp = Replace(target, "+", "A")
temp = Replace(target, "-", "Z")
recoded(i) = Mid(temp, 3, 2) & Right(temp, 1) & target
Next
Call QuickSort(recoded, 1, 6)
For i = 1 To 6
s = Right(recoded(i), 5)
Debug.Print s
Next
End Sub
Public Sub QuickSort(ByRef vArray As Variant, inLow As Long, inHi As Long)
Dim pivot As Variant
Dim tmpSwap As Variant
Dim tmpLow As Long
Dim tmpHi As Long
tmpLow = inLow
tmpHi = inHi
pivot = vArray((inLow + inHi) \ 2)
While (tmpLow <= tmpHi)
While (vArray(tmpLow) < pivot And tmpLow < inHi)
tmpLow = tmpLow + 1
Wend
While (pivot < vArray(tmpHi) And tmpHi > inLow)
tmpHi = tmpHi - 1
Wend
If (tmpLow <= tmpHi) Then
tmpSwap = vArray(tmpLow)
vArray(tmpLow) = vArray(tmpHi)
vArray(tmpHi) = tmpSwap
tmpLow = tmpLow + 1
tmpHi = tmpHi - 1
End If
Wend
If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
End Sub
По крайней мере, это работает и может быть отправной точкой. Удачного кодирования.
Ура! * * 1004