Excel VBA – 插入的行出现在select的顶部而不是底部

我正在处理这个macros,它将查看一个事务块,在几个月之间插入3行,然后添加月份和小计。 问题是break和totals是在月初而不是结尾插入的。

我试图调整class次,但最终会给我一个错误,或者最后总是覆盖现有的单元格,而不是进入一个新的行。 这是一个比以前更加复杂的macros,我现在有点迷路,还在学习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 

这一行开始在第i行插入。

 .Rows(i & ":" & i + 2).Insert Shift:=xlDown 

你想在第i+3行开始插入,你可以用Offset方法来完成:

 .Rows(i & ":" & i + 2).Offset(3).Insert Shift:=xlDown 

您可能也想看到这个答案,获得一列中“最后一行”的最佳方式:

在VBA中查找上次使用的单元格时出错

正如你现在正在做的lr = shData.Rows.Count ,这是Excel 2003中的65,336行,或者Excel 2007+中的1,048,576行,你几乎可以肯定没有那么多的数据(否则Insert会失败!),所以你的循环在一堆空行上循环不必要的。

你需要改变这一行:

 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 ? 当你正在检查工作表中的最后一行? 目前总是会在第一行之后加上小计。 您还需要在添加三个小计行时更新此值。