基于文本条件的动态求和范围设置及循环求和问题求助
解决方案:按「Faktura」分组动态求和(含日期限制)
一、函数式解决方案(无需VBA)
假设数据结构:
- A列:
Beskrivelse(含「Faktura」标识) - B列:日期(格式为
dd/mm/yyyy) - C列:需要求和的数值列
步骤1:标记每组「Faktura」的起始行
在D2单元格输入公式,下拉填充至最后一行:
=IF(ISNUMBER(SEARCH("Faktura",A2)),MAX($D$1:D1)+1,D1)
该公式会为每一组「Faktura」分配唯一组号,自动完成分组标记。
步骤2:按组号+日期限制求和
在空白单元格(如E2)输入公式,下拉生成所有组的求和结果:
=IFERROR(SUMIFS(C:C,D:D,ROW(A1),B:B,"<="&DATE(2023,3,31)),"")
ROW(A1)会随下拉自动递增,对应第1、2、3...组DATE(2023,3,31)可替换为指定结束日期的单元格引用(如$G$1)
步骤3:确保包含「Faktura」起始行(可选)
若需限定仅求和每组内包含「Faktura」且日期符合要求的行,修改公式为:
=IFERROR(SUMIFS(C:C,D:D,ROW(A1),B:B,"<="&DATE(2023,3,31),A:A,"*Faktura*"),"")
若组内非「Faktura」行也需纳入求和,去掉A列条件即可。
二、VBA批量处理方案(适合超5000行大规模数据)
函数下拉卡顿的话,用VBA效率更高:
按Alt+F11打开VBA编辑器,插入模块,粘贴以下代码:
Sub SumByFakturaGroup() Dim ws As Worksheet Dim lastRow As Long, i As Long, currentGroup As Long Dim endDate As Date Dim sumResult As Double Set ws = ThisWorkbook.ActiveSheet endDate = DateSerial(2023, 3, 31) ' 替换为你的结束日期 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row currentGroup = 0 sumResult = 0 For i = 2 To lastRow ' 遇到新Faktura组,输出上一组结果 If InStr(ws.Cells(i, "A").Value, "Faktura") > 0 Then If currentGroup > 0 Then ws.Cells(ws.Rows.Count, "E").End(xlUp).Offset(1, 0).Value = sumResult End If currentGroup = currentGroup + 1 sumResult = 0 ' 重置求和变量 End If ' 日期符合要求则累加 If ws.Cells(i, "B").Value <= endDate Then sumResult = sumResult + ws.Cells(i, "C").Value End If Next i ' 输出最后一组结果 If currentGroup > 0 Then ws.Cells(ws.Rows.Count, "E").End(xlUp).Offset(1, 0).Value = sumResult End If MsgBox "分组求和完成!", vbInformation End Sub
说明:
- 可根据实际列号修改
A(Beskrivelse列)、B(日期列)、C(求和列)的引用- 结束日期可改为
ws.Range("G1").Value引用单元格中的日期- 结果默认输出到E列,可修改目标列标识(如
"F")
三、细节优化
- 若「Faktura」大小写不一致,函数用
SEARCH(不区分大小写),VBA中替换为InStr(1, ws.Cells(i,"A").Value, "Faktura", vbTextCompare) - 数据含空行时,VBA中加入
If ws.Cells(i,"A").Value <> "" Then跳过空行
内容的提问来源于stack exchange,提问作者Mick Madsen
相关产品推荐
相关产品推荐

