【问题标题】:Creating Macro button with multiple functions?创建具有多种功能的宏按钮?
【发布时间】:2017-12-29 12:28:43
【问题描述】:

我正在尝试按名字和姓氏对我的 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

显然其他代码是相似的,但降序而不是升序。

【问题讨论】:

  • 根据您的需要,这甚至可能根本不需要宏或按钮。如果您将数据格式化为 Excel 表格(主页 --> 格式化为表格),您可以使用过滤器按钮直接对列进行排序。如果您正在构建一个需要独立控件(宏按钮等)的应用程序,那么您可能仍希望使用表结构,以便您可以根据需要动态添加/删除行和列。我个人更喜欢使用 ListObjects(表如何在 VBA 中表示)而不是范围,特别是这样您就可以按名称访问列,更轻松地操作数据和结构...

标签: vba excel sorting


【解决方案1】:

您可以为状态设置一个全局变量并切换它以使绑定到按钮的宏执行不同的操作。 (这是假设您希望按钮的功能在每次点击后切换)

' global state variable
Dim State As Boolean

Private Sub Workbook_Open()
    ' initialize state
    State = True
End Sub

Sub mymacro()
    If State Then
        ' do stuff 1
    Else
        ' do stuff 2
    End If

    ' toggle state
    State = Not State
End Sub

【讨论】:

    【解决方案2】:

    一个按钮只能运行一个宏。但是,您可以让宏根据当前选择执行不同的操作。例如,如果用户在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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2021-01-29
      • 2012-11-10
      相关资源
      最近更新 更多