VBA代码-自定义对所有列(日期除外)进行排序

时间:2018-08-31 20:38:48

标签: excel vba date

关于SO的第一篇文章,几乎不会认为自己是一名编码人员,所以这可能很容易...我一直在为此代码苦苦挣扎一段时间,tt似乎适用于除F之外的所有列,其中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

1 个答案:

答案 0 :(得分:1)

这是两个问题合而为一。

  

[它]似乎适用于除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

现在,您可以看一下该代码,并确定是否可以整理一下。更容易阅读和理解。

一些其他读物:

How to avoid using Select in Excel VBA

How to avoid using .Select, .Activate, ActiveSheet,ActiveCell in my specific vba code?

Excel 2013 VBA alternative to using Activate and Select

Using Worksheet CodeName and Avoiding .Select & .Activate

通过对这些较早问题的解答中提供的建议,可以避免盲目使用录制的宏所创建的许多问题。

相关问题