我在四列(varA,varB,varC,varD)中有幾百行數據。我想編寫一個宏,以便用戶可以定義這些列的排序順序,即首先按varD排序,然後按varA,varC,varB ...等等排序。總共有4個!或24種不同的排列可能性。我不希望用戶直接對數據進行分類,而是讓他們定義他們想要列排序的順序。我想到的一種方法是給他們一張帶有這些列名稱的表格,他們可以提供排名(1到4)。基於這些等級,宏將動態確定排序順序。用戶自定義多列排序在Excel中
任何幫助,非常感謝。
感謝, chintoo
我在四列(varA,varB,varC,varD)中有幾百行數據。我想編寫一個宏,以便用戶可以定義這些列的排序順序,即首先按varD排序,然後按varA,varC,varB ...等等排序。總共有4個!或24種不同的排列可能性。我不希望用戶直接對數據進行分類,而是讓他們定義他們想要列排序的順序。我想到的一種方法是給他們一張帶有這些列名稱的表格,他們可以提供排名(1到4)。基於這些等級,宏將動態確定排序順序。用戶自定義多列排序在Excel中
任何幫助,非常感謝。
感謝, chintoo
您可以使用此功能,以確定正確的排序順序刪除列數:
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
我不熟悉與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(從左到右排列,按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
機械地這個工作。但我的數據是基於公式(主要是vlookup)和其他一些不屬於這種類型的計算,所以按照從左到右或按行進行排序會混淆,並且我不能使用這種方式。我更希望使用VB,我將能夠動態分配排序順序,而不必翻動列。謝謝。 – chintoo 2009-10-24 05:23:28
完美。謝謝JakeTheSnake。此外,感謝imfrancisd和Alex,他的邏輯給了我一些嘗試的想法。 我會在我的電子表格中工作,看看我能否得到它的工作或卡住別的東西。 – chintoo 2009-10-25 11:59:09