ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 27457|回复: 53

[原创] 跨工作表根据月份智能求和(增加了透视表方法)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-5-20 22:14 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:多表合并和汇总
本帖最后由 wshcw 于 2013-9-12 12:25 编辑

我猜我以下要写的内容值一个技术分?哈哈,先不扯,直接步入正题:

在做汇总统计工作中,习惯上可能经常以12个月份命名工作表,然后在《汇总》表中做统计:
对于单个单元格的统计:

  1. =SUM('1月份:12月份'!B2)
复制代码
对于单个项目的统计:
  1. =SUM('1月份:11月份'!B2:B16)
复制代码
但是如何能够更快捷的只统计其中某几个月份呢?
比如只选取4-6月份?设定M2与M3单元格就是月份选择,分别为4月份和6月份。
常规的想法就是使用INDIRECT。常规的写法如下:

  1. =SUM(N(INDIRECT($M$3&":"&$M$4&"!B2")))
  2. =SUM(N(INDIRECT($M$3&":"&$M$4&"!B2:B16")))
复制代码
但是怎么处理仍然不能成功。不管是piny版主的IF+N+INDEX,还是胡剑版主的“大颗粒”,我都没有试验成功。
后来换了一个办法,竟然发现成功了,可详细参考附件:

  1. =SUM(N(INDIRECT(ROW(INDIRECT(TRIM(LEFTB($M$3,2))&":"&TRIM(LEFTB($M$4,2))))&"月份!"&CHAR(64+COLUMN())&ROW())))
复制代码
  1. =SUM(N(INDIRECT(ROW(INDIRECT(TRIM(LEFTB($M$3,2))&":"&TRIM(LEFTB($M$4,2))))&"月份!"&CHAR(64+COLUMN(B:B))&TRANSPOSE(ROW($2:$16)))))
复制代码
跨工作表.png
后来仔细解读了一下式子,将其中的:
ROW(INDIRECT(TRIM(LEFTB($M$3,2))&":"&TRIM(LEFTB($M$4,2))))
这一部分抹黑,然后点F9,得到以下结果:
{4;5;6}
结合前后的公式计算行成以下式子:

  1. =SUM(N(INDIRECT({4;5;6}&"月份!"&{"B2"})))
复制代码
进一步变成:
  1. =SUM(N(INDIRECT({"4月份!B2";"5月份!B2";"6月份!B2"})))
复制代码
通过上式可以看出来:
在跨工作表的三维引用上,INDIRECT并不识别"4月份:6月份"的形式;
要把这些一个个罗列出来,形成{"4月份";"5月份";"6月份"},从这个角度说明INDIRECT是可以接数组函数的。



补充内容 (2013-7-24 10:10):
16楼增加“数据透视表”操作方式,请参考。

补充内容 (2013-8-2 13:45):
http://club.excelhome.net/forum. ... 1019239&pid=7083284

补充内容 (2013-9-12 11:27):
在本帖23楼增加通过Subtotal解决四维引用求和计算问题。Subtotal是个神奇的东西。
http://club.excelhome.net/forum. ... 1019239&pid=7190381
当在三维上求和时,Subtotal是个神奇的东东:
对于整个区域的汇总:

  • =SUM(SUBTOTAL(9,INDIRECT(ROW(INDIRECT(TRIM(LEFTB($M$3,2))&":"&TRIM(LEFTB($M$4,2))))&"月份!"&"B2:F16")))

复制代码

同时扩展,通过Subtotal可以求得平均值、数字个数、非空单元格数、最大值、最小值:

  • =AVERAGE(SUBTOTAL(1,INDIRECT(ROW(INDIRECT(TRIM(LEFTB($M$3,2))&":"&TRIM(LEFTB($M$4,2))))&"月份!"&"B2:F16")))
  • =SUM(SUBTOTAL(2,INDIRECT(ROW(INDIRECT(TRIM(LEFTB($M$3,2))&":"&TRIM(LEFTB($M$4,2))))&"月份!"&"B2:F16")))
  • =SUM(SUBTOTAL(3,INDIRECT(ROW(INDIRECT(TRIM(LEFTB($M$3,2))&":"&TRIM(LEFTB($M$4,2))))&"月份!"&"B2:F16")))
  • =MAX(SUBTOTAL(4,INDIRECT(ROW(INDIRECT(TRIM(LEFTB($M$3,2))&":"&TRIM(LEFTB($M$4,2))))&"月份!"&"B2:F16")))
  • =MIN(SUBTOTAL(5,INDIRECT(ROW(INDIRECT(TRIM(LEFTB($M$3,2))&":"&TRIM(LEFTB($M$4,2))))&"月份!"&"B2:F16")))

复制代码

2013-9-12 11:23 上传
下载附件 (53.51 KB)



跨工作表根据月份智能求和(增加Subtotal汇总及透视表法).zip (42.98 KB, 下载次数: 0)

跨工作表根据月份智能求和.zip

27.5 KB, 下载次数: 752

跨工作表根据月份智能求和(增加透视表方法).zip

43.42 KB, 下载次数: 605

评分

8

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-20 22:16 | 显示全部楼层
楼主,正对这个函数一筹莫展,及时雨呀!谢谢!

TA的精华主题

TA的得分主题

发表于 2013-5-20 22:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-5-20 22:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习了,感谢楼主的分亨

TA的精华主题

TA的得分主题

发表于 2013-5-20 23:12 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-21 13:21 | 显示全部楼层
小雨点沙沙响 发表于 2013-5-20 22:16
楼主,正对这个函数一筹莫展,及时雨呀!谢谢!

源引自胡剑版主的一句话:INDIRECTt具有剥离 引号 的作用

胡剑版主关于INDIRECT的精彩基础讲解:
http://club.excelhome.net/forum.php?mod=viewthread&tid=618433

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-21 13:23 | 显示全部楼层
人事难料 发表于 2013-5-20 23:12
留名学习中,正抓耳挠腮着呢。

对indirect的基础学习,可以参考胡剑版主关于INDIRECT的精彩基础讲解:
http://club.excelhome.net/forum.php?mod=viewthread&tid=618433

TA的精华主题

TA的得分主题

发表于 2013-6-6 15:01 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-6-6 15:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-6-6 15:21 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 01:52 , Processed in 0.057186 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表