【问题标题】:Excel VBA insert fails after rows have been deleted on worksheet在工作表上删除行后 Excel VBA 插入失败
【发布时间】:2019-03-01 06:31:47
【问题描述】:

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

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 表中的每一行都混合了原始输入单元格和公式。数据库只存储原始输入单元格,因此当我从数据库加载数据时,我会识别第一个空行并使用它来创建所需数量的模板行来存储新数据。

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

当我询问ActiveWorkbook.Worksheets(tgtWorksheet).Rows(R).EntireRowRange(ActiveWorkbook.Worksheets(tgtWorksheet).Cells(R, 1),ActiveWorkbook.Worksheets(tgtWorksheet).Cells(R + NumRows - 1, 1)).EntireRow 两个范围时

在宏失败的情况下与成功时的情况完全相同。

我没有在我的 tgtWorksheet 中使用过滤器或数据透视表。不知何故,删除操作使宏感到困惑。

我该如何解决这个问题?


编辑 - 详细的错误回溯

这里有一些附加信息:

调用数据库下载函数调用insertRows,行:

Call insertRows(tgtWorksheet, insertRow, NumRows)

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

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

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

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

【问题讨论】:

  • 我有点困惑?您要删除哪些行?顺便说一句,您的代码可以以更好的方式编写...... (我稍后会解决这个问题)你能解释一下到底发生了什么吗?也许是一些例子?
  • 取决于您如何删除单元格并重新运行该函数。我假设您对tgtWorksheet 的原始分配没有重新设置,在这种情况下,它会将原始范围置于undefined 状态,因为它现在已被删除。
  • @SiddharthRout 我在帖子中添加了详细的即时/本地窗口信息。更广泛的数据库功能是 150 多行。我无法通过简单地在新工作簿中运行 insertRows 来重现该问题,所以我猜测对正在出现的行存在某种隐式保护。
  • @AJD 感谢您的建议。在本地窗口中,当我尝试插入时,范围不是未定义的。在我更新的编辑中查看最后一张图片

标签: excel vba


【解决方案1】:

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

现在为我工作的代码是

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

【讨论】:

    猜你喜欢
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2012-05-31
    • 1970-01-01
    相关资源
    最近更新 更多