You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel跨工作表汇总工时代码对应时长:能否用工作表函数替代VBA?

用Excel工作表函数实现跨工作日表的工时汇总

当然可以不用VBA,完全靠工作表函数就能搞定这个月末汇总需求!我平时处理类似的跨表统计也常用这种方法,下面给你两种实用的方案,根据你的Excel版本选择就行:

方案1:通用版(适用于所有Excel版本)

这个方案结合SUMPRODUCTSUMIF,不管你是用Excel 2016还是365都能跑通。

步骤说明:

  1. 先在你的月末汇总工作表里,把所有需要统计的工作日工作表名称列出来,比如放在D1:D22区域(假设当月有22个工作日),比如列的是"1日""2日""3日"…这类表名。
  2. 选中这个区域,给它定义一个名称:点击公式栏左侧的名称框,输入SheetList回车即可。
  3. 现在要汇总某个代码(比如CODE001)的总工时,就可以用这个公式:
=SUMPRODUCT(SUMIF(INDIRECT("'"&SheetList&"'!A:A"), "CODE001", INDIRECT("'"&SheetList&"'!B:B")))

公式解释:

  • INDIRECT("'"&SheetList&"'!A:A"):会把SheetList里的每个表名转换成对应的A列引用,比如变成'1日'!A:A'2日'!A:A
  • SUMIF会分别在每个工作表里找出代码等于CODE001的行,求和对应的B列(Total Time)
  • SUMPRODUCT把所有工作表的求和结果加总,得到最终的汇总数

如果不想定义名称,也可以直接把表名写进数组里,比如:

=SUMPRODUCT(SUMIF(INDIRECT("'"&{"1日","2日","3日","4日"}&"'!A:A"), "CODE001", INDIRECT("'"&{"1日","2日","3日","4日"}&"'!B:B")))

方案2:动态数组版(适用于Excel 365/2021/Online)

如果你用的是支持动态数组的Excel版本,QUERY函数能一步生成所有代码的汇总表,不用逐个写公式,效率更高:

=QUERY({'"1日'!A:B;'2日'!A:B;'3日'!A:B;'4日'!A:B}, "select Col1, sum(Col2) where Col1 is not null group by Col1 label sum(Col2)'总工时'")

效果说明:

这个公式会自动把所有指定工作表的A、B列合并成一个数据源,然后按代码分组,计算每个代码的总工时,结果会自动溢出成一个完整的汇总表(包含代码列和总工时列)。你只需要把所有工作日的表名按'表名'!A:B;的格式添加到大括号里就行。

注意事项:

  • 工作表名称如果包含空格、特殊字符(比如括号),一定要用单引号把表名括起来,公式里的'"&...&"'就是帮你自动加单引号的,别漏掉。
  • 如果有些工作表是非工作日(不需要统计),一定要从SheetList或者数组里剔除,不然INDIRECT会返回错误值。
  • 确保每个工作表里的Total Time列是数值格式,如果是文本格式的话,求和会出问题,记得提前检查格式。

内容的提问来源于stack exchange,提问作者Masiar

火山引擎 最新活动