我有一张如下所示的表格:
X | 是 |
---|---|
名称01 | 0 |
某某 | 价值 |
某某某 | 价值 |
名称02 | 0 |
某某 | 价值 |
名称03 | 0 |
某某 | 价值 |
某某某 | 价值 |
某某 | 价值 |
我想按 NameX 对 Y 值进行分组求和:
X | 是 |
---|---|
名称01 | 价值观01 |
名称02 | 价值观02 |
名称03 | 价值观03 |
怎么做?问题是每个“姓名”的行数各不相同
答案1
当然,借助附加(辅助)列和几个不太复杂的公式或借助 PowerQuery(在现代版本的 Excel 中的“数据”选项卡上),可以轻松解决此任务。但是,老派(非常老派)认为,如果您知道如何手动解决问题,则可以教 VBA 为您解决问题。
这用户定义函数 (UDF)并不是很复杂,编写它所需的按钮点击次数并不比构建公式多多少,而且结果是一样的:
Option Explicit
Function sumByGroup(aSource As Range, Optional markAsName As String = "_") As Variant
Dim aData As Variant
Dim aResult As Variant
Dim i As Long, k As Long
Rem Get data from source range:
aData = aSource.Value2
Rem Prepare and clear result array:
ReDim aResult(1 To UBound(aData, 1), 1 To 2)
For i = 1 To UBound(aData, 1)
aResult(i, 1) = "": aResult(i, 2) = ""
Next i
Rem Fill result array:
k = 1
aResult(k, 1) = aData(1, 1): aResult(k, 2) = aData(1, 2)
For i = 2 To UBound(aData, 1)
If InStr(aData(i, 1), markAsName) Then
k = k + 1
aResult(k, 1) = aData(i, 1): aResult(k, 2) = 0
Else
aResult(k, 2) = aResult(k, 2) + aData(i, 2)
End If
Next i
sumByGroup = aResult
End Function
答案2
反向累加器:
有很多方法可以使用复杂的 sumif 和数组公式来实现这一点,但我更喜欢用传统方法来解决这类问题。
从最后一行(例如第 99 行)开始,进入新列(例如 C 列)。因此 C99 是
=IF(B100=0,B99,C100+B99)
现在将此公式复制并粘贴到顶部。如果需要,请对所有 B=0 行运行过滤器。
编辑:
您可以更改 IF 条件以根据合格标准(例如下划线)直接检测名称类别,并将相应的 Y 列保留为空字符串“”而不是零。
然后更进一步,将中间的数字作为负数求和,并使用条件格式将负数涂白,这样你就可以获得一个很好的会计分类汇总风格。