在需求之外插入行

时间:2016-02-04 10:39:10

标签: excel vba excel-vba

我编译了一个宏,该宏使用输入框允许用户在同一工作簿中的三个不同工作表上的多个位置插入指定数量的行。然后,它使用基于示例第一行的自动填充来使用适当的数据填充这些新行。

它正确地完成了以上所有操作。但是,它还会将用户指定的行数插入“前页”中。运行宏时始终是活动表。它不是我指定的插入行的目的地之一。

从用户测试中,不需要的行不会插入到一致的位置,而是显示在工作表内的不同位置,看起来会随输入框中指定的数量而变化。它没有填充这些多余的行,因为它可以填充所需的行。

Sub AddPlots()
    Dim j As Integer, r As Range,

    'Set Number of Rows to be added
    j = InputBox("How many open market units does the development have?")

    ' Add Rows On Master Appraisal
    With Worksheets("Master Appraisal")
        Set r = Range("FirstPlot")
        Do
            Range(r.Offset(1, 0), r.Offset(j - 1, 0)).EntireRow.Insert
            Set r = Cells(r.Row + j + 1, 1)
            If r.Offset(1, 0) = "" Then Exit Do
        Loop
    End With

'Add Rows On Cashflow
    With Worksheets("Cashflow")
        Set r = Range("FirstPlot2")
        Do
            Range(r.Offset(1, 0), r.Offset(j - 1, 0)).EntireRow.Insert
            Set r = Cells(r.Row + j + 1, 1)
            If r.Offset(1, 0) = "" Then Exit Do
        Loop
    End With

'Add Rows On Fees (NHBC section)

    With Worksheets("Fees etc")
        Set r = Range("FirstPlot3")
        Do
            Range(r.Offset(1, 0), r.Offset(j - 1, 0)).EntireRow.Insert
            Set r = Cells(r.Row + j + 1, 1)
            If r.Offset(1, 0) = "" Then Exit Do
        Loop
    End With

'Add Rows On Fees (Marketing section)
    With Worksheets("Fees etc")
        Set r = Range("FirstPlot4")
        Do
            Range(r.Offset(1, 0), r.Offset(j - 1, 0)).EntireRow.Insert
            Set r = Cells(r.Row + j + 1, 1)
            If r.Offset(1, 0) = "" Then Exit Do
        Loop
    End With

'Populate New Rows with Data
    Worksheets("Cashflow").Range("Topline2").AutoFill
    Destination:=Range("Topline2").Resize(j), Type:=xlFillDefault
    Worksheets("Master Appraisal").Range("Topline").AutoFill 
    Destination:=Range("Topline").Resize(j), Type:=xlFillDefault
    Worksheets("Fees etc").Range("Topline3").AutoFill
    Destination:=Range("Topline3").Resize(j), Type:=xlFillDefault
    Worksheets("Fees etc").Range("Topline4").AutoFill
    Destination:=Range("Topline4").Resize(j), Type:=xlFillDefault

End Sub

1 个答案:

答案 0 :(得分:1)

当您使用WITH....END WITH代码块时,您想引用正确工作表的任何范围必须以句点(.)开头,否则它将引用活动工作表。

因此Range(r.Offset(1, 0), r.Offset(j - 1, 0)).EntireRow.Insert引用了有效工作表,而.Range(r.Offset(1, 0), r.Offset(j - 1, 0)).EntireRow.Insert引用了WITH语句中使用的工作表。

编辑:
同样Cells(r.Row + j + 1, 1)应为.Cells(r.Row + j + 1, 1) - 这些行会更新您在r指定范围FirstPlot中使用的工作表中的WITH引用,以查看活动工作表而不是{{1}表格。