+ -
当前位置:首页 → 问答吧 → 用VBA进行筛选后统计

用VBA进行筛选后统计

时间:2011-08-03

来源:互联网

请各位师傅指点如何利用VBA对数据进行筛选后求平均值等。谢谢

附件

统计.rar(8.25 KB)

2011-8-3 10:58, 下载次数: 8

作者: tchenhen   发布时间: 2011-08-03

不需要用VBA,用SUBTOTAL函数就可以。
B列平均值   "=SUBTOTAL(1,B2:B192)"
C列标准偏差 "=SUBTOTAL(7,B2:B192)"


SUBTOTAL使用方法,参阅
http://club.excelhome.net/viewth ... d=912478#pid5015266

VBA代码
筛选后自动在199:200行显示结果
复制内容到剪贴板
代码:
Sub TEST()
With Sheets("统计")
    For i = 2 To 9
        .Cells(199, i) = Application.WorksheetFunction.Subtotal(1, .Range(.Cells(2, i), .Cells(192, i)))    '平均值
        .Cells(200, i) = Application.WorksheetFunction.Subtotal(7, .Range(.Cells(2, i), .Cells(192, i)))    '标准偏差
    Next i
End With
End Sub
[ 本帖最后由 mineshine 于 2011-8-3 11:49 编辑 ]

作者: mineshine   发布时间: 2011-08-03

复制内容到剪贴板
代码:
Sub yy()
Dim Arr, i&, j&, d, k, t, d1, t1, Brr
Set d = CreateObject("Scripting.Dictionary")
Set d1 = CreateObject("Scripting.Dictionary")
Arr = [a1].CurrentRegion
For j = 2 To UBound(Arr, 2)
    For i = 2 To UBound(Arr)
        If Arr(i, j) <> "" Then
            d(Arr(i, 1)) = d(Arr(i, 1)) + 1
            d1(Arr(i, 1)) = d1(Arr(i, 1)) + Arr(i, j)
        End If
    Next
    k = d.keys
    t = d.items: t1 = d1.items
    ReDim Brr(1 To d.Count)
    For ii = 0 To UBound(k)
        Brr(ii + 1) = t1(ii) / t(ii)
    Next
    Cells(UBound(Arr) + 2, j).Resize(d.Count, 1) = Application.Transpose(Brr)
    d.RemoveAll: d1.RemoveAll
Next
Cells(UBound(Arr) + 2, 1).Resize(UBound(k) + 1, 1) = Application.Transpose(k)
End Sub

作者: 蓝桥玄霜   发布时间: 2011-08-03

版主的宏可执行,有点还请修改,就是最好我选择日期后,再运行宏之后,数值在最下面单元格显示出来。再次感谢!

作者: tchenhen   发布时间: 2011-08-03

请见附件。
点选A列任一日期即可。

附件

统计0803.rar(12.5 KB)

2011-8-3 13:37, 下载次数: 6

作者: 蓝桥玄霜   发布时间: 2011-08-03

非常感谢各位师傅的指点!

作者: tchenhen   发布时间: 2011-08-03