нетрадиционная сортировка в Excel - PullRequest
0 голосов
/ 17 июня 2010

у меня есть такой список:

G05
G03
F02
F06
G10
A03
A11
E10
E05
C11
C03
D03
A12
C12
F05
H03
C08
G02
D10
B12
C10
D11
C02
E11
E02
E03
H11
A08
D05
F04
A04
H07
D04
B07
F12
E04
B03
H05
C06
F08
C09
E08
G12
C04
B05
H09
A07
E09
C07
G07
G09
A06
D09
E07
E12
G04
A10
H02
G08
B06
B09
D06
F07
G06
A09
H06
D07
H04
H10
F10
B02
B10
F03
F11
D08
B11
B08
D12
H08
A05

мне нужно, чтобы он был отсортирован следующим образом:

A03, B03, C03....A04, B04, C04.....A11, B11, C11........

обычная сортировка может быть сделана так:

ActiveWorkbook.Worksheets("2871P1").Sort.SortFields.Add Key:=Range("D20:D99") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("2871P1").Sort
    .SetRange Range("D20:E99")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

однако с помощью этого метода мы получим A01, A02, A03 etc...,, но это не то, что мне нужно

Ответы [ 3 ]

4 голосов
/ 17 июня 2010

Разделить столбец (, используя текст в столбцы ), чтобы сначала отсортировать по буквам, а затем по числовому столбцу.Затем рекомбинируйте свои столбцы.

1 голос
/ 10 ноября 2012

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

Стандартный сортировщик в VBA не даст вам доступ изнутри, но моя программируемая надстройка LAselect делает. Это позволяет вам перехватывать записи, а также иметь в своем распоряжении регулярные выражения, если вы действительно хотите использовать повторно используемый инструмент.

Регулярное выражение типа «[0-9] + $» будет возвращать любое количество цифр от конца записи, а LAselect будет сортировать их так, как хочет. Если предыдущее выражение возвращает равные числа, используйте «^ [A-Za-z] *» для перехода к текстовым частям.

Вы можете найти LASelect в любом месте в Интернете. Инструкции по включению регулярных выражений в VBA и поддержке их автоматического добавления приведены только в последнем выпуске на сайте www.liquorice-allsorts.com или см. http://www.regular -expressions.info / vb.html * 1009. *.

0 голосов
/ 17 июня 2010

вот что я сделал.Сначала я немного поработал со строками.вместо A03 я помещаю 03A в клетку.потом я все разобрал.затем я вернул его обратно к A03

Dim replace_string As String
Dim replace_number As String

For i = 20 To 98
    replace_string = Mid(Cells(i, 4), 1, 1)
    replace_number = Mid(Cells(i, 4), 2, 2)
    Cells(i, 4) = replace_number + replace_string
Next i


ActiveWorkbook.Worksheets("2871P1").Sort.SortFields.Add Key:=Range("D20:D99") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("2871P1").Sort
    .SetRange Range("D20:E99")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

For i = 20 To 98
    replace_string = Mid(Cells(i, 4), 3, 1)
    replace_number = Mid(Cells(i, 4), 1, 2)
    Cells(i, 4) = replace_string + replace_number
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...