VBA代码 - 自定义排序所有列除日期列之外

问题描述 投票:0回答:1

关于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
excel vba date
1个回答
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

通过对早期问题的答案中提供的建议,可以避免盲目地使用记录的宏所产生的许多问题。

© www.soinside.com 2019 - 2024. All rights reserved.