Excel多工作表对应组合值求和实现方法咨询
Excel多工作表对应组合值求和实现方法咨询
嗨,刚接触Excel遇到这种组合值求和的问题确实容易懵,别担心,我给你两种实用的方法,你可以根据自己的Excel版本来选:
方法一:用内置函数实现(适合Excel 365/2021及以后版本)
这个方法不需要写代码,用Excel自带的函数就能搞定:
- 先把「Time」工作表的行、列标题和「Size」表完全对齐复制好
- 在「Time」表第一个需要计算的单元格(比如对应「Size」表B2的单元格),输入以下公式:
=SUM(SUMIF(Number!$A:$A, TEXTSPLIT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Size!B2, "B", ",B"), "S", ",S"), "T", ",T"), ","), Number!$B:$B))
- 按下回车后,就能得到对应组合的时间总和,之后可以直接下拉、右拉填充整个「Time」表的单元格
公式逻辑简单解释:
- 三次
SUBSTITUTE函数:给每个以B/S/T开头的名称前加逗号,把连续的组合字符串(比如B1B12)变成,B1,B12的格式 TEXTSPLIT函数:按逗号把字符串拆分成单个名称的数组(比如{"","B1","B12"})SUMIF+SUM:对每个名称在「Number」表中查找对应的时间值,最后把所有值求和
方法二:自定义VBA函数(兼容所有Excel版本)
如果你的Excel版本比较旧,没有TEXTSPLIT函数,可以用VBA写个自定义函数:
- 打开Excel后,按下
Alt + F11打开VBA编辑器 - 右键点击左侧的工作簿名称,选择「插入」→「模块」
- 在弹出的模块编辑窗口中,粘贴以下代码:
Function SumCombined(combinedText As String, nameRange As Range, valueCol As Integer) As Double Dim total As Double Dim tempStr As String Dim nextPos As Integer Dim currentName As String total = 0 tempStr = combinedText Do While tempStr <> "" ' 寻找下一个名称的起始位置 nextPos = Len(tempStr) + 1 If InStr(tempStr, "B") > 1 And InStr(tempStr, "B") < nextPos Then nextPos = InStr(tempStr, "B") If InStr(tempStr, "S") > 1 And InStr(tempStr, "S") < nextPos Then nextPos = InStr(tempStr, "S") If InStr(tempStr, "T") > 1 And InStr(tempStr, "T") < nextPos Then nextPos = InStr(tempStr, "T") If nextPos > 1 Then ' 提取第一个名称并求和 currentName = Left(tempStr, nextPos - 1) total = total + Application.VLookup(currentName, nameRange, valueCol, False) tempStr = Mid(tempStr, nextPos) Else ' 处理最后一个名称 total = total + Application.VLookup(tempStr, nameRange, valueCol, False) tempStr = "" End If Loop SumCombined = total End Function
- 关闭VBA编辑器回到Excel界面,在「Time」表的目标单元格输入公式:
=SumCombined(Size!B2, Number!$A:$B, 2)
- 参数解释:
Size!B2是「Size」表中要处理的组合字符串;Number!$A:$B是「Number」表中名称和时间的区域;2表示要取「Number」表中第2列的时间值
- 同样下拉、右拉填充即可完成所有单元格的计算
你之前用VLOOKUP出错的原因:
VLOOKUP只能针对单个匹配值查找结果,没法直接处理多个名称的组合字符串,所以单独用它没办法实现求和,需要结合拆分字符串或者自定义函数来处理~
备注:内容来源于stack exchange,提问作者Hoang-Giang Pham




