Vba 什么可能导致Range.Copy抛出错误?

Vba 什么可能导致Range.Copy抛出错误?,vba,excel,Vba,Excel,我的VBA代码中有以下行: wks.Rows(lLastRow).Copy 通常效果很好。拉斯特罗总是11岁。wks始终是活动工作表 但有时上面的行开始抛出类型为“range类的复制方法失败”的错误 然后我必须重新启动Excel文件,以便该行重新开始工作 你知道是什么导致了这个问题吗?是什么导致范围.Copy语句停止工作,然后在文件重新启动后重新开始工作 编辑:下面是我的更多代码。代码由调用NewActionButton() 获取错误的过程。第一次失败时,它似乎会在.Insert语句上抛出一个

我的VBA代码中有以下行:

wks.Rows(lLastRow).Copy
通常效果很好。拉斯特罗总是11岁。wks始终是活动工作表

但有时上面的行开始抛出类型为“range类的复制方法失败”的错误

然后我必须重新启动Excel文件,以便该行重新开始工作

你知道是什么导致了这个问题吗?是什么导致
范围.Copy
语句停止工作,然后在文件重新启动后重新开始工作

编辑:下面是我的更多代码。代码由调用
NewActionButton()

获取错误的过程。第一次失败时,它似乎会在.Insert语句上抛出一个错误。然后,如果我再次运行宏,它会在.Copy语句上抛出一个错误。如果我重新启动文档,它就会工作

Sub NewRow(wks As Worksheet, lStartCol As Long, lIdCol As Long, lDate As Long, lEndCol As Long)
    Dim lLastRow As Long
    Dim rConstants As Range
    Dim rConstant As Range
    Dim rEarlierIds As Range

    'Determine last row based on criteria column
    lLastRow = LastRow(wks.Columns(lIdCol))

    'Copy template row from directly above
    wks.Range(wks.Cells(lLastRow, lStartCol), wks.Cells(lLastRow, lEndCol)).Copy

    'Insert new row
    wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).Insert

    'Remove unwanted properties
    Set rConstants = wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).SpecialCells(xlCellTypeConstants)
    If Not rConstants Is Nothing Then
        For Each rConstant In rConstants.Cells
            rConstant = ""
        Next rConstant
    End If

    'Add ID
    Set rEarlierIds = wks.Columns(lIdCol)
    wks.Cells(lLastRow + 1, lIdCol) = Evaluate("Max(" & rEarlierIds.Address & ")+1")

    'Add Date
    wks.Cells(lLastRow + 1, lDate) = Date

    'Remove copy marking
    Application.CutCopyMode = False
End Sub
EDIT2:.Insert语句确实插入了一个新范围。然而,尽管如此,执行还是停止了,我收到了错误消息“Insert method of Range class failed

EDIT3:我不知道哪里出了问题,但我发现了一种模式。如果在打开Excel文件后立即执行宏,.Insert语句会起作用。我可以执行任意次数。但只要双击单元格,然后单击ESC离开单元格,然后再次尝试运行宏,.Insert语句抛出错误。这对我来说毫无意义

EDIT4:我已将上面的代码更新为当前的外观

EDIT5:下面的代码工作完美无瑕。我所做的更改是,我没有先复制再插入。相反,我先插入新行,然后再复制到新行。我仍然不知道我以前的代码为什么不起作用。我希望有人有想法或能确认我偶然发现了一个错误,并能说明是什么情况导致了错误臭虫

Sub NewRow(wks As Worksheet, lStartCol As Long, lIdCol As Long, lDate As Long, lEndCol As Long)
    Dim lLastRow As Long
    Dim rConstants As Range
    Dim rConstant As Range
    Dim rEarlierIds As Range

    'Determine last row based on criteria column
    lLastRow = LastRow(wks.Columns(lIdCol))

    'Insert new row
    wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).Insert

    'Copy template row from directly above
    wks.Range(wks.Cells(lLastRow, lStartCol), wks.Cells(lLastRow, lEndCol)).Copy

    'Paste formulas row
    wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).PasteSpecial xlPasteFormulas

    'Remove values
    Set rConstants = wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).SpecialCells(xlCellTypeConstants)
    If Not rConstants Is Nothing Then
        For Each rConstant In rConstants.Cells
            rConstant = ""
        Next rConstant
    End If

    'Add ID
    Set rEarlierIds = wks.Columns(lIdCol)
    wks.Cells(lLastRow + 1, lIdCol) = Evaluate("Max(" & rEarlierIds.Address & ")+1")

    'Add Date
    wks.Cells(lLastRow + 1, lDate) = Date

    'Remove copy marking
    Application.CutCopyMode = False
End Sub

这可能与VB命令通常与Excel在其自己的界面中执行的命令相对应的事实有关。大多数情况下,这不会导致任何问题-实际上这就是宏录制工作的原因(即使它工作得不太好)。不过,偶尔你会有怪癖。这闻起来像是其中之一(涉及复制/粘贴的另一个问题通常是,工作簿层上除粘贴命令以外的任何交互都会在最终调用粘贴时导致InvalidOperation异常)

在这种情况下,我建议复制一些单元格,然后右键单击任何列或行。您会注意到,插入选项已完全取消-只有“插入复制的单元格”选项“。只要工作表处于
CutCopyMode
,这一点就会保持不变;当工作表退出时,Insert选项将返回。我的猜测是:

  • 您的代码尝试插入(而不是插入复制的单元格),但这是禁止的操作或
  • 当代码试图插入的区域仅准备插入一些空白单元格时,代码尝试插入复制的单元格

不过,为了确保这一点,您可能必须对这两种方法进行反编译,这是我无法理解的。很高兴听到您提出了一个解决方案。

一些评论:您是否将Application.CutCopyMode设置为False?另外,在NewRow()子项中,使用LastRow()有什么好处函数?你能改为使用内置函数来确定最后一行吗?A1:我以前没有。我在写这篇文章后将它添加到我的代码中,以消除复制范围周围的标记。除此之外,我不知道它是否还有任何其他好处。我会仔细阅读。但是,即使添加了CutCopyMo,我仍然有问题de=False,直到过程结束。A2:内置函数,如Cells.Find(“*”,[A1],.xlByRows,xlPrevious)。行或结束(xlUp)不要注册被筛选器隐藏的文本。复制行中是否有大量格式/文本?Excel可能内存不足,因为剪贴板已经有上一行,正在尝试再次复制该行?我将尝试在wks.Rows(lLastRow)之前直接复制空白单元格。复制到“清除”打开剪贴板,看看这是否有帮助。我修改了文本,只复制和插入了11个单元格,而不是整行。当我收到错误消息时,工作簿似乎以某种方式被锁定。我无法通过单击单元格来选择单元格。但是,如果我双击它们,我可以写入单元格。刚才我双击了一个单元格,可以开始写入。但是Excel在我的打字中崩溃了。第一次在打开工作簿后出错,它总是运行时错误- 2147417848(80010108):对象范围的方法插入失败。
Sub NewRow(wks As Worksheet, lStartCol As Long, lIdCol As Long, lDate As Long, lEndCol As Long)
    Dim lLastRow As Long
    Dim rConstants As Range
    Dim rConstant As Range
    Dim rEarlierIds As Range

    'Determine last row based on criteria column
    lLastRow = LastRow(wks.Columns(lIdCol))

    'Insert new row
    wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).Insert

    'Copy template row from directly above
    wks.Range(wks.Cells(lLastRow, lStartCol), wks.Cells(lLastRow, lEndCol)).Copy

    'Paste formulas row
    wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).PasteSpecial xlPasteFormulas

    'Remove values
    Set rConstants = wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).SpecialCells(xlCellTypeConstants)
    If Not rConstants Is Nothing Then
        For Each rConstant In rConstants.Cells
            rConstant = ""
        Next rConstant
    End If

    'Add ID
    Set rEarlierIds = wks.Columns(lIdCol)
    wks.Cells(lLastRow + 1, lIdCol) = Evaluate("Max(" & rEarlierIds.Address & ")+1")

    'Add Date
    wks.Cells(lLastRow + 1, lDate) = Date

    'Remove copy marking
    Application.CutCopyMode = False
End Sub