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