我在四列(varA,varB,varC,varD)中有几百行数据。我想编写一个宏,以便用户可以定义这些列的排序顺序,即首先按varD排序,然后按varA,varC,varB ......依此类推。总共有4个!或24种不同的排列可能性。我不希望用户直接在数据上运行排序,而是让他们有一种方法来定义他们希望列排序的顺序。我想的一种方法是给他们一个包含这些列名的表,他们只能提供排名(1到4)。基于这些排名,宏将动态确定排序顺序。
非常感谢任何帮助。
谢谢, chintoo
答案 0 :(得分:0)
我不熟悉excel的新版本,所以我不知道他们是否有什么可以让这更容易。
这就是我要做的事情
以下是我将如何列出工作表
标题行位于第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