Excel VBA 多条件筛选 AdvancedFilter 汇总统计 sumproduct Range与Array交换

在日常工作中,面对Excel表格数据,为了分类进行统计,通过对表格数据筛选获取分类条目,再按条目实行汇总统计。要完成上面的工作,有人工操作和开发程序两种方法,本文通过一个有10000行数据的管线调查表,对不同管径、管材进行分类统计数量和长度,详细介绍人工操作和VBA程序开发这两种方法。

1、人工操作方法

1.1高级筛选

Excel菜单:数据-高级  找开高级筛选对话框,如下图:

对话框中:  方式:将筛选 结果复制到其他位置

列表区域: 选择需要筛选 的区域

复制到:筛选结果粘贴位置(没有数据的空白区域)

选择不重复的记录:打钩

确定后得到的结果如下图

1.2分类统计

在P2单元格输入公式:=SUMPRODUCT((H:H=N2)*(I:I=O2),L:L)

在Q2单元格输入公式:=SUMPRODUCT((H:H=N2)*(I:I=O2))

以此类推就可以计算出所有统计数据

2、VBA编程的方法

虽然人工操作方法也很方便,但当我们利用程序处理一系列复杂工作的同时,要进行分类统计时,就无法使用人工操作方法了。所以还要讨论一下编程的方法。利用Excel的VBA二次开发编写程序,实现多条件筛选分类统计可以有多种方法,本文介绍宏表函数法的数组法二种方法。

2.1宏表函数法

宏表函数法就是人工操作法录制宏,再对宏进行修改的方法。先做统计条目的筛选,对筛选结果进行排序,最后进行统计计算。代码如下:

Sub 多条件筛选汇总统计()  '利用宏表函数进行多条件筛选汇总统计用约:最大行设10000时0.1秒;用整列计算用时1.46秒
Dim 筛选数据区域 As Range
Dim 复制区域 As Range
Dim 总长 As Double
Sheets("Sheet1").Select
sngStart = Timer
Set 筛选数据区域 = Range(Cells(1, 8), Cells(10000, 9))
Range(Cells(1, 14), Cells(30, 17)).Clear
Set 目标区域 = Range(Cells(1, 14), Cells(1, 14))
筛选数据区域.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=目标区域, Unique:=True
'排序
With ActiveSheet.Sort.SortFields.Clear.SortFields.Add Key:=Range("N2:N10000"), SortOn:=0, Order:=1, DataOption:=0.SortFields.Add Key:=Range("O2:O10000"), SortOn:=0, Order:=1, DataOption:=0.SetRange Range("N2:O10000").Header = xlGuess.MatchCase = False.Orientation = xlTopToBottom.SortMethod = xlPinYin      'xlPinYin 表示按照首字母 排序   xlStroke 表示按每个字符的笔划数量排序。.Apply
End With
i = 2
Do While Cells(i, 14) <> ""   '利用宏表函数进行统计汇总'预先能知道最大值时,条件式及统计项均使用最大值,可提高运算速度,用时 0.1 秒Cells(i, 16) = "=SUMPRODUCT((R2C8:R20000C8=R" + Trim(str(i)) + "C14)*(R2C9:R20000C9=R" + Trim(str(i)) + "C15),R2C12:R20000C12)"Cells(i, 17) = "=SUMPRODUCT((R2C8:R20000C8=R" + Trim(str(i)) + "C14)*(R2C9:R20000C9=R" + Trim(str(i)) + "C15))"'预先不知道有多少行时,条件式及统计项均使用整列,会降低运算速度,用时 1.46 秒'Cells(i, 16) = "=SUMPRODUCT((C8:C8=R" + Trim(str(i)) + "C14)*(C9:C9=R" + Trim(str(i)) + "C15),C12:C12)"'Cells(i, 17) = "=SUMPRODUCT((C8:C8=R" + Trim(str(i)) + "C14)*(C9:C9=R" + Trim(str(i)) + "C15))"i = i + 1
Loop
Cells(i, 16) = WorksheetFunction.Sum(Range(Cells(2, 16), Cells(i - 1, 16)))
Cells(i, 17) = WorksheetFunction.Sum(Range(Cells(2, 17), Cells(i - 1, 17)))
Debug.Print "耗费时间: " & Timer - sngStart
Cells(1, 14) = "管径"
Cells(1, 15) = "材质"
Cells(1, 16) = "长度  m"
Cells(1, 17) = "数量"
Cells(i, 15) = "合计:"
End Sub

***利用宏表函数进行条件筛选的结果只能复制到工作表的区域内,无法利用变量接收。

理解宏表函数的语法对于宏表函数中动态地址的处理很重要,现在解释一下统计宏表函数的含义:

"=SUMPRODUCT((R2C8:R20000C8=R" + Trim(str(i)) + "C14)*(R2C9:R20000C9=R" + Trim(str(i)) + "C15),R2C12:R20000C12)"

上面这句代码其实就是一段符合宏表函数语法的字符串,他等同于下面的字符串。

=SUMPRODUCT((R2C8:R20000C8=R2C14)*(R2C9:R20000C9=R2C15),R2C12:R20000C12)

红色部份是一个查询条件,意思是:第8列的第二行到20000行=第14列第2行,也应是说(管径=“400”)

绿色部份也是一个查询条件,意思是:第9列的第二行到20000行=第15列第2行,也应是说(管材=“塑料”)

黄色部份是需要统计的区域,这时是统计符合条件的管线长度。

统计数量时,不需要统计区域。

***查询条件还可以更多,每个查询条件用小括号括起来,两个条件中间用“*”相连接。

***查询条件中,把数值转化为字符串,一定要去除两端的空串,如Trim(str(i)),否则会出错。

2.2数组法

数组法是纯编程的方法,创建动态数组,筛选出唯一的统计条目,同时进行数据的统计,最后对结果进行排序,使统计结果按排序的要求顺序输出,本例是升序。代码如下:

Sub 综合数组分类统计()    '数组排序用时约 0.14 秒,内置函数排序用时约 0.031秒。
Dim i As Integer, j As Integer
Dim 总长 As Double, 数量 As Integer
Dim str(3)
Dim DataV(), js As Integer
On Error Resume Next
Sheets("Sheet1").Select
Dim sngStart As Single: sngStart = Timer
'筛选并排序:管径分类,材质分类
js = 0
i = 2
Do While Cells(i, 1) <> ""For j = 1 To jsIf Cells(i, 8) = DataV(0, j) And Cells(i, 9) = DataV(1, j) ThenDataV(2, j) = DataV(2, j) + Cells(i, 12)DataV(3, j) = DataV(3, j) + 1GoTo 20End IfNextjs = js + 1ReDim Preserve DataV(3, js)DataV(0, js) = Cells(i, 8)DataV(1, js) = Cells(i, 9)DataV(2, js) = Cells(i, 12)DataV(3, js) = 1
20: i = i + 1
Loop'数组排序
Dim m1 As String, m2 As String
For i = 1 To jsFor j = 1 To js - 1m1 = DataV(0, j) + "|" + DataV(1, j)m2 = DataV(0, j + 1) + "|" + DataV(1, j + 1)If m1 > m2 Thenstr(0) = DataV(0, j): DataV(0, j) = DataV(0, j + 1): DataV(0, j + 1) = str(0)str(1) = DataV(1, j): DataV(1, j) = DataV(1, j + 1): DataV(1, j + 1) = str(1)str(2) = DataV(2, j): DataV(2, j) = DataV(2, j + 1): DataV(2, j + 1) = str(2)str(3) = DataV(3, j): DataV(3, j) = DataV(3, j + 1): DataV(3, j + 1) = str(3)End IfNext
Next
Range(Cells(1, 14), Cells(js + 1, 17)).Value = Application.Transpose(DataV)
Cells(js + 2, 16) = WorksheetFunction.Sum(Range(Cells(2, 16), Cells(i + 1, 16)))
Cells(i + 2, 17) = WorksheetFunction.Sum(Range(Cells(2, 17), Cells(i + 1, 17)))
Debug.Print "耗费时间: " & Format(Timer - sngStart, "0.0000000000")
Cells(1, 14) = "管径"
Cells(1, 15) = "材质"
Cells(1, 16) = "长度  m"
Cells(1, 17) = "数量"
Cells(i + 2, 15) = "合计:"
End Sub

Excel VBA 多条件筛选及汇总统计相关推荐

  1. Excel·VBA多条件筛选组合结果

    Function strTOF(str$) As Boolean'用于计算字符串判断True/False,默认返回False'适用vba比较运算符:速度比较慢,但通用Dim i&, j& ...

  2. Excel·VBA指定条件删除整行整列

    目录 1,删除工作表所有空行 2,删除工作表所有空列 3,删除选中单列包含指定字符的行 举例 3.1,改进版 4,删除选中单列不含指定字符的行 举例 5,删除选中列重复的整行 举例 6,删除选中列唯一 ...

  3. Excel·VBA自定义函数筛选单元格区域重复值

    贴吧提问<哪位大神知道要怎么实现?>,Excel内置函数使用比较麻烦,VBA字典实现比较直观 自定义函数UNIQUE_IF筛选单元格区域中的值,可以选择返回其中的唯一值或重复值,并用分隔符 ...

  4. Excel操作-多条件筛选

    一.背景 一般情况下,Excel多条件筛选,可以直接打开数据栏下的"筛选"功能,然后多值勾选即可. 但是如果可选项过多,通过多值勾选的方式实现多条件筛选就不现实了.这里可以通过使用 ...

  5. mongo 多条件筛选_excel成本统计:如何进行区域筛选,多条件求和?

    编按:哈喽,大家好!最近有位小伙伴被一个计算产品成本的问题难住了,要求是根据配件成本核算出成品的成本.这个问题看上去似乎有点复杂,感觉一下子想不出好的解决办法,实际上,却非常简单,而且仅用常见的求和函 ...

  6. 向内存中连续存入数据_实例35_在Excel中按条件筛选数据并存入新的表

    老板想要看去年每月领料数量大于1000的数据.手动筛选并复制粘贴出来,需要重复操作12次,实在太麻烦了,还是让Python来做吧.磨刀不误砍柴工,先整理一下思路: 1. 读取原表,将数量大于1000的 ...

  7. 在Excel中按条件筛选数据并存入新的表

    案例 老板想要看去年每月领料数量大于1000的数据.手动筛选并复制粘贴出来,需要重复操作12次,实在太麻烦了,还是让Python来做吧.磨刀不误砍柴工,先整理一下思路: 1·读取原表,将数量大于100 ...

  8. Access/VBA/Excel-多条件筛选数据-10

    微信公众号原文 系统:Windows 7 软件:Excel 2010 / Access 2010 这个系列开展一个新的篇章,重点关注Access数据库 主体框架:以Excel作为操作界面,Access ...

  9. Excel VBA 高级编程-跨表格多条件筛选

    大家好,我是陈小虾,是一名自动化方向的IT民工.写博客是为了记录自己的学习过程,通过不断输出倒逼自己加速成长.但由于水平有限,博客中难免会出现一些BUG,或者有更优方案恳请各位大佬不吝赐教!微信公众号 ...

最新文章

  1. 【学习笔记1】CentOS 下载
  2. mac PHP集成开发工具(PhpStorm)
  3. 恒生电子发布云计算金融应用“超云计划”
  4. WebAssembly,开发者赢了
  5. Java并发编程笔记之Semaphore信号量源码分析
  6. HTML中添加meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1
  7. Zabbix(二)通过API在zabbix系统中查看、删除及创建监控主机
  8. iOS 开发之玩转专场动画
  9. 图像处理与计算机视觉的论文创新点总结(二)
  10. 华为 U2000 网管系统 批量添加全网OLT设备TELNET账号
  11. 单网卡实现 双IP 双网段(内外网)同时运行
  12. 对于面试官的问答: 你在项目组里拿到一个项目是怎么开展的呢???
  13. 项目UML设计(团队)
  14. 微商公社新兵连第五天
  15. 存储结构和磁盘划分(基于RedHat7)
  16. Kotlin中的数据存储
  17. 计算机word铁路试题,计算机word试题含答案
  18. 人体姿态识别-pose estimation
  19. 花水木之DruParty: Drupal 水滴趴
  20. git 撤销上次提交 commit

热门文章

  1. 六、模块实现:用户管理模块(1)
  2. 二级建造师学python有用_终于清楚python入门最好的教程
  3. 图解刘谦如何手穿玻璃桌(详细图文说明)
  4. Thymeleaf th:each遍历,th:if、th:switch 条件判断,input,select,radio 回显赋值
  5. wan端口未连接怎么弄_路由器WAN口未连接解决方法,WAN口未连接怎么办
  6. MapReduce之Partition分区实例操作
  7. 华为RH2288H V3服务器 从拆箱开始安装系统
  8. 渗透测试-流量加密之冰蝎蚁剑
  9. 除了高额房贷,美国购房者仍面临其他“财政危机”
  10. 利用虚拟机virtualbox配置智汀家庭云,让米家设备连接Homekit