我正在尝试创建一个简单的辅助函数,以在给定的工作表上复制并插入任意数量的行。
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' failed
和ActiveWorkbook.Worksheets(tgtWorksheet).Rows(R).EntireRow
在宏失败和成功的情况下,它们看起来完全一样。
我没有在tgtWorksheet中使用过滤器或数据透视表。删除操作以某种方式使宏混乱。
如何解决此问题?
此处有一些其他信息:
正在调用的数据库下载函数使用以下行调用insertRows:
Range(ActiveWorkbook.Worksheets(tgtWorksheet).Cells(R, 1),ActiveWorkbook.Worksheets(tgtWorksheet).Cells(R + NumRows - 1, 1)).EntireRow
最初,我打开工作簿并调用该函数以下载一条数据记录。该函数运行无错误。如果我直接在复制行之前暂停,则会在我的即时/本地中得到以下图像:
我可以使用不同的参数任意多次运行此命令,成功添加不同的数据和不同数量的行。
在某个时候,我插入了足够的数据,所以我的第一个空行是第50行。如果我转到tgtworksheet并删除第50行,然后再次运行它,则会收到错误消息。 (请注意,在这种情况下,第51行的元素与第50行的元素完全相同。在上面的初始运行中,第51行的元素与第44行的元素完全相同。我在底部有一些未知的空白模板行数据,然后使用insertRows函数确保有足够的间隔行)。
立即/本地窗口在这里看起来完全一样,尽管现在出现插入错误。
答案 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