Код VBA - Пользовательский Сортировка всех столбцов, КРОМЕ столбца даты - PullRequest
0 голосов
/ 31 августа 2018

Первый пост на SO, и вряд ли я считаю себя кодировщиком, так что это, вероятно, просто ... Я некоторое время боролся с этим кодом, кажется, что tt работает для всех столбцов, кроме F, который заполнен датами в формате мм / дд / гггг. Код не выполняется полностью, когда он достигает столбца F с датами.

Чтобы получить этот код, я использовал макро-рекордер Excel и персонализировал диапазоны.

Sub Sorting()
'
' Sorting Macro
'

'
    Range("A4").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Ambulatory Care").Sort.SortFields.Clear
Dim lastrow As Long
lastrow = Cells(Rows.Count, 2).End(xlUp).Row
ActiveWorkbook.Worksheets("Ambulatory Care").Sort.SortFields.Add Key:=Range( _
    "A5:A" & lastrow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
ActiveWorkbook.Worksheets("Ambulatory Care").Sort.SortFields.Add Key:=Range( _
    "B5:B" & lastrow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
ActiveWorkbook.Worksheets("Ambulatory Care").Sort.SortFields.Add Key:=Range( _
    "C5:C" & lastrow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
ActiveWorkbook.Worksheets("Ambulatory Care").Sort.SortFields.Add Key:=Range( _
    "I5:I" & lastrow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
ActiveWorkbook.Worksheets("Ambulatory Care").Sort.SortFields.Add Key:=Range( _
    "F5:F & lastrow"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
With ActiveWorkbook.Worksheets("Ambulatory Care").Sort
    .SetRange Range("A4:J798")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
Range("A4").Select
End Sub

1 Ответ

0 голосов
/ 01 сентября 2018

Это два вопроса в одном.

[похоже] работает для всех столбцов, кроме F

Ваш код имеет Key:=Range("F5:F & lastrow"), вместо Key:=Range("F5:F" & lastrow), (обратите внимание на изменение положения ").

любой совет о том, как сделать .SetRange Range ("A4: J798") динамическим IE A4: последний ряд?

Используйте ту же технику, что и ранее: .SetRange Range("A4:J" & lastrow)

Некоторые дополнительные очки

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

Как вы уже поняли, попытка настроить этот записанный код может быть трудной - то, что записано, может не потребоваться в макросе. Поэтому я позволил себе переписать ваш код (основываясь на том, что записано) с некоторыми комментариями. Я не пытался добавлять какие-либо новые методы - другие комментаторы могут определить различные эффективные способы достижения того, чего вы хотите.

Sub Sorting()
'
' Sorting Macro
'
' You don't need the original selection lines. You are working directly with the ranges you want below.
' Good indenting is your friend - it makes the logic and flow easier to see.
' All the work you do is with the one worksheet.
' So to make life easier, I am using a single outer "With" to prevent a lot of retyping. 
    With ThisWorkbook.Worksheets("Ambulatory Care").Sort
        .SortFields.Clear
        Dim lastrow As Long
    ' make sure all your range references are fully qualified. Otherwise Excel will default to what is active at the time (which may not be what you think it is or may change during the running of the code). 
        lastrow = .Cells(.Rows.Count, 2).End(xlUp).Row
        .SortFields.Add Key:=Range( _
            "A5:A" & lastrow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        .SortFields.Add Key:=Range( _
            "B5:B" & lastrow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        .SortFields.Add Key:=Range( _
            "C5:C" & lastrow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        .SortFields.Add Key:=Range( _
            "I5:I" & lastrow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        .SortFields.Add Key:=Range( _
            "F5:F" & lastrow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        .SetRange Range("A4:J" & lastrow)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
' Final select not required
End Sub

Теперь вы можете посмотреть на этот код и разобраться, не могли бы вы привести его в порядок. Его легче читать и понимать.

Некоторое дополнительное чтение:

Как избежать использования Select в Excel VBA

Как избежать использования .Select, .Activate, ActiveSheet, ActiveCell в моем конкретном коде VBA?

Excel 2013 VBA, альтернативный использованию Активировать и Выбрать

Использование CodeName листа и предотвращение. Выберите & .Activate

Множество проблем, созданных слепым использованием записанных макросов, можно избежать с помощью советов, представленных в ответах на эти предыдущие вопросы.

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