Vba 创建具有多个功能的宏按钮?
我正在尝试按名字和姓氏对excel工作表进行排序,我想知道是否可以将多个宏分配给一个按钮?假设我点击一次,它按名字排序;再次单击,它将按姓氏排序。这可能吗?我问,因为我找不到类似的问题 这是我的密码 名字Vba 创建具有多个功能的宏按钮?,vba,excel,sorting,Vba,Excel,Sorting,我正在尝试按名字和姓氏对excel工作表进行排序,我想知道是否可以将多个宏分配给一个按钮?假设我点击一次,它按名字排序;再次单击,它将按姓氏排序。这可能吗?我问,因为我找不到类似的问题 这是我的密码 名字 Columns ("D:D").Select ActiveWorkbook.Worksheets(Sheet1") .Sort.SortFields.clear ActiveWorkbook.Worksheets(Sheet1") .Sort.Sort
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中的表示方式)而不是范围,尤其是这样可以按名称访问列,更容易地操作数据和结构。。。