对预选数据进行排序和小计
Posted
技术标签:
【中文标题】对预选数据进行排序和小计【英文标题】:sort and subtotal preselected data 【发布时间】:2017-02-07 11:23:03 【问题描述】:我正在处理一个工作表,其中的某个时间点有一个成本清单。但是,此列表会发生变化,因此可以有不同数量的行。我的最终目标是对这份成本清单进行分类然后小计。因为我想要排序和小计的行数总是不同的,所以我想我可以制作一个只能使用预选数据的宏,例如用户选择要应用的单元格范围进行排序和小计。我不能只处理所有活动单元格,因为有些行我不想包含在排序和小计中。
我已经录制了以下简单的宏来对数据进行排序和小计,但是,您会注意到它仅适用于我录制宏时选择的单元格。有谁知道如何修改宏,以便用户可以首先用鼠标手动选择单元格范围,然后单击一个按钮,自动对预选的数据进行排序并对其进行小计?非常感谢任何帮助,谢谢。
Sub Sort_and_Subtotal_CheckBox()
ActiveWorkbook.Worksheets("dummy").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("dummy").AutoFilter.Sort.SortFields.Add Key:=Range( _
"B151:B159"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("dummy").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B151:K156").Select
Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(10), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=True
End Sub
【问题讨论】:
【参考方案1】:试试这个代码。这将允许用户使用输入框选择范围。
Dim SortRng As Range
Set SortRng = Application.InputBox("Select the range to sort", "Select Range", 0, , , , , 8)
SortRng.Select
Selection.Sort Key1:=SortRng, Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("A1").Select
【讨论】:
除Sub Sort_and_Subtotal_CheckBox()
和End Sub
外,完全删除您的代码并使用我的代码。运行宏时,您将看到一个输入框。看到输入框后,可以在里面输入范围,也可以点击拖拽选择范围。
你能展示你的数据样本和你想要达到的结果吗?
如果我的回答对你有帮助,你能接受吗?【参考方案2】:
如果您想获得选定的范围,您可以简单地在 VBA 中请求Selection.Address
。但是,我相信这假设选择是一个单元格块,因此这可能并不总是给出所需的结果(例如,在多个选定范围的情况下)。另一种解决方案可能是将成本列表转换为表格。然后,在您的宏中,您可以简单地引用一个命名范围,即新创建的表中的列。该表将作为动态命名范围工作,并将始终包含其中的整个值范围。如果您可以确定成本列表下方没有数据,则第二种选择是检查存储成本列表的列中非空的最后一行。 .Cells(.Rows.Count, "A").End(xlUp).Row
之类的东西来获取包含列表的列的最后一行。
【讨论】:
以上是关于对预选数据进行排序和小计的主要内容,如果未能解决你的问题,请参考以下文章