Excel 在Userform条目之后重复活动筛选器

Excel 在Userform条目之后重复活动筛选器,excel,vba,userform,Excel,Vba,Userform,我有一个宏,根据“联系日期”、“存款”和“信用”对客户进行排序。假设我选择按“联系日期”排序,然后将新客户添加到我的列表中,在我从用户表单中输入新客户后,如何重新运行活动排序 用于添加客户端数据的Userform 过滤器选项 这是我的密码: 贷方余额排序 联系日期排序 存款余额分类 您展示的小代码是非常冗余的—通过将硬编码的Key1sort参数设置为参数,您可以立即消除对这三个克隆中两个克隆的需要,并重新调整第三个克隆的用途以完成这三个克隆的工作 当您的范围是ListObjectaka“ta

我有一个宏,根据“联系日期”、“存款”和“信用”对客户进行排序。假设我选择按“联系日期”排序,然后将新客户添加到我的列表中,在我从用户表单中输入新客户后,如何重新运行活动排序

用于添加客户端数据的Userform

过滤器选项

这是我的密码:

贷方余额排序

联系日期排序

存款余额分类


您展示的小代码是非常冗余的—通过将硬编码的
Key1
sort参数设置为参数,您可以立即消除对这三个克隆中两个克隆的需要,并重新调整第三个克隆的用途以完成这三个克隆的工作

当您的范围是
ListObject
aka“table”时,排序和应用排序非常容易。在您的范围内,从主功能区中选择“格式为表格”。现在你再也不需要计算最后一行了

此外,如果编译时
wss(w)
工作表存在于
此工作簿中
,则没有理由将其从
工作表
集合中取消引用-只需使用其代码名标识符(您可以通过在Project Explorer/Ctrl+R中选择工作表,然后更改其
(名称)来更改它)
属性工具窗口中的属性/F4)-然后您可以执行表名.Range(“任意”)。或者更好-因为该代码只需要在特定的工作表上工作,所以将其放在该工作表的代码后面,并使用
Me
引用
工作表
实例:

Public Sub ApplySortOrder(Optional ByVal sortColumn As String = vbNullString)

    With Me.ListObjects(1)

        Dim sortColumnRange As Range
        If sortColumn <> vbNullString Then
            'assumes sortColumn is an existing column header
            Set sortColumnRange = .ListColumns(sortColumn).DataBodyRange
        End If
        With .Sort
            If Not sortColumnRange Is Nothing Then
                .SortFields.Clear
                .SortFields.Add sortColumnRange
            End If
            .Apply
        End With
    End With

End Sub
按联系人日期排序将是:

TheSheetName.ApplySortOrder "ContactDate"
按贷方余额排序:

TheSheetName.ApplySortOrder "CreditBalance"
如果要重新应用当前排序,请执行以下操作:

TheSheetName.ApplySortOrder
当您需要按其他内容进行排序时,您可以执行以下操作:

TheSheetName.ApplySortOrder "ThatFancyNewColumn"
并且可以用它来完成,而不需要复制粘贴另一个过程

您甚至可以为有效列声明一个
公共枚举

Public Enum SortingColumn
    Current = 0
    CreditBalance = 97
    DepositBalance = 68
    ContactDate = 2
End Enum
然后将签名更改为接受
排序列
参数:

Public Sub ApplySortOrder(Optional ByVal sortColumn As SortingColumn = Current)

    With Me.ListObjects(1)

        Dim sortColumnRange As Range
        If sortColumn <> Current Then
            'assumes sortColumn is an existing column header
            Set sortColumnRange = .ListColumns(sortColumn).DataBodyRange
        End If
        With .Sort
            If Not sortColumnRange Is Nothing Then
                .SortFields.Clear
                .SortFields.Add sortColumnRange
            End If
            .Apply
        End With
    End With

End Sub
Public子应用程序排序顺序(可选ByVal sortColumn As SortingColumn=Current)
与我一起。ListObjects(1)
变暗sortColumnRange As Range
如果是sortColumn电流,则
'假定sortColumn是现有的列标题
设置sortColumnRange=.ListColumns(sortColumn).DataBodyRange
如果结束
用。排序
如果不是sortColumnRange则为Nothing
.SortFields.Clear
.SortFields.Add sortColumnRange
如果结束
.申请
以
以
端接头

或者更好的办法是,省去显式枚举值,将每个值映射到一个字符串列名,然后编写一个函数,为它获取
ListColumn.Index
,这样用户就不能重命名标题,但他们仍然可以随意移动这些90多个列。。。但我想这是另一篇文章。

你试过
.Sort.Apply
?如果你使用了 ListObjs<代码> AKA“表”,那么你的生活会容易得多——如果你的数据是按行和列排列的,考虑“格式为表”,那么你不需要计算<代码>范围>代码>,只要按名称获取表即可;
dataodyrange
为您获取表体的
范围
ListRows
允许您迭代行,等等@mathieu guindon我将把代码放在哪里?我不知道-不清楚当前排序在哪里以及如何调用。如果您想在点击[保存客户端数据]后重新应用当前排序,那么它就是这样做的……哦,刚刚实现了
。排序
,因为属性是
列表对象
的成员。等等,在路上回答。@mathieu guindonthanks@Jose我的荣幸!我添加了一些内容,以解决以下事实:列名在代码中是“神奇的字符串”,容易出现打字错误-使用枚举,您可以获得intellisense,编译器使用
选项Explicit
=)
TheSheetName.ApplySortOrder
TheSheetName.ApplySortOrder "ThatFancyNewColumn"
Public Enum SortingColumn
    Current = 0
    CreditBalance = 97
    DepositBalance = 68
    ContactDate = 2
End Enum
Public Sub ApplySortOrder(Optional ByVal sortColumn As SortingColumn = Current)

    With Me.ListObjects(1)

        Dim sortColumnRange As Range
        If sortColumn <> Current Then
            'assumes sortColumn is an existing column header
            Set sortColumnRange = .ListColumns(sortColumn).DataBodyRange
        End If
        With .Sort
            If Not sortColumnRange Is Nothing Then
                .SortFields.Clear
                .SortFields.Add sortColumnRange
            End If
            .Apply
        End With
    End With

End Sub