对预选数据进行排序和小计

sort and subtotal preselected data

我正在处理一个工作表,其中某个时刻有一个成本列表。但是,此列表会发生变化,因此可以包含不同数量的行。我的最终目标是对成本清单进行排序然后小计。因为我要排序的行数和小计总是不同的,所以我想我可以制作一个宏,它只能处理预先 select 编辑的数据,例如用户 select 单元格范围为适用于排序和小计。我不能只处理所有活动单元格,因为有些行我不想包含在排序和小计中。

我录制了以下简单的宏来对数据进行排序和小计,但是,您会注意到它仅适用于我录制宏时 selected 的单元格。有谁知道如何修改宏,以便用户可以先用鼠标手动 select 单元格范围,然后单击一个按钮自动对预先 select 编辑的数据进行排序并对其进行小计?非常感谢任何帮助,谢谢。

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

如果您想获取所选范围,只需在VBA中请求Selection.Address即可。但是,我相信这假定选择是一个单元格块,因此这可能并不总是能给出所需的结果(例如,在选择多个范围的情况下)。另一种解决方案可能是将成本列表转换为 table。在您的宏中,您可以简单地引用一个命名范围,即新创建的 table 中的列。 table 将用作动态命名范围,并且始终包含其中的整个值范围。如果您可以确定成本列表下方没有数据,则第二个选项是检查存储成本列表的列中非空的最后一行。 .Cells(.Rows.Count, "A").End(xlUp).Row 之类的东西来获取包含列表的列的最后一行。

试试这个代码。这将允许用户使用输入框 select 范围。

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