Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 对预选数据进行排序和小计_Vba_Excel_Sorting_Subtotal - Fatal编程技术网

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

Vba 对预选数据进行排序和小计,vba,excel,sorting,subtotal,Vba,Excel,Sorting,Subtotal,我正在处理一份工作表,其中有一份成本清单。但是,此列表会更改,因此可以有不同数量的行。我的最终目标是对成本清单进行排序,然后进行小计。因为我要排序和小计的行数总是不同的,所以我想我可以制作一个宏,只处理预选的数据,例如用户选择要排序和小计的单元格范围。我不能只处理所有活动单元格,因为有些行我不想包含在排序和小计中 我录制了以下简单的宏来对数据进行排序和小计,但是,您会注意到,它仅适用于录制宏时选择的单元格。是否有人知道如何修改宏,以便用户可以先用鼠标手动选择单元格范围,然后单击一个按钮,自动对预

我正在处理一份工作表,其中有一份成本清单。但是,此列表会更改,因此可以有不同数量的行。我的最终目标是对成本清单进行排序,然后进行小计。因为我要排序和小计的行数总是不同的,所以我想我可以制作一个宏,只处理预选的数据,例如用户选择要排序和小计的单元格范围。我不能只处理所有活动单元格,因为有些行我不想包含在排序和小计中

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

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
。但是,我认为这是假设选择是一个单元格块,因此这可能并不总是给出期望的结果(例如,在多个选定范围的情况下)。另一种解决方案可能是将成本列表转换为表。在宏中,您可以简单地引用一个命名范围,即新创建的表中的列。该表将作为一个动态命名范围工作,并将始终包含其中的整个值范围。如果可以确保成本列表下没有数据,第二个选项是检查存储成本列表的列中最后一行不为空。类似于
.Cells(.Rows.Count,“A”).End(xlUp).Row的内容,以获取包含列表的列的最后一行。

请尝试此代码。这将允许用户使用输入框选择范围

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

完全删除您的代码,但“子排序”和“小计”复选框()除外。
和“结束子排序”并使用“我的代码”。运行宏时,将看到一个输入框。一旦您看到输入框,您可以在其中输入范围,也可以通过单击并拖动来选择范围。您可以显示您的数据示例以及您尝试实现的结果吗?如果我的答案对您有所帮助,您可以接受吗?