Vba 创建具有多个功能的宏按钮?

Vba 创建具有多个功能的宏按钮?,vba,excel,sorting,Vba,Excel,Sorting,我正在尝试按名字和姓氏对excel工作表进行排序,我想知道是否可以将多个宏分配给一个按钮?假设我点击一次,它按名字排序;再次单击,它将按姓氏排序。这可能吗?我问,因为我找不到类似的问题 这是我的密码 名字 Columns ("D:D").Select ActiveWorkbook.Worksheets(Sheet1") .Sort.SortFields.clear ActiveWorkbook.Worksheets(Sheet1") .Sort.Sort

我正在尝试按名字和姓氏对excel工作表进行排序,我想知道是否可以将多个宏分配给一个按钮?假设我点击一次,它按名字排序;再次单击,它将按姓氏排序。这可能吗?我问,因为我找不到类似的问题

这是我的密码

名字

        Columns ("D:D").Select 
        ActiveWorkbook.Worksheets(Sheet1") .Sort.SortFields.clear
    ActiveWorkbook.Worksheets(Sheet1") .Sort.SortFields.Add Key:=Range("D1"), 
    Sorton::x=SortOnValues, Order:=xlDesending, DataOption:=xlSortNormal
    with ActiveWorkbook.Worksheets("sheet1") .Sort
    .SetRange Range("A1:K505")
    Header = X1No
    .MatchCase = False
    .Orientation = x1TopToBottom 
    .SortMethod = x1PinYin 
    .Apply

    End With
    ActiveWindow.SmallScroll Down:=-495

    End Sub

显然,另一个代码类似,但使用降序而不是升序。

您只需为状态设置一个全局变量,然后将其切换,使宏绑定到按钮,以执行不同的操作。(假设您希望在每次单击后切换按钮的功能)


您只需为状态设置一个全局变量,并将其切换,使宏绑定到按钮以执行不同的操作。(假设您希望在每次单击后切换按钮的功能)


一个按钮只能运行一个宏。但是,您可以让宏根据当前选择执行不同的操作。例如,如果用户在
Name
列中选择一个单元格,则按名称升序排序,如果选择在另一列中,则按名字降序排序

下面的代码设置排序键和相对于选择的排序顺序。因此,您不需要两个不同的宏

Sub SortByColumn()

    Dim Ws As Worksheet
    Dim Clm As Long
    Dim SortOrder As XlSortOrder

    With Selection
        Set Ws = .Worksheet
        Clm = .Column
        If Clm = 4 Then             ' column #4 = column D
            SortOrder = xlDescending
        Else
            ' sort on column 1 by default
            Clm = 1                 ' column #1 = column A
            SortOrder = xlAscending
        End If
    End With

    With Ws.Sort
        With .SortFields
            .Clear
            .Add Key:=Ws.Cells(1, Clm), _
                 Sorton:=xlSortOnValues, _
                 Order:=SortOrder, _
                 DataOption:=xlSortNormal
        End With

        .SetRange Ws.Range("A1:K505")
        .Header = X1No
        .MatchCase = False
        .Orientation = x1TopToBottom
        .SortMethod = x1PinYin
        .Apply
    End With

    ActiveWindow.SmallScroll Down:=-495
End Sub

请注意,排序操作不需要选择任何内容。

一个按钮只能运行一个宏。但是,您可以让宏根据当前选择执行不同的操作。例如,如果用户在
Name
列中选择一个单元格,则按名称升序排序,如果选择在另一列中,则按名字降序排序

下面的代码设置排序键和相对于选择的排序顺序。因此,您不需要两个不同的宏

Sub SortByColumn()

    Dim Ws As Worksheet
    Dim Clm As Long
    Dim SortOrder As XlSortOrder

    With Selection
        Set Ws = .Worksheet
        Clm = .Column
        If Clm = 4 Then             ' column #4 = column D
            SortOrder = xlDescending
        Else
            ' sort on column 1 by default
            Clm = 1                 ' column #1 = column A
            SortOrder = xlAscending
        End If
    End With

    With Ws.Sort
        With .SortFields
            .Clear
            .Add Key:=Ws.Cells(1, Clm), _
                 Sorton:=xlSortOnValues, _
                 Order:=SortOrder, _
                 DataOption:=xlSortNormal
        End With

        .SetRange Ws.Range("A1:K505")
        .Header = X1No
        .MatchCase = False
        .Orientation = x1TopToBottom
        .SortMethod = x1PinYin
        .Apply
    End With

    ActiveWindow.SmallScroll Down:=-495
End Sub

请注意,排序操作不需要选择任何内容。

这甚至可能不需要宏或按钮,具体取决于您的需要。如果将数据格式化为Excel表格(Home-->格式为表格),则可以直接使用筛选按钮对列进行排序。如果您正在构建一个需要独立控件(宏按钮等)的应用程序,那么您可能仍然希望使用表结构,以便可以根据需要动态添加/删除行和列。我个人更喜欢使用ListObjects(表在VBA中的表示方式)而不是范围,尤其是这样,您可以按名称访问列,更轻松地操作数据和结构……根据您的需要,这甚至可能根本不需要宏或按钮。如果将数据格式化为Excel表格(Home-->格式为表格),则可以直接使用筛选按钮对列进行排序。如果您正在构建一个需要独立控件(宏按钮等)的应用程序,那么您可能仍然希望使用表结构,以便可以根据需要动态添加/删除行和列。我个人更喜欢使用ListObjects(表在VBA中的表示方式)而不是范围,尤其是这样可以按名称访问列,更容易地操作数据和结构。。。