热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在EXCEL中实现对数据的过滤统计

在EXCEL中对数据进行汇总统计是工作中经常会使用的,不过通常的汇总统计是针对一行或一列中的所有数据进行的,此时通过统计函数可以方便简单地完成对数据的汇总统计工作。但是,有时候也会需要先对

      EXCEL中对数据进行汇总统计是工作中经常会使用的,不过通常的汇总统计是针对一行或一列中的所有数据进行的,此时通过统计函数可以方便简单地完成对数据的汇总统计工作。但是,有时候也会需要先对数据进行过滤,然后再对过滤后的数据进行统计。

     例如有如下数据:

 原始数据

如果我们需要计算所有人的成绩的平均值,使用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)的形式来统计C2C5之间数据的平均值了。在不隐藏任何行的情况下,这两种形式的调用得到的结果与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还真是一个高效的工具。


推荐阅读
author-avatar
雨含的晴天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有