排序和小计预选数据

时间:2017-02-07 11:23:04

标签: excel vba excel-vba 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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

 public class MyList<T> : IEnumerable<T>
{
    private T[] arr;

    public int Count
    {
        get { return arr.Length; }
    }            
public void Reverse()
    {
        T[] newArr = arr;
        arr = new T[Count];
        int number = Count - 1;
        for (int i = 0; i < Count; i++)
        {
            arr[i] = newArr[number];
            number--;
        }
    }
}