排序多张纸 - 清理代码

时间:2015-04-01 17:42:45

标签: excel vba excel-vba

寻找有关在多张纸上对列进行排序的一些指导。

我有2个数据集(tab1:ABC和tab2:XYZ)。 我试图按列A按降序对两张纸(范围列A到列J)进行排序。

这是我到目前为止所记录的......我非常希望清理我的代码,并寻找更好的方法来按列进行排序。任何帮助/提示将不胜感激。

Sub sortingcolumns()

Application.Goto Reference:="ABC!A1"
ActiveWorkbook.Worksheets("ABC").sort.SortFields.Clear
ActiveWorkbook.Worksheets("ABC").sort.SortFields.Add Key:=Range("A1"), _
    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
    xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("ABC").sort
    .SetRange Range("A2:K187")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With



Application.Goto Reference:="XYZ!RC"
ActiveWorkbook.Worksheets("XYZ").sort.SortFields.Clear
ActiveWorkbook.Worksheets("XYZ").sort.SortFields.Add Key:=Range("A1"), _
    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
    xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("XYZ").sort
    .SetRange Range("A2:J179")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

End Sub

4 个答案:

答案 0 :(得分:0)

因为您正在使用"使用"你可以将它们组合成一个更大的声明:

With ActiveWorkbook.Worksheets("ABC").sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("A1"), _
    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
    xlSortTextAsNumbers
    .SetRange Range("A2:K187")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

此外,您可以删除.header,.matchcase,.orientation,.sortmethod,如果您不需要按那些排序。

答案 1 :(得分:0)

我想完全限定所有对象,例如ActiveWorkbook变为Excel.ActiveWorkbook。这是个人选择。

此外,我还想避免使用Active...个对象,因此如果此代码只需要对存储代码的工作簿执行操作,请切换到ThisWorkbook

With Excel.ThisWorkbook.Worksheets("ABC").sort
    .SortFields.Clear
    .SortFields.Add _
       Key:=Range("A1"), _
       SortOn:=Excel.xlSortOnValues, _
       Order:=Excel.xlDescending, _
       DataOption:= Excel.xlSortTextAsNumbers
    .SetRange Range("A2:K187")
    .Header = Excel.xlNo
    .MatchCase = False
    .Orientation = Excel.xlTopToBottom
    .SortMethod = Excel.xlPinYin
    .Apply
End With

如果需要在单独的工作簿上操作,则使用对象变量。例如,如果目标列位于名为foo.xlsx的书中(我们假设已打开)

Dim myFooBk As Excel.workbook
Set myFooBk  = Excel.workbooks("foo.xlsx")

With myFooBk.Worksheets("ABC").sort
    .SortFields.Clear
    .SortFields.Add _
       Key:=Range("A1"), _
       SortOn:=Excel.xlSortOnValues, _
       Order:=Excel.xlDescending, _
       DataOption:= Excel.xlSortTextAsNumbers
    .SetRange Range("A2:K187")
    .Header = Excel.xlNo
    .MatchCase = False
    .Orientation = Excel.xlTopToBottom
    .SortMethod = Excel.xlPinYin
    .Apply
End With

通过移动子句中的with.Sort也可以稍微改变一下:

Dim myFooBk As Excel.workbook
Set myFooBk  = Excel.workbooks("foo.xlsx")

With myFooBk.Worksheets("ABC")
    .sort.SortFields.Clear
    .sort.SortFields.Add _
       Key:= .Range("A1"), _  '<<more specific now as `.` infront of Range
       SortOn:=Excel.xlSortOnValues, _
       Order:=Excel.xlDescending, _
       DataOption:= Excel.xlSortTextAsNumbers
    .sort.SetRange .Range("A2:K187") '<<more specific now as `.` infront of Range
    .sort.Header = Excel.xlNo
    .sort.MatchCase = False
    .sort.Orientation = Excel.xlTopToBottom
    .sort.SortMethod = Excel.xlPinYin
    .sort.Apply
End With

答案 2 :(得分:0)

call sortingcolumns ActiveWorkbook.worksheets("ABC"), 2, 187
call sortingcolumns ActiveWorkbook.worksheets("XYZ"), 2, 179

Sub sortingcolumns(sht as Worksheet, First as Integer, Last as Integer)

With sht.sort
  .sortfields.clear
  .sortfields.add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlDescending, _
      DataOption:=xlSortTextAsNumbers
  .setrange = sht.range("A" & First & ":K" & Last)
  .Header = xlNo
  .MatchCase = False
  .Orientation = xlTopToBottom
  .SortMethod = xlPinYin
  .Apply
End With

End Sub

您可以修改它以提供第一列和最后一列,然后您有一个很好的实用程序函数,可以通过传递适当的参数为您排序任何范围。

答案 3 :(得分:0)

是的,你可以大大缩短它:

Sub sortingcolumns()
    Worksheets("ABC").Range("A2:K187").sort key1:=Range("A1"), Order1:=xlDescending
    Worksheets("XYZ").Range("A2:J179").sort key1:=Range("A1"), Order1:=xlDescending
End sub

我做了以下更改:

  1. 我使用(旧)range.sort构造而不是(较新的)worksheet.sort。使用旧构造,您只需标识要排序的范围,然后将.sort方法应用于适当的参数。较新的一个也更灵活,但使用起来也更复杂。

  2. 您需要的唯一参数是key1Order1。如果你想对升序进行排序,你也可以消除order1参数;那么你只有一个论点。

  3. 如果未指定参数,Excel将使用默认值。代码段中的所有参数都是sort方法的默认参数。因此,您无需指定它们。