在多表工作簿中,如何在VBA中对多列排序进行编码?

时间:2016-01-14 09:37:25

标签: excel vba excel-vba sorting

我正在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中编写某种排序算法?这不是我有任何经验,但我知道交换排序的基本概念等。绝对远非自信。

1 个答案:

答案 0 :(得分:0)

我不知道为什么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
德克,我不能给你你应得的支持,但谢谢!