SO上的第一篇文章,并且几乎不会认为自己是编码员,所以这可能很容易......我一直在为这段代码苦苦挣扎了一段时间,tt 似乎适用于所有列,除了 F,它填充了格式为 mm/dd/yyyy 的日期。当代码到达带有日期的 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
这是两个问题合二为一。
[它] 似乎适用于所有列,除了 F
您的代码具有Key:=Range("F5:F & lastrow"),
而不是Key:=Range("F5:F" & lastrow),
(请注意"
的位置变化(。
关于如何制作的任何建议.设置范围范围("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
现在你可以看看那个代码,看看你是否可以再整理它。它更容易阅读和理解。
一些额外的阅读:
如何避免使用在Excel中选择VBA
如何避免使用 .选择。激活,活动表,活动细胞在我的特定vba代码?
Excel 2013 VBA替代使用激活并选择
使用工作表代号并避免 .选择 &.激活
盲目使用录制的宏所产生的许多问题可以通过回答这些早期问题时提供的建议来避免。