按列中的日期值对范围进行排序

时间:2018-07-27 08:46:09

标签: excel vba excel-vba sorting datetime

下面的代码可以很好地执行,但是sort函数的输出是一团糟。

代码的目的是对从B2到L的最后一行的值范围进行排序 根据DD / MM / YYYY HH:MM:SS值

代码用于对文件夹中的一系列文件进行排序,因此仅进行简单的宏录制就不够

 Dim Slrow As Long
'Updated last row count to Column B from comment made
Slrow = Cells(Rows.Count, 2).End(xlUp).Row

    Range("B2:L" & Slrow).Sort Key1:=Range("B2:L" & Slrow), Order1:=xlAscending, Header:=xlNo


  SortWb.Close SaveChanges:=True

代码输出 Output of code

下面提供文件下载链接-> Download

使用自定义排序进行排序

enter image description here

2 个答案:

答案 0 :(得分:1)

问题出在密钥,您应用它的范围以及选项(看起来像您的数据在第1行中具有标题)。尝试这样的事情:

Range("B1:L" & Slrow).Sort Range("B2:B" & Slrow), xlAscending, , , , , , xlYes, , False, xlSortColumns, xlPinYin, xlSortNormal

答案 1 :(得分:1)

  • Key1更改为您要在Key1:=Range("B1")进行排序的列。

  • 使用SortOn:=xlSortOnValues来确保其对值进行排序而不是对文本进行排序(我认为这很有用)。

  • 使其更容易使用Header:=xlYes自动识别标头。

这应该有效:

Dim ws As Worksheet
Set ws = ActiveSheet 'better specify Worksheets("SheetName")    

With ws.Sort 
    .SortFields.Clear
    .SortFields.Add2 Key:=ws.Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange ws.Range("B1:L" & Slrow)
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

如果它不起作用,则您的日期不是日期值,而是文本,您需要将其转换为日期值。

总是总是一个好主意,使用ISO日期格式YYYY-MM-DD hh:mm:ss,这是唯一一种不会被人类误解并且可以很容易将其排序为文本的格式(例如文件名等。

使用上面的代码对示例进行排序的示例:

enter image description here