Я хочу иметь возможность сортировать строки Excel, где данные выглядят так
Column - 1 Other Columns
701-GBL-1843-MLMK blah
566-JJB-2785-MYJW
254-WYD-3220-NAND
884-GLE-2843-FRYA
И я хочу иметь возможность сортировать данные по третьему параметру, чтобы я сравнивал по числам в середине строки, чтобы в итоге получилось что-то вроде
701-GBL-1843-MLMK
566-JJB-2785-MYJW
884-GLE-2843-FRYA
254-WYD-3220-NAND
Есть ли способ сделать это, вместо того, чтобы создавать собственный список, который будет состоять из 100000000000000 элементов?
По сути, я хочу знать, как написать код для Excel, в котором я могу сделать пользовательское сравнение, которое будет похоже на
псевдо:
mycompare(cell1, cell2):
if(cell1's third param > cell2's third param):
return GREATER
if(cell1's third param < cell2's third param):
return LESS
return EQUAL
sort(myWorksheet, mycompare)
Излишне говорить, что я не умею программировать и использовать VB. Извините.
решение1
Создайте вспомогательный столбец. В строке 2 этого столбца (предполагая, что строка 1 имеет заголовки) введите формулу
=MID(A2,9,4)
Это извлечет «третий параметр» из значения в первом столбце. Затем отсортируем по вспомогательному столбцу:
решение2
Подход, который я бы выбрал, заключается в создании дополнительного столбца данных. Предполагая, что формат ваших значений в столбце один всегда имеет фиксированную длину, как в вашем примере, я бы использовал,
=MID(A2,9,4)
чтобы извлечь третий элемент в отдельную ячейку, чтобы затем можно было отсортировать по этому столбцу. Мой пример формулы выбирает 4 символа, начиная с позиции 9 символа, что, похоже, работает для показанных примеров данных.
Если вам нужна формула, которая извлекает третий элемент на основе нахождения второго и третьего тире и числа между ними, это тоже можно сделать, мне просто нужно поиграться с ней, чтобы найти кратчайший подход, но это можно сделать легко.
решение3
Я знаю, что у вас есть ответ, но раз уж вы спросили, как это сделать с помощью VBa
Option Explicit
Sub Testing()
Start (False) ' large to small
Start (True) ' small to big
End Sub
Sub Start(fromSmallToBig As Boolean)
Dim myRow As Integer
myRow = 1
Do While (Range("A" & myRow).Value <> "")
Dim currentValue As String
currentValue = Range("A" & myRow).Value
Dim nextValue As String
nextValue = Range("A" & myRow + 1).Value
If (nextValue = "") Then
Exit Do
End If
Dim first() As String
first = Split(currentValue, "-")
Dim second() As String
second = Split(nextValue, "-")
If (fromSmallToBig) Then
Call Sorting(first(2), second(2), myRow, nextValue, currentValue)
Else
Call Sorting(second(2), first(2), myRow, nextValue, currentValue)
End If
myRow = myRow + 1
Loop
End Sub
Sub Sorting(first As String, second As String, myRow As Integer, nextValue As String, currentValue As String)
If first > second Then
Dim rowOne() As Variant
rowOne = Rows(myRow).Value
Dim rowTwo() As Variant
rowTwo = Rows(myRow + 1).Value
Rows(myRow).Value = rowTwo
Rows(myRow + 1).Value = rowOne
myRow = 0 ' start all over again, not efficient but, simpler code
End If
End Sub
Это также означает, что вам не нужно иметь никаких дополнительных столбцов только для сортировки, хотя на самом деле это может быть не очень хорошо (ответ Скотта позволяет вам использовать мощь Excel, тогда как мой ответ на VBa бесполезен и может быть не очень эффективен с очень большими данными)