2015-08-14 66 views
0

我正在使用VBA中的ListObject對象。特別是我動態地創建一個表(可變數量的行和列,以及可變的列標題)。我需要對錶格的升序排列字母順序按列排序ListObject

舉例來說,如果我有表:

Unsorted Table

我希望它進行排序,像這樣,

Sorted Table

有沒有辦法做到這一點?我試圖使用Range.Sort方法,但似乎這是不允許的,如果範圍是ListObject的一部分。

我也試圖記錄一個宏來查找代碼,但發現當我右鍵單擊表進行排序時,所選範圍留下了標題,我無法選擇「從左到右排序」選項...

任何想法?

+0

使用列表對象的排序方法[如此處所述](https://msdn.microsoft.com/en-us/library/office/hh273486(v = office.14).aspx) –

回答

1

這似乎工作。它需要一個表(如「表1」)的名稱,將其轉換爲範圍,進行排序,然後它具有相同的名稱重新轉換到表:

Sub SortByCol(tableName As String) 
    Dim sh As Worksheet 
    Dim myTable As ListObject 
    Dim myStyle As TableStyle 
    Dim myRange As Range 
    Set sh = ActiveSheet 

    Set myTable = sh.ListObjects(tableName) 
    Set myStyle = myTable.TableStyle 

    Set myRange = myTable.Range 
    myTable.Unlist 
    On Error Resume Next 
    myRange.Sort key1:=myRange.Rows(1), Orientation:=xlSortRows 
    If Err.Number > 0 Then Debug.Print "Range couldn't be sorted" 
    On Error GoTo 0 
    sh.ListObjects.Add(xlSrcRange, myRange, , xlYes).Name = tableName 
    sh.ListObjects(tableName).TableStyle = myStyle 
End Sub 

上編輯:我加了誤碼處理排序方法調用。實驗表明,我的原始代碼沒有保留樣式(如果表沒有默認樣式,那麼結果是默認樣式和原始表樣式的奇怪混合)。我添加了編碼以保存並恢復原始表格樣式,但我對錶格格式不太瞭解,並且可能錯過了一些細微之處。至少,如果它是從Excel的內置表格樣式中選擇的,它似乎保留了樣式。

+0

這個樣子有希望!我有機會的時候會試試這個。如果'Sort'調用失敗,我會建議添加一個錯誤處理程序來重新創建表。這是否也保留了桌子的造型?或者它切換到默認值? –

+0

@MichaelSPriz我在一張使用默認設置的桌面上測試了它,所以我不確定。它主要是作爲概念驗證而不是生產級代碼。 –

+0

謝謝你的幫助:)我決定重組我的數據,所以我不需要這樣做。但是你的代碼有效,希望對任何有這個問題的人都有用。 –