对表中给定范围内的行进行排序

问题描述 投票:0回答:2

我正在尝试在删除条目后对表格进行排序。

Function last_row(sheet_name,col_to_check)
    If sheet_name = "wl" Then
        Set ws = Sheets("Membership Waiting List")
        table_name = "waiting_list"
    ElseIf 'this part is for other sheet names so will omit.
    End If

    last_row = ws.ListObjects(table_name).Range.Columns(col_to_check).Cells.Find("*", 
    SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End Function


Sub remove_and_refund()
    Dim wl As Worksheet
    Set wl = Sheets("Membership Waiting List")

    w_last_row = last_row("wl",1) ' confirmed this gives the expected value

    ' code to remove entry is omitted but would be here

    wl.Range("A3", "L" & w_last_row).Sort Key1:=wl.Range("A3", "A" & w_last_row), 
    Order1:=xlAscending 
    ' confirmed that the two ranges are correct by using .Select 
End Sub

问题是子在排序中包含

A2:L2
中的表格标题。

我已经对其他工作表中的表格使用了这种方法,但没有遇到这个问题,所以我认为这与范围是表格无关。

excel vba
2个回答
1
投票

无需查找最后一行,只需使用

ListColumns
名称或位置即可。

在第一个过程中,我使用了列位置

.ListColumns(1)
,在第二个过程中,我使用了名称
.ListColumns("H4")

Public Sub Test()

    With ThisWorkbook.Worksheets("Membership Waiting List").ListObjects("waiting_list")
        .Range.Sort _
            Key1:=.ListColumns(1), _
            Order1:=xlAscending, _
            Header:=xlYes, _
            OrderCustom:=1, _
            MatchCase:=False, _
            Orientation:=xlTopToBottom
    End With

End Sub  

或者此方法会将排序的指标(不确定技术名称)添加到过滤器按钮:

Public Sub Test1()
    With ThisWorkbook.Worksheets("Membership Waiting List").ListObjects("waiting_list")
        .Sort.SortFields.Clear
        .Sort.SortFields.Add2 _
            Key:=.ListColumns("H4").Range, _
            SortOn:=xlSortOnValues, _
            Order:=xlAscending, _
            DataOption:=xlSortTextAsNumbers
            
        .Sort.Header = xlYes
        .Sort.MatchCase = False
        .Sort.Orientation = xlTopToBottom
        .Sort.Apply
    End With
End Sub  

编辑:第二个过程使用

Add2
,但只需
Add
就可以了。

SortFields.Add2 方法
创建一个新的排序字段并返回一个 SortFields 对象,该对象可以 可选择使用定义的子字段对数据类型进行排序。


0
投票

我不知道是什么导致了这个问题,但我找到了使用表排序方法的解决方法。上面代码的最后一行已替换为:

With wl.ListObjects("waiting_list").Sort
    .SortFields.Add Key:=Range("A3", "A" & w_last_row), Order:=xlAscending
    .Header = xlYes
    .Apply
End With
© www.soinside.com 2019 - 2024. All rights reserved.