按列排序ListObject

时间:2015-08-14 18:44:44

标签: excel-vba sorting vba excel

我正在使用VBA中的ListObject个对象。特别是我动态创建一个表(可变数量的行和列,以及可变列标题)。我需要按升序字母顺序对表格的进行排序。

例如,如果我有桌子:

Unsorted Table

我希望它按照这样排序,

Sorted Table

有没有办法做到这一点?我尝试使用Range.Sort方法,但如果范围是ListObject的一部分,则似乎不允许这样做。

我还尝试录制一个宏来查找代码,但发现当我右键单击表对其进行排序时,所选范围会将标题排除,我无法选择“从左到右排序”选项。 ..

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这似乎有效。它采用表格的名称(例如"表1和#34;),将其转换为范围,对其进行排序,然后将其重新转换为具有相同名称的表格:

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

编辑时:我在sort方法调用周围添加了一些错误处理。实验表明我的原始代码没有保留样式(如果表格没有默认样式,那么结果是默认样式和原始表格样式的奇怪混合)。我添加了编码保存然后恢复原始表格样式,但我不太了解表格格式,可能错过了一些细微之处。至少,如果从Excel的内置表格样式列表中选择它,它似乎保留了样式。