我正在使用VBA中的ListObject
對象。特別是我動態地創建一個表(可變數量的行和列,以及可變的列標題)。我需要對錶格的列按升序排列字母順序。按列排序ListObject
舉例來說,如果我有表:
我希望它進行排序,像這樣,
有沒有辦法做到這一點?我試圖使用Range.Sort
方法,但似乎這是不允許的,如果範圍是ListObject
的一部分。
我也試圖記錄一個宏來查找代碼,但發現當我右鍵單擊表進行排序時,所選範圍留下了標題,我無法選擇「從左到右排序」選項...
任何想法?
我正在使用VBA中的ListObject
對象。特別是我動態地創建一個表(可變數量的行和列,以及可變的列標題)。我需要對錶格的列按升序排列字母順序。按列排序ListObject
舉例來說,如果我有表:
我希望它進行排序,像這樣,
有沒有辦法做到這一點?我試圖使用Range.Sort
方法,但似乎這是不允許的,如果範圍是ListObject
的一部分。
我也試圖記錄一個宏來查找代碼,但發現當我右鍵單擊表進行排序時,所選範圍留下了標題,我無法選擇「從左到右排序」選項...
任何想法?
這似乎工作。它需要一個表(如「表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的內置表格樣式中選擇的,它似乎保留了樣式。
這個樣子有希望!我有機會的時候會試試這個。如果'Sort'調用失敗,我會建議添加一個錯誤處理程序來重新創建表。這是否也保留了桌子的造型?或者它切換到默認值? –
@MichaelSPriz我在一張使用默認設置的桌面上測試了它,所以我不確定。它主要是作爲概念驗證而不是生產級代碼。 –
謝謝你的幫助:)我決定重組我的數據,所以我不需要這樣做。但是你的代碼有效,希望對任何有這個問題的人都有用。 –
使用列表對象的排序方法[如此處所述](https://msdn.microsoft.com/en-us/library/office/hh273486(v = office.14).aspx) –