我建議使用SUMIF
式兩種溶液,避免了使用For...Next
,一次設置需要的值。兩者都提供選擇保留公式或公式返回的值。
假設:
- 數據開始在
B2
- 數據具有以下標題:日期,出納,金額
- 添加頁眉:Total.Daily以顯示所需的結果
- 第二溶液假設結果摘要開始於
G2:G3
級前申請的解決方案 ![](https://i.stack.imgur.com/Xw6Z0.png)
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
共申請這兩種解決方案 ![](https://i.stack.imgur.com/I3SlI.png)
後
推薦閱讀以下網頁獲得的資源有了更深的瞭解使用:
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