2009-10-23 28 views
0

我在四列(varA,varB,varC,varD)中有几百行数据。我想编写一个宏,以便用户可以定义这些列的排序顺序,即首先按varD排序,然后按varA,varC,varB ...等等排序。总共有4个!或24种不同的排列可能性。我不希望用户直接对数据进行分类,而是让他们定义他们想要列排序的顺序。我想到的一种方法是给他们一张带有这些列名称的表格,他们可以提供排名(1到4)。基于这些等级,宏将动态确定排序顺序。用户自定义多列排序在Excel中

任何帮助,非常感谢。

感谢, chintoo

回答

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

+0

完美。谢谢JakeTheSnake。此外,感谢imfrancisd和Alex,他的逻辑给了我一些尝试的想法。 我会在我的电子表格中工作,看看我能否得到它的工作或卡住别的东西。 – chintoo 2009-10-25 11:59:09

0

我不熟悉与Excel的新版本,所以我不知道他们是否有东西,使它更容易些。

这里是我会做什么

  1. 安排由排名列
  2. 排序列A,B,C,d
  3. 安排列回原来的顺序

这里是我如何布置工作表

标题行在第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(从左到右排列,按r排列列ANK)

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 

排序行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 
+0

机械地这个工作。但我的数据是基于公式(主要是vlookup)和其他一些不属于这种类型的计算,所以按照从左到右或按行进行排序会混淆,并且我不能使用这种方式。我更希望使用VB,我将能够动态分配排序顺序,而不必翻动列。谢谢。 – chintoo 2009-10-24 05:23:28