我建议使用SUMIF
式两种溶液,避免了使用For...Next
,一次设置需要的值。两者都提供选择保留公式或公式返回的值。
假设:
- 数据开始在
B2
- 数据具有以下标题:日期,出纳,金额
- 添加页眉:Total.Daily以显示所需的结果
- 第二溶液假设结果摘要开始于
G2:G3
级前申请的解决方案
1.-在数据范围汇总
Sub Adding_Amount_by_Date()
Const kFmlTotDay As String = "=SUMIF(#rDate,#Date,#rAmount)" 'SUMIF formula to apply
Dim rDta As Range
Dim sFml As String
Dim rTmp As Range, sFld As String, bPos As Byte
Rem Set Data Range
Set rDta = ThisWorkbook.Sheets("DATA").Range("B2").CurrentRegion 'Update as required
Rem Working With Body Range (Data Range excluding Headers)
With rDta.Offset(1).Resize(-1 + rDta.Rows.Count)
Rem Reset Formula
sFml = kFmlTotDay
Rem Amount Range
sFld = "Amount" 'Update as required
bPos = WorksheetFunction.Match(sFld, rDta.Rows(1), 0)
Set rTmp = .Columns(bPos)
sFml = Replace(sFml, "#r" & sFld, rTmp.Address)
Rem Date Range
sFld = "Date" 'Update as required
bPos = WorksheetFunction.Match(sFld, rDta.Rows(1), 0)
Set rTmp = .Columns(bPos)
sFml = Replace(sFml, "#r" & sFld, rTmp.Address)
sFml = Replace(sFml, "#" & sFld, rTmp.Cells(1).Address(0, 1))
Rem Enter Daily Total (Formula or Value)
sFld = "Total.Daily" 'Update as required
bPos = WorksheetFunction.Match(sFld, rDta.Rows(1), 0)
.Columns(bPos).Formula = sFml 'Enter formula
.Columns(bPos).Value = .Columns(bPos).Value2 'Replace formula with values (comment this line to have keep the formulas)
End With
End Sub
2:在汇总范围
Sub Adding_Amount_by_Date_OutputRange()
Const kFmlTotDay As String = "=SUMIF(#rDate,#Date,#rAmount)" 'SUMIF formula to apply
Dim rOut As Range
Dim rDta As Range
Dim sFml As String
Dim rTmp As Range, sFld As String, bPos As Byte
Rem Reset Output Table Range
Set rOut = ThisWorkbook.Sheets("DATA").Range("G2").CurrentRegion 'Update as required
With rOut
If .Rows.Count > 1 Then
.Offset(1).Resize(-1 + rOut.Rows.Count).ClearContents
Set rOut = rOut.Cells(1).CurrentRegion
End If
End With
Rem Set Data Range
Set rDta = ThisWorkbook.Sheets("DATA").Range("B2").CurrentRegion 'Update as required
Rem Work With Data Range Body (excluding Headers)
With rDta.Offset(1).Resize(-1 + rDta.Rows.Count)
Rem Reset Formula
sFml = kFmlTotDay
Rem Amount Range
sFld = "Amount" 'Update as required
bPos = WorksheetFunction.Match(sFld, rDta.Rows(1), 0)
Set rTmp = .Columns(bPos)
sFml = Replace(sFml, "#r" & sFld, rTmp.Address)
Rem Date Range
sFld = "Date" 'Update as required
bPos = WorksheetFunction.Match(sFld, rDta.Rows(1), 0)
Set rTmp = .Columns(bPos)
sFml = Replace(sFml, "#r" & sFld, rTmp.Address)
sFml = Replace(sFml, "#" & sFld, rOut.Cells(2, 1).Address(0, 1))
End With
Rem List Unique Date in Output Range
With rOut
rDta.Columns(bPos).AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=rDta.Columns(bPos), _
CopyToRange:=.Cells(1), _
Unique:=True
.Worksheet.Names("Criteria").Delete
.Worksheet.Names("Extract").Delete
End With
Rem Enter Daily Total (Formula or Value)
Set rOut = rOut.Cells(1).CurrentRegion
With rOut.Offset(1).Resize(-1 + rOut.Rows.Count).Columns(2)
.Formula = sFml 'Enter formula
.Value = .Columns(bPos).Value2 'Replace formula with values (comment this line to have keep the formulas)
End With
End Sub
共申请这两种解决方案
后
推荐阅读以下网页获得的资源有了更深的了解使用:
Excel functions (by category),Excel Objects,Range Object (Excel),Range.Offset Property (Excel),
Variables & Constants,WorksheetFunction Object (Excel),With Statement
注意,对于6月01日 - 16总数是100.36 + 300.58。另外为什么使用VBA?这可以通过公式轻松实现(请参阅SUMIFS) – EEM
由于有大量数据,我想创建一个表单并使用命令按钮来运行数据并自动执行此操作 – Roger