我正在使用VBA中的ListObject
个对象。特别是我动态创建一个表(可变数量的行和列,以及可变列标题)。我需要按升序字母顺序对表格的列进行排序。
例如,如果我有桌子:
我希望它按照这样排序,
有没有办法做到这一点?我尝试使用Range.Sort
方法,但如果范围是ListObject
的一部分,则似乎不允许这样做。
我还尝试录制一个宏来查找代码,但发现当我右键单击表对其进行排序时,所选范围会将标题排除,我无法选择“从左到右排序”选项。 ..
有什么想法吗?
答案 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的内置表格样式列表中选择它,它似乎保留了样式。