2009-10-23 20 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