2011-07-26 15 views
0

基本上有2個問題:傳遞數組和範圍Excel的的.sort算法

爲Excel的的.sort功能:當我不知道一個給定的表多少個鍵(頭)是如何添加鍵將會有?我想要傳遞一些預定義的數組,包含如何對給定的選擇進行排序的信息,以excel的.sort算法...我如何正確地做到這一點?

問題描述:

我有,該目錄的第一行中報頭的片材。標題是不同的名稱,第一行中可能存在可變數量的標題。標題描述了表格中下面幾行中列出的度量標準的不同詳細信息(一個度量標準/行)。

我需要編寫一個代碼,以便我可以排序某些綁定在一起的行,而不是整個工作表。例如,我可能需要對第28-35行進行排序。這將通過變量inRange傳遞給此程序。不過,我也希望能夠配置排序優先級,以及每次運行宏時如何對每列進行排序(請注意,一個行只能改變作爲整體的位置,行內的各個細胞不能改變位置)

我已經其描述了標題中的下列全局陣列:

headRow - 包含的陣列按列順序列出標題名稱

prLst - 包含確定每個標題的優先級的整數數組(輸入爲字符串)。整數在數組中的位置是它們描述的列號。

colIsString - 包含布爾值,確定給定列中列出的項目是字符串還是整數。 True =字符串,False =整數。同樣,陣列中布爾值的位置是他們描述的列號。

sortOrder - 包含指定排序方向的布爾值。 「真」 - 上升。 「假」 - 下降。再次,陣列中的布爾值的位置的位置是它們所描述的列數***

與已經etablished陣列中的數據,我有下面的代碼喂這些陣列的.sort:

Dim numHdrs, finalNumHdrs, count As Integer, newArray As Variant 
For numHdrs = 1 To UBound(headRow) 
    If colIsString(numHdrs) = True Then 
     sortOrder(numHdrs) = xlAscending 
    ElseIf colIsString(numHdrs) = False Then 
     sortOrder(numHdrs) = xlDescending 
    End If 
Next numHdrs 

newArray = CombineArrays(headRow, prLst, sortOrder) 

For finalNumHdrs = 1 To UBound(headRow) 
    If headRow(finalNumHdrs) And prLst(finalNumHdrs) And sortOrder(finalNumHdrs) <> "N/A" Then 
     'ActiveSheet.Sort.SortFields.Add Key(headRow(finalNumHdrs)):= finalNumHdrs 
     'ActiveSheet.Sort.SortFields.Add Order(finalNumHdrs):=sortOrder(finalNumHdrs) 
    End If 
Next finalNumHdrs 

With ActiveSheet.Sort 
    .SetRange inRange 
    .Apply 
End With 

我無法適當地加入了排序字段,用我有數組中的數據:

'ActiveSheet.Sort.SortFields.Add Key(headRow(finalNumHdrs)):= finalNumHdrs 
'ActiveSheet.Sort.SortFields.Add Order(finalNumHdrs):=sortOrder(finalNumHdrs) 

這顯然是不正確的。所以我創建了一個函數來連接headRow,prLst,sortOrder以使其更容易進入。排序:

Function CombineArrays(arr1 As Variant, arr2 As Variant, arr3 As Variant) 
Dim arr4 As Variant 
ReDim arr4(1 To UBound(arr2), 1 To 2) 

Dim i, j As Integer 
For i = 0 To UBound(arr1) 
    arr4(arr2(i), 1) = arr1(i) 
    arr4(arr2(i), 2) = arr3(i) 
Next i 
CombineArrays = arr4 
End Function 

由於ARR2被指定給定列的排序優先級,我需要養活它在ARR2指定密鑰號這樣的方式的.sort。如果在arr2 = 3時,key3:= arr4(3,1),order3:= arr4(3,2)。我假設我的元素到arr4的順序並不重要。 (如,如果我加入arr4(3,1之前arr4(4,1)),他們仍然會在適當的順序列出)

這可以歸結爲兩個問題:

爲Excel的功能的.sort :當我不知道給定工作表有多少個鍵(標題)時,如何添加鍵?

我正確嗎?

***注意:如果我早些時候聽說過他們,我會使用集合對象。但是,由於我是VBA新手,這就是我如何創建程序。考慮到我已經編寫的代碼返回並將所有數組更改爲集合對象,這將非常困難。

注意:這是一個更大的計劃,其說明可以在這裏找到的部分:Sorting Groups of Rows Excel VBA Macro

+1

你的問題是如此漫長和折衷細緻,以至於很難理解。你爲什麼不給我們展示一張照片 - 並相應地將文本縮短一千字。也請告訴我們廣告的代碼,並避免不完整的句子。 –

+0

我同意。它太冗長了。而「這裏是我迄今爲止的代碼」實際上並沒有列出任何代碼,只是代碼的設計方案......請重寫。 – aevanko

+0

我添加了一個新的描述,並列出了頂部列出的問題。希望這更清楚。 – H3lue

回答

1

我想你所期望的那種方法來接受排序鍵和命令,它不能做的數組。排序被限制爲最多3個排序列(就像它在用戶界面中一樣)

您將需要利用這個技巧,您可以通過按列逐列完成相同的排序結果從最不重要的一個到最重要的一個。下一個代碼是不完整的,並不完全是你所需要的,但是打算解釋一般的想法

' Assuming you have some array which lists the order in which to sort from most important to least important named priorityArr 
For i = UBound(priortyArr) To LBound(prioryArr) 
    ActiveSheet.Sort.SortFields.Add Key:= headRow(i) Order:=sortOrder(i) 
    ' do the rest you need to do and apply the sort 
Next 
+0

嗯...當你陳述時:「......你可以通過一列一列地完成相同的排序結果。」這在我的腦海裏沒有任何意義。如果我對第一列進行排序,那麼第二列,第一列確定的順序可以完全由第二列完成。我怎麼知道第一種是第二種分隔符?換句話說,我如何在第一列的順序內對第二列進行排序。 – H3lue

+0

通過在第二列上排序第一列和第一列之後。 (在Excel的用戶界面中使用它) – Eddy

+0

我會試試看,謝謝你的幫助。 – H3lue