在工作表上删除行后,Excel VBA插入失败

时间:2019-02-25 04:13:08

标签: excel vba

我正在尝试创建一个简单的辅助函数,以在给定的工作表上复制并插入任意数量的行。

Public Sub insertRows(tgtWorksheet As String, R As Integer, NumRows As Integer)
    'Statements added for error checking'
    Debug.Print ("Inserting " & NumRows & " rows in '" & tgtWorksheet & "' by copying row " & insertRow)
    copyRng = Worksheets(tgtWorksheet).Rows(insertRow).EntireRow
    pasteRng = Range(Worksheets(tgtWorksheet).Cells(insertRow, 1), Worksheets(tgtWorksheet).Cells(insertRow + NumRows - 1, 1)).EntireRow
    'End statements added for error checking'

    Worksheets(tgtWorksheet).Rows(insertRow).EntireRow.Copy
    Range(Worksheets(tgtWorksheet).Cells(insertRow, 1), Worksheets(tgtWorksheet).Cells(insertRow + NumRows - 1, 1)).EntireRow.Insert Shift:=xlDown
End Sub

此功能支持数据库功能,以读取外部托管的记录并将其写入工作表。 excel表中的每一行都有原始输入单元格和公式的混合。数据库只存储原始输入单元格,因此,当我从数据库中加载数据时,我会识别出第一个空行,并使用它创建所需数量的模板行来存储新数据。

问题是,在我成功运行了该函数之后,我从目标工作表中删除了与插入目标具有相同行号的行,当我再次尝试运行该函数时,我得到了{{ 1}}

当我询问两个范围Run-time error '-2147417848 (80010108) Method 'Insert of object 'Range' failedActiveWorkbook.Worksheets(tgtWorksheet).Rows(R).EntireRow

在宏失败和成功的情况下,它们看起来完全一样。

我没有在tgtWorksheet中使用过滤器或数据透视表。删除操作以某种方式使宏混乱。

如何解决此问题?


编辑-详细的错误回溯

此处有一些其他信息:

正在调用的数据库下载函数使用以下行调用insertRows:

Range(ActiveWorkbook.Worksheets(tgtWorksheet).Cells(R, 1),ActiveWorkbook.Worksheets(tgtWorksheet).Cells(R + NumRows - 1, 1)).EntireRow

最初,我打开工作簿并调用该函数以下载一条数据记录。该函数运行无错误。如果我直接在复制行之前暂停,则会在我的即时/本地中得到以下图像:

immediate/locals 1

我可以使用不同的参数任意多次运行此命令,成功添加不同的数据和不同数量的行。

在某个时候,我插入了足够的数据,所以我的第一个空行是第50行。如果我转到tgtworksheet并删除第50行,然后再次运行它,则会收到错误消息。 (请注意,在这种情况下,第51行的元素与第50行的元素完全相同。在上面的初始运行中,第51行的元素与第44行的元素完全相同。我在底部有一些未知的空白模板行数据,然后使用insertRows函数确保有足够的间隔行)。

enter image description here

立即/本地窗口在这里看起来完全一样,尽管现在出现插入错误。

enter image description here

1 个答案:

答案 0 :(得分:0)

我确定问题的根源是工作表在较大的数据库宏中受到临时保护。

现在对我有用的代码是

Public Sub insertRows(tgtWorksheet As String, insertRow As Integer, numRows As Integer)
    With Worksheets(tgtWorksheet)
        .Unprotect
        .Rows(insertRow).Copy
        .Range(insertRow + 1 & ":" & insertRow + numRows).Insert (xlDown)
    End With
    Application.CutCopyMode = False
End Sub