Пользовательская сортировка на основе строки - PullRequest
0 голосов
/ 07 июля 2019

У меня есть столбец, в котором у меня есть некоторые значения, подобные этим, а также несколько пустых строк:

Mr. & Mrs. X-Large
Mr. & Mrs. Large
Mr. & Mrs. Small
Mr. & Mrs. X-Large 
Mr. & Mrs. Small
Mr. & Mrs. X-Large
Mr. & Mrs. Large
Mr. & Mrs. X-Large
Mr. & Mrs. Large
Mr. & Mrs. Small
Mr. & Mrs. Medium
Mr. & Mrs. 2XL
Mr. & Mrs. 2XL
Mr. & Mrs. Large
Mr. & Mrs. Medium
Mr. & Mrs. Medium
Mr. & Mrs. Large

Я хочу отсортировать лист, где сначала указывается значение Small, затем Medium, затем Large, X-Большой и тд.Я ищу макрос, который можно использовать здесь.Цените вашу помощь здесь.Спасибо!

Обновление 07/07 - поэтому я попытался решить эту проблему с помощью макроса, вот что я выполнил: 1. В моем Excel у меня есть 3 листа, панель инструментов, обычный образец листа и дополнительный скрытый лист -Лист1 2. На скрытом листе (Лист1) я создал дополнительный столбец для присвоения числовых значений размерам, таким как Mr. & Mrs. Small - 1, Mr. & Mrs. Medium - 2, Mr. & Mrs. Large - 3и т. д. 2. Использовал следующий макрос в элементе управления формы на странице панели инструментов для сортировки

Sub Button2_Click()
Call PopulateSheet1
Call Sort
Call PopulateRegularSampleSheet
Application.CutCopyMode = False
End Sub

Следующая функция копирует данные из обычного листа в скрытый лист 1

Sub PopulateSheet1()
Worksheets("Regular Sample Sheet").Range("A1:BB10000").Copy
Worksheets("Sheet1").Range("A1:BB10000").PasteSpecial (xlPasteValues)
End Sub

Следующая функциясортирует данные на скрытом листе

Sub Sort()
Worksheets("Sheet1").Range("A1:BC10000").Sort 
Key1:=Worksheets("Sheet1").Range("BC1"), order1:=xlAscending, Header:=xlYes
End Sub

Следующее копирует данные обратно на обычный лист со скрытого листа

Sub PopulateRegularSampleSheet()
Worksheets("Sheet1").Range("A2:BB10000").Copy
Worksheets("Regular Sample Sheet").Range("A2:BB10000").PasteSpecial 
(xlPasteValues)
End Sub

Таким образом, после запуска макроса оба листа «Обычный лист» искрытый лист «Лист1» остается выбранным.Поэтому мой вопрос заключается в том, как сделать их невыбранными после запуска макроса.

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Я бы попробовал что-то вроде:

Option Explicit
Sub specialSort()
    Dim rSrc As Range, rScratch As Range, C As Range
    Dim wsSrc As Worksheet, wsScratch As Worksheet
    Dim V As Variant

Set wsSrc = Worksheets("sheet1")
    Set rSrc = wsSrc.Cells(1, 1).CurrentRegion

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set wsScratch = Worksheets.Add
    Set rScratch = wsScratch.Cells(1, 1)

rSrc.Copy rScratch
Set rScratch = rScratch.CurrentRegion
For Each C In rScratch
    C.Offset(0, 1).Value = Split(C)(UBound(Split(C)))
Next C

Set rScratch = rScratch.CurrentRegion
With wsScratch.Sort
    .SortFields.Clear
    .SortFields.Add Key:=rScratch.Columns(2), _
    SortOn:=xlSortOnValues, Order:=xlAscending, _
        CustomOrder:="Small,Medium,Large,X-Large,2XL", _
        DataOption:=xlSortNormal
    .SetRange rScratch
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .Apply
End With

rScratch.Columns(1).Copy rSrc

wsScratch.Delete

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub
  • Мы используем временный лист, который мы удаляем после того, как закончим.
  • Скопируйте исходные данные - если есть формулы, вы можете вставить специальные значения

  • Создать дополнительный столбец для размеров

  • Сортировать постолбец размеров.

  • Скопируйте первый столбец на исходный лист.

  • Удалите рабочий лист

0 голосов
/ 08 июля 2019

Как предложили несколько человек в комментариях, используйте пользовательскую сортировку.То есть обычно вам не следует переходить к макросу, если встроенная функциональность поддерживает то, что вы хотите сделать.

Вот изображение, на котором показано, как задать пользовательский порядок сортировки (а не алфавитный):

enter image description here

Если вы хотите отсортировать через макрос, я записал простой макрос, который делает то же самое, но в коде VBA:

Sub Macro1()
'
' Macro1 Macro
'

'
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("A1:A4") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "Small,Medium,Large", DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A1:A4")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...