在Excel中使用xlDown插入附加行

时间:2010-11-04 09:05:57

标签: excel excel-vba excel-2007 vba

我定义了以下宏,它将行插入到工作表中。在指定的起始地址插入行之后,各种范围将转换为表。我最初的想法是问题在于使用xlDown - 因为这是插入行的代码中的位置。

目前我有7个这样的范围,但问题是前三个总是插入一个额外的行 - 这是以前没有问题的工作,所以它的行为不端对我来说是一个难题。

其余范围是正确的。 tableStartAdress引用命名范围,其值对应于绿色标题下方的第一个单元格,即A4,A12等。此示例中的rowsToInsert始终为38。

Sub InsertTableRows(tableStartAdress As String, rowsToInsert As Integer)
    Dim i As Integer
    Dim rowToCopy As String

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Application.DisplayAlerts = False
    Range(tableStartAdress).Offset(1, 0).Rows.Copy

    rowToCopy = Range(tableStartAdress).Offset(1, 0).row & ":" & _           
                   Range(tableStartAdress).Offset(1, 0).row

    Rows(rowToCopy).Select
    Selection.Copy

    Range(tableStartAdress).Offset(1, 0).Select
    ActiveCell.Resize(rowsToInsert, 1).Select

    Selection.Insert Shift:=xlDown
    Application.CutCopyMode = False

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub

以下图片描绘了我的意思。

之前:

How the wkSheet looks before date population

填充数据后,前三个范围/表格有一个额外的行

Extra RowsExtra Row

虽然其余部分是正确的

Correct blank stuff

1 个答案:

答案 0 :(得分:1)

我建议简化您的代码以便开始。 (可能会帮助您追踪事情是否出错。)因为您在使用它之前不需要选择范围....

rowToCopy = Range(tableStartAdress).Offset(1, 0).Row & _
    ":" & Range(tableStartAdress).Offset(1, 0).Row
Rows(rowToCopy).Select
Selection.Copy

Range(tableStartAdress).Offset(1, 0).Select
ActiveCell.Resize(rowsToInsert, 1).Select
Selection.Insert Shift:=xlDown

与......相同。

Range(tableStartAdress).Offset(1, 0).EntireRow.Copy
Range(tableStartAdress).Offset(1, 0).Resize(rowsToInsert, 1).Insert Shift:=xlDown

更容易看到。几个想法:首先,你确定tableStartAddress真的总是一个单元格(和正确的单元格)吗?你确定rowsToInsert总是38吗?除此之外,您当前编写的代码是复制整行并将其插入到理论上为38行1列的范围内。我建议重写这个,这样你首先插入你想要的许多行,然后用属于那里的数据填充38 x 1范围。