Excel VBA сортировка по индивидуальному заказу - PullRequest
0 голосов
/ 18 сентября 2018

Я новичок в VBA и имею эту проблему.Позиция и значение таблицы

A1 S+01a
A2 S+02a
A3 S+03a
A4 S-01a
A5 S-01b
A6 S-02a

Поскольку это генерируется VBA, и я хотел бы заказать в этом порядке

A1 S+01a
A2 S-01a
A3 S-01b
A4 S+02a
A5 S-02b
A6 S+03a

Правила сортировки будут

  • знак плюс с наименьшим числом позади
  • знак минус с тем же номером, что и знак плюс (если существует)
  • (только для знака минус) в алфавитном порядке последнего символа

Я хотел бы выполнить это действие с помощью VBA (поскольку длина данных будет больше). Любая подсказка для этой ситуации?

Спасибо за ответ / подсказку.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Поскольку я не уверен, как ваш код обрабатывает массив (или коллекцию), а вы не показали мне реальный код, я написал этот 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

0 голосов
/ 18 сентября 2018

Чтобы добавить пользовательский порядок сортировки вручную:

  1. Выберите диапазон данных для сортировки
  2. На вкладке ленты Data нажмите Sort
  3. Нажмите раскрывающийся список Order и выберите Custom внизу списка.

Это приведет вас к настраиваемому диалоговому окну сортировки, где вы сможете добавить определенный порядок сортировки, где он останется в списке.

img

См. Также: Сортировка данных с использованием пользовательского списка


Если есть конкретная причина, по которой это должно быть сделано с помощью VBA, я бы предложил Запись макроса для генерации кода , а затем вы можете пересмотреть его как требуется .

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