【问题标题】:In a multi-sheet workbook, how do I code a multi-column sort in VBA?在多表工作簿中,如何在 VBA 中编写多列排序?
【发布时间】:2016-01-14 09:37:24
【问题描述】:

我正在 Excel/VBA 中构建一个货物堆叠计算器,其中一个阶段将可堆叠的货物分成单独的表格以进行实际的堆叠计算。作为其中的一部分,我需要按顺序对项目进行排序:

  • 货物类型(“管道”、“梁”、“板”、其他/未定义 - 通配符会很有用,但理论上应该只出现这三种类型)
  • 宽度(从高到低)
  • 长度(从高到低)

使用宏记录器尝试使用 Excel 排序,它全部采用 A1 表示法,没有定义工作表。我还尝试将工作表变量 (wsStackList.) 添加到 Range 元素,但无济于事。我似乎也无法使用 R1C1 表示法(尝试使用 Cells(1,2):Cells(2,2)Cells(1,2), Cells(2,2),但还没有任何连接或基于代码的形式)或命名范围(Range("StackingField"))。

我目前得到的错误信息是1004错误,指定为“无法获取Range类的Sort属性”。

我当前的代码是:

Sub SegmentSort()
' Sort by segment

    Range("StackingField").Sort.SortFields.Add Key:=Range("A2:A501"),_
        SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="Pipes,Beams,Plates",_
        DataOption:=xlSortNormal
    Range("StackingField").Sort.SortFields.Add Key:=Range("F2:F501"),_
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    Range("StackingField").Sort.SortFields.Add Key:=Range("E2:E501"),_
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With Range("StackingField").Sort
        .SetRange Range("A1:H501")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .Apply
    End With

End Sub

是否值得尝试完成这项工作,还是我最好回到基础并尝试在 VBA 中从头开始编写某种排序算法?这不是我有任何经验的东西,但我知道交换排序等的基本概念。绝对不够自信。

【问题讨论】:

  • 我先清除排序字段,如果没有自定义排序,它可以工作吗?另外,我认为排序是在工作表级别,所以使用 Worksheets("data").sort
  • 添加了一个 .Clear 行并更改为 With Worksheets("Stacker").Sort,所以这些位现在应该可以工作了。在 Ranges 上尝试了更多变体,但无济于事。非自定义排序也不起作用,同样的错误。我想知道 Excel 排序是否依赖于被激活的工作表或其他东西?
  • 你能试试 Worksheets("Data").Range("A1:H501")
  • 恐怕还是同样的错误。

标签: vba excel sorting


【解决方案1】:

我不知道为什么 Dirk Reichel 删除了他的答案,但它确实有效!他建议的代码是这样的:

Sub SegmentSort()
  With Sheets("Stacker").Sort
    .SortFields.Clear
    .SortFields.Add Range("A:A"), xlSortOnValues, xlAscending, "Pipes,Beams,Plates", xlSortNormal
    .SortFields.Add Range("F:F"), xlSortOnValues, xlDescending, , xlSortNormal
    .SortFields.Add Range("E:E"), xlSortOnValues, xlDescending, , xlSortNormal
    .SetRange Range("A:H")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .Apply
  End With
End Sub

Dirk,我不能给你应得的支持,但谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多