Выборочная сортировка динамического диапазона с использованием VBA - PullRequest
0 голосов
/ 06 июня 2019

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

Я пытаюсь собрать макрос, который выделяет весь регион (начиная с B2).Необходимо отсортировать столбец C (по возрастанию), G (по убыванию), H (по возрастанию) и I (по убыванию).

Я начал с использования устройства записи макросов и сейчас пытаюсь очистить выдаваемый код.

Пока мне удалось собрать код, который выбирает регион от B2 довправо, а затем вниз.Затем, при определении критериев сортировки для каждого столбца, я попытался убедиться, что выбранный диапазон идет из верхней части списка в строке 3 (строка 2 имеет заголовки, строка 3 является первым элементом в списке), а затем динамически выбираетсявниз для каждого соответствующего столбца.Тем не менее, после оператора With я изо всех сил пытаюсь добиться того, чтобы диапазон был динамическим (это все еще только статический диапазон, записанный макросом).

Я также получаю «Ошибка времени выполнения» 1004: ошибка приложения или объекта »после .Apply.

Sub Macro1()
Range("B2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("G3", 
Range("G3").End(xlToRight)) _
    , SortOn:=xlSortOnValues, Order:=xlDescending, 
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C3", 
Range("C3").End(xlToRight)) _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("H3", 
Range("H3").End(xlToRight)) _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("I3", 
Range("I3").End(xlToRight)) _
    , SortOn:=xlSortOnValues, Order:=xlDescending, 
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("B2:Q31") ' NOT SURE HOW TO MAKE DYNAMIC HERE
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply ' GETTING ERROR HERE
End With
End Sub

1 Ответ

0 голосов
/ 06 июня 2019

Просто пришлось изменить Range на Selection, так как вы уже динамически выбрали диапазон в работе:

Sub Macro1()
Range("B2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("G3", Range("G3").End(xlDown)), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("C3", _
Range("C3").End(xlDown)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("H3", _
Range("H3").End(xlDown)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("I3", _
Range("I3").End(xlDown)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
'

With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range(Selection.Address)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
End With

End Sub

Посмотрите, работает ли оно сейчас.

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