我正在使用这个宏来查看一个事务块,在几个月之间插入3行,然后添加月份和小计。问题是中断和总计将在月初而不是结束时插入。
我试图调整班次,但它最终会给我一个错误,或者总计最终会覆盖现有的单元格而不是进入新的行。这是一个比以前更复杂的宏,我现在有点迷失,仍在努力学习VBA。
Option Explicit
Sub AddAndSum()
On Error GoTo lblError
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim shData As Worksheet, wbData As Workbook
Dim fr As Long, lr As Long, i As Long, lr2 As Long
Dim intMonth As Long, intYear As Long
Set wbData = ThisWorkbook
Set shData = wbData.Sheets("Sheet1")
fr = 13
lr = shData.Rows.Count
For i = fr To lr
With shData
If (IsDate(.Cells(i, 3).Value) And IsDate(.Cells(i - 1, 3).Value) And Month(.Cells(i, 3).Value) <> Month(.Cells(i - 1, 3).Value)) Or i = fr Then
intMonth = Month(.Cells(i, 3).Value)
intYear = Year(.Cells(i, 3).Value)
.Rows(i & ":" & i + 2).Insert Shift:=xlDown
.Cells(i + 1, 1).Value = "Monthly Total (" & MonthName(intMonth) & ")"
.Cells(i + 1, 2).Formula = "=SUMPRODUCT((MONTH($C$" & fr & ":$C$" & lr & ")=" & intMonth & ")*(YEAR($C$" & fr & ":$C$" & lr & ")=" & intYear & ")*$E$" & fr & ":$E$" & lr & ")"
i = i + 3
End If
End With
Next i
lblError:
If Err.Number <> 0 Then
MsgBox "Error (" & Err.Number & "): " & Err.Description, vbOKOnly + vbCritical
End If
GoTo lblExit
lblExit:
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.Calculate
Application.Calculation = xlCalculationAutomatic
Exit Sub
End Sub
答案 0 :(得分:2)
此行开始在行i
处插入。
.Rows(i & ":" & i + 2).Insert Shift:=xlDown
您希望在i+3
行开始插入,您可以使用Offset
方法完成此操作:
.Rows(i & ":" & i + 2).Offset(3).Insert Shift:=xlDown
您可能还希望看到有关获得&#34;最后一行&#34;的最佳方式的答案。在一栏中:
Error in finding last used cell in VBA
正如您当前正在执行的lr = shData.Rows.Count
是Excel 2003中的65,336行,或Excel 2007+中的1,048,576行,您几乎肯定没有那么多数据(否则Insert
会失败!),所以你的循环不必要地在一堆空行上循环。
答案 1 :(得分:0)
您需要更改此行:
intMonth = Month(.Cells(i, 3).Value)
到
intMonth = Month(.Cells(i-1, 3).Value)
此时它将intMonth设置为当前单元格(下个月的第一个单元格)的值,而不是前一个单元格的值(包含您想要小计的月份)。
然后在循环中添加一个条件以添加最后一个小计。
此外:
If (IsDate(.Cells(i, 3).Value) And IsDate(.Cells(i - 1, 3).Value) And Month(.Cells(i, 3).Value) <> Month(.Cells(i - 1, 3).Value)) Or i = fr Then
这应该是i = lr
吗?当你检查表格的最后一行时?此刻总是会在第一行后面加一个小计。当您添加三个小计行时,您还需要更新此值。