ПРАВИЛЬНЫЙ способ сортировки диапазона в VBA - PullRequest
0 голосов
/ 30 сентября 2019

Здравствуйте и спасибо за ваше время,

У меня есть простой диапазон для сортировки, и код ниже был написан для меня Макро-рекордером, он работает отлично, однако я буду использовать это бесчисленное количество разво многих других диапазонах, и мне было интересно, если это правильный путь, или, возможно, есть более короткий, более обтекаемый способ написания этого кода ...

Sub test6()

    Application.CutCopyMode = False
    ActiveWorkbook.Worksheets("Weekly Sorted").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Weekly Sorted").Sort.SortFields.Add Key:=Range( _
        "AK6:AK12"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Weekly Sorted").Sort
        .SetRange Range("AG6:AK12")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With


End Sub

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Возможно, вам лучше будет использовать метод .sort.

Sub SortRange()

  Dim MyRange As Range

  Set MyRange = Sheets("Weekly Sorted").Range("AK6:AK12")

  With MyRange
    .Sort Key1:=.Columns(1), Order1:=xlAscending, Header:=xlNo
  End With

End Sub

Приведенный выше пример сортирует весь диапазон на основе значений в первом столбце. Надеюсь, это поможет.

Редактировать:

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

Private Sub SortRanges()

  'Sort per your example address
  SortMyRange Sheets("Weekly Sorted").Range("AG6:AK12")

  'Other examples below

  'Sorts a range on a sheet named "Monthly Sorted", in descending order based on values in the 4th column of the specified range
  SortMyRange Sheets("Monthly Sorted").Range("A2:D12"), 4, xlDescending

  'Sorts a range on a sheet named "Daily Sorted", in ascending order based on values in the 2nd column of the specified range
  SortMyRange Sheets("Daily Sorted").Range("AG6:AK12"), 2, xlAscending

End Sub

Public Sub SortMyRange(ByRef RangeToSort As Range, Optional ByVal SortByColumn As Long = 1, _
  Optional ByVal SortOrder As XlSortOrder = xlAscending)

  With RangeToSort
    .Sort Key1:=.Columns(SortByColumn), Order1:=SortOrder, Header:=xlNo
  End With

End Sub
0 голосов
/ 30 сентября 2019

Есть два способа сделать это.

  1. Старомодный способ Метод сортировки -Excel 2003

Используйте этот код

ws.Columns("A:AE").Sort Key1:=ws.Range("A2"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Новый путь

Преобразуйте свой код в подпрограмму, как показано ниже ( Не проверено ), и передайте ей лист / диапазон, как предложено @braX

Sub SortRange(ws As Worksheet, rng As Range)
    With ws
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=rng, SortOn:=xlSortOnValues, _
        Order:=xlDescending, DataOption:=xlSortNormal

        With .Sort
            .SetRange rng
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...