用户定义的多列在Excel中排序

时间:2009-10-23 22:30:34

标签: excel-vba vba excel

我在四列(varA,varB,varC,varD)中有几百行数据。我想编写一个宏,以便用户可以定义这些列的排序顺序,即首先按varD排序,然后按varA,varC,varB ......依此类推。总共有4个!或24种不同的排列可能性。我不希望用户直接在数据上运行排序,而是让他们有一种方法来定义他们希望列排序的顺序。我想的一种方法是给他们一个包含这些列名的表,他们只能提供排名(1到4)。基于这些排名,宏将动态确定排序顺序。

非常感谢任何帮助。

谢谢, chintoo

2 个答案:

答案 0 :(得分:0)

我不熟悉excel的新版本,所以我不知道他们是否有什么可以让这更容易。

这就是我要做的事情

  1. 按等级排列列
  2. 按列A,B,C,D
  3. 排序
  4. 将列排列回原始订单
  5. 以下是我将如何列出工作表

    标题行位于第2行。数据从第3行开始向下。

       A      B      C      D                
    1  
    2  varA   varB   varC   varD
    3  data1  data2  data3  data4
    4  data5  data6  data7  data8
    

    用户输入第1行的列排名

       A      B      C      D                
    1  2      4      3      1
    2  varA   varB   varC   varD
    3  data1  data2  data3  data4
    4  data5  data6  data7  data8
    

    在列标题名称前添加列号

       A      B      C      D                
    1  2      4      3      1
    2  1varA  2varB  3varC  4varD
    3  data1  data2  data3  data4
    4  data5  data6  data7  data8
    

    ROW 1 排序(从左到右排序,按排名排列)

       A      B      C      D
    1  4      3      2      1
    2  2varB  3varC  1varA  4varD
    3  data2  data3  data1  data4
    4  data6  data7  data5  data8
    

    列A,B,C,D或D,C,B,A 排序(取决于您想要的内容)

       A      B      C      D
    1  4      3      2      1
    2  2varB  3varC  1varA  4varD
    3  data2  data3  data1  data4
    4  data6  data7  data5  data8
    

    ROW 2 排序(按原始顺序排列列)

       A      B      C      D                
    1  2      4      3      1
    2  1varA  2varB  3varC  4varD
    3  data1  data2  data3  data4
    4  data5  data6  data7  data8
    

    删除列标题名称前面的列号

       A      B      C      D                
    1  2      4      3      1
    2  varA   varB   varC   varD
    3  data1  data2  data3  data4
    4  data5  data6  data7  data8
    

答案 1 :(得分:0)

您可以使用此功能确定正确的排序顺序:

Function getColumnByRank(rankSearch As Byte) As Range

    Dim c As Byte

    For c = 1 To 4
        With ActiveWorkbook.Worksheets("Sheet1")
            If .Cells(1, c).Value = rankSearch Then Set getColumnByRank = Cells(3, c)
        End With
    Next

End Function

我设置记录的方式是,排名值在第1行,排名和标题之间有一个空行(如果我不这样做,则excel搞砸标题引用)然后有下面的表格数据。

   A      B      C      D                
1  1      4      2      3
2
3  varA   varB   varC   varD
4  data1  data2  data3  data4
5  data5  data6  data7  data8

现在,您可以使用Alex使用的.Sort方法中的getColumnByRank函数来确定列引用。

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=getColumnByRank(1), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=getColumnByRank(2), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=getColumnByRank(3), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=getColumnByRank(4), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

如果您想将排名移至不同的表格或其他任何表格,只需更改功能即可。 HTH