excel - 如何使用循环简化我的代码

标签 excel vba

我想获取一组数据的小计(平均值、最小值、最大值...)。我已经使用下面的代码实现了目标。如何使用循环来简化它?非常感谢!

Sub AddSubs()
    Worksheets("Summary (3)").Activate
    'http://msdn.microsoft.com/en-us/library/office/ff838166(v=office.15).aspx
    Selection.Subtotal GroupBy:=14, Function:=xlAverage, SummaryBelowData:=False, Replace:=False, PageBreaks:=True, TotalList:=Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
    Worksheets("Summary (3)").Activate
    Selection.Subtotal GroupBy:=14, Function:=xlStDev, SummaryBelowData:=False, Replace:=False, PageBreaks:=True, TotalList:=Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
    Worksheets("Summary (3)").Activate
    Selection.Subtotal GroupBy:=14, Function:=xlMin, SummaryBelowData:=False, Replace:=False, PageBreaks:=True, TotalList:=Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
    Worksheets("Summary (3)").Activate
    Selection.Subtotal GroupBy:=14, Function:=xlMax, SummaryBelowData:=False, Replace:=False, PageBreaks:=True, TotalList:=Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
    Worksheets("Summary (3)").Activate
    Selection.Subtotal GroupBy:=14, Function:=xlCount, SummaryBelowData:=False, Replace:=False, PageBreaks:=True, TotalList:=Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
End Sub

最佳答案

进一步我的评论。这是简化代码的一种方法

Sub AddSubs()
    Worksheets("Summary (3)").Activate

    Dim constList As Collection
    Set constList = New Collection

    constList.Add (xlAverage)
    constList.Add (xlStDev)
    constList.Add (xlMin)
    constList.Add (xlMax)
    constList.Add (xlCount)

    Dim cnst
    For Each cnst In constList
        Selection.Subtotal GroupBy:=14, Function:=cnst, SummaryBelowData:=False, Replace:=False, PageBreaks:=True, TotalList:=Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
    Next

End Sub

或者更简单(根据@simocos提示)

Sub Main()

    Dim cnst
    For Each cnst In Array(xlAverage, xlStDev, xlMin, xlMax, xlCount)
        Selection.Subtotal GroupBy:=14, Function:=cnst, SummaryBelowData:=False, Replace:=False, PageBreaks:=True, TotalList:=Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
    Next

End Sub

关于excel - 如何使用循环简化我的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22664828/

相关文章:

vba - 通过串口excel-vba发送字节数组失败

excel - 时间值 ("23:50")

vba - 在过滤的工作表中每行打印多个单元格值

vba - 用于运行和导出 Access 查询的 Excel VBA

excel - MS Excel 2012 - 如果等于其他值,则替换值

excel - 使用宏或添加项覆盖内置 Excel 函数

mysql - 通过 ADO 创建/编辑记录时索引 MySQL 字段不保存值

vba - 如何在activex框架上显示到前面

vba - 选择多个文件夹 - VBA

excel - 在 Excel 中的合并单元格上键入错误以显示消息功能