Excel VBA - 插入的行显示在选择的顶部而不是底部

时间:2016-08-05 17:48:15

标签: excel vba excel-vba

我正在使用这个宏来查看一个事务块,在几个月之间插入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

2 个答案:

答案 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吗?当你检查表格的最后一行时?此刻总是会在第一行后面加一个小计。当您添加三个小计行时,您还需要更新此值。