在EXCEL中实现对数据的过滤统计
2009-06-02 18:42
246 查看
在EXCEL中对数据进行汇总统计是工作中经常会使用的,不过通常的汇总统计是针对一行或一列中的所有数据进行的,此时通过统计函数可以方便简单地完成对数据的汇总统计工作。但是,有时候也会需要先对数据进行过滤,然后再对过滤后的数据进行统计。
例如有如下数据:
如果我们需要计算所有人的成绩的平均值,使用AVERAGE(C2:C5)就很容易计算出结果,但是,如果我们需要分别计算男生或女生的平均分如何来实现呢?
方案一:使用SUBTOTAL函数
SUBTOTAL函数可以返回列表或数据库中的分类汇总,其语法形式如下:
SUBTOTAL(function_num, ref1, ref2, ...)
它的第一个参数function_num为 1 到 11(包含隐藏值)或 101 到 111(忽略隐藏值)之间的数字,指定使用何种函数在列表中进行分类汇总计算。而这些数值的含义如下表所示:
那么我们可以使用SUBTOTAL(1,C2:C5)或SUBTOTAL(101,C2:C5)的形式来统计C2到C5之间数据的平均值了。在不隐藏任何行的情况下,这两种形式的调用得到的结果与AVERAGE(C2:C5)是完全一样的。根据SUBTOTAL函数的说明,当这些数据中有隐藏数据时,其结果应当有所不同。
我们将第4行的数据隐藏,然后可以看到SUBTOTAL(1,C2:C5)的结果为依然为86.75,而SUBTOTAL(101,C2:C5)的结果为83.33333。也就是说,SUBTOTAL的第一个参数是101时不再考虑隐藏的数据。
然而,对于上例,我们需要的是统计男生或女生的平均分,为了达到目的,当然可以在计算男生平均分时将所有女生的信息隐藏,但是在数据量比较大时,隐藏女生数据将成为比较烦琐的工作,而且,在需要计算男生平均分时还需要取消女生信息的隐藏。
通常我们是使用数据的筛选功能快速筛选数据,但是使用筛选过滤掉的数据并没有被隐藏,那么它对SUBTOTAL函数又会带来什么影响呢?筛选男生后的数据及SUBTOTAL(1,C2:C5)与SUBTOTAL(101,C2:C5)的结果如下:
通过结果可以看出,显然SUBTOTAL在计算时只计算了过滤后显示出来的数据,而这正是我们的想要的结果。
方案二:使用VBA脚本
VBA提供了在OFFICE中的编程能力,因此使用VBA可以实现很多通常会认为难以完成的任务,对于本例,可以编写以下VBA脚本:
Public Sub test()
Dim i As Integer
Dim c As Integer
Dim s As Double
c = 0
s = 0
For i = 2 To 5
If Sheet1.Range("B" & CStr(i)).Value = "男" Then
s = s + Sheet1.Range("C" & CStr(i)).Value
c = c + 1
End If
Next
Sheet1.Range("B13") = "VBA结果:"
Sheet1.Range("C13") = Round(s / c, 2)
End Sub
脚本编写完成后运行之,可以在EXCEL当前SHEET页的C13单元格处看到统计结果。
用过一段时间VBA以后,发现以前总想以程序员的角度写一个小软件完成的很多功能实际上直接通过VBA就可以方便完成,从办公的角度,VBA还真是一个高效的工具。
例如有如下数据:
如果我们需要计算所有人的成绩的平均值,使用AVERAGE(C2:C5)就很容易计算出结果,但是,如果我们需要分别计算男生或女生的平均分如何来实现呢?
方案一:使用SUBTOTAL函数
SUBTOTAL函数可以返回列表或数据库中的分类汇总,其语法形式如下:
SUBTOTAL(function_num, ref1, ref2, ...)
它的第一个参数function_num为 1 到 11(包含隐藏值)或 101 到 111(忽略隐藏值)之间的数字,指定使用何种函数在列表中进行分类汇总计算。而这些数值的含义如下表所示:
Function_num (包含隐藏值) | Function_num (忽略隐藏值) | 函数 |
1 | 101 | AVERAGE |
2 | 102 | COUNT |
3 | 103 | COUNTA |
4 | 104 | MAX |
5 | 105 | MIN |
6 | 106 | PRODUCT |
7 | 107 | STDEV |
8 | 108 | STDEVP |
9 | 109 | SUM |
10 | 110 | VAR |
11 | 111 | VARP |
那么我们可以使用SUBTOTAL(1,C2:C5)或SUBTOTAL(101,C2:C5)的形式来统计C2到C5之间数据的平均值了。在不隐藏任何行的情况下,这两种形式的调用得到的结果与AVERAGE(C2:C5)是完全一样的。根据SUBTOTAL函数的说明,当这些数据中有隐藏数据时,其结果应当有所不同。
我们将第4行的数据隐藏,然后可以看到SUBTOTAL(1,C2:C5)的结果为依然为86.75,而SUBTOTAL(101,C2:C5)的结果为83.33333。也就是说,SUBTOTAL的第一个参数是101时不再考虑隐藏的数据。
然而,对于上例,我们需要的是统计男生或女生的平均分,为了达到目的,当然可以在计算男生平均分时将所有女生的信息隐藏,但是在数据量比较大时,隐藏女生数据将成为比较烦琐的工作,而且,在需要计算男生平均分时还需要取消女生信息的隐藏。
通常我们是使用数据的筛选功能快速筛选数据,但是使用筛选过滤掉的数据并没有被隐藏,那么它对SUBTOTAL函数又会带来什么影响呢?筛选男生后的数据及SUBTOTAL(1,C2:C5)与SUBTOTAL(101,C2:C5)的结果如下:
通过结果可以看出,显然SUBTOTAL在计算时只计算了过滤后显示出来的数据,而这正是我们的想要的结果。
方案二:使用VBA脚本
VBA提供了在OFFICE中的编程能力,因此使用VBA可以实现很多通常会认为难以完成的任务,对于本例,可以编写以下VBA脚本:
Public Sub test()
Dim i As Integer
Dim c As Integer
Dim s As Double
c = 0
s = 0
For i = 2 To 5
If Sheet1.Range("B" & CStr(i)).Value = "男" Then
s = s + Sheet1.Range("C" & CStr(i)).Value
c = c + 1
End If
Next
Sheet1.Range("B13") = "VBA结果:"
Sheet1.Range("C13") = Round(s / c, 2)
End Sub
脚本编写完成后运行之,可以在EXCEL当前SHEET页的C13单元格处看到统计结果。
用过一段时间VBA以后,发现以前总想以程序员的角度写一个小软件完成的很多功能实际上直接通过VBA就可以方便完成,从办公的角度,VBA还真是一个高效的工具。
相关文章推荐
- Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
- Excel 使用技巧之 -- 统计、过滤与引用数据
- 用Jxl实现将统计数据导出到excel表中
- 利用excel数据透视表实现快速统计相关数据
- Excel 使用技巧之 -- 统计、过滤与引用数据
- 利用 GROUP BY 和 MAX 实现对表数据分组统计后的过滤查询(Oracle920)
- 使用Matlab从Excel中读取数据并实现回归统计计算
- 用 python实现简单EXCEL数据统计
- 用python实现简单EXCEL数据统计的实例
- php实现excel导入数据
- 将excel文件中的商品数据导入到数据库,并实现相关检索以及模糊搜索功能
- 网站统计中的数据收集原理及实现-埋点统计
- 反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射
- Python实现从excel读取数据并绘制成精美图像
- 采用ngxtop实现nginx实时访问数据统计
- python初学―-实现excel里面读数据进行排序
- java实现各种数据统计图(柱形图,饼图,折线图)
- PHP实现数据库统计时间戳按天分组输出数据的方法
- java简单实现爬虫、jsoup实现网页抓取、POI实现数据导出Excel
- Excel在统计分析中的应用—第二章—描述性统计-分组数据的方差求解方法