Это два вопроса в одном.
[похоже] работает для всех столбцов, кроме 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
Множество проблем, созданных слепым использованием записанных макросов, можно избежать с помощью советов, представленных в ответах на эти предыдущие вопросы.