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

时间:2014-12-09 12:46:40

标签: vba excel-vba excel

我的VBA代码中有以下行:

wks.Rows(lLastRow).Copy

通常它工作正常。 lLastRow始终为11. wks始终是活动表。

但有时上面的行开始抛出类型的错误:"范围类的复制方法失败"。

然后我必须重新启动Excel文件才能再次开始工作。

您知道可能导致问题的原因吗?什么可能导致Range.Copy语句停止工作,然后在文件重新启动后再次开始工作?

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

的按钮启动
Sub NewActionButton()
    'Dim runState As New cRunState
    'Set runState = New cRunState
    If bProduction = True Then On Error GoTo ErrHandler

    'START
    Dim lStart As Long
    Dim lId As Long
    Dim lDate As Long
    Dim lEnd As Long
    Dim wks As Worksheet

    Set wks = GetSheetByCodename(ThisWorkbook, "wActions")
    lStart = 2
    lId = 3
    lDate = 2
    lEnd = 12

    Call NewRow(wks, lStart, lId, lDate, lEnd)
    'END

    On Error GoTo 0
Exit Sub
ErrHandler:
    MsgBox ("Ett of" & oe & "rutsett fel har skett.")
End Sub

我收到错误的程序。第一次失败时,它似乎在.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语句会插入新范围。然而,尽管如此,执行停止并且我收到错误消息" Range类的Insert方法失败。所以该行完成了工作,但我收到错误并且执行停止。

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

1 个答案:

答案 0 :(得分:0)

这可能与VB命令通常对应于Excel在其自己的界面中执行的命令有关。大多数情况下,这并不会导致任何问题 - 实际上它是宏录制工作的原因(即使它不能很好地工作)。但有时你会得到怪癖。这有点像其中一个(其中一个涉及复制/粘贴的其他一个通常是工作簿层上的任何交互,而不是粘贴命令会在最终调用粘贴时导致InvalidOperation异常。)

在这种情况下,我建议复制一些单元格,然后右键单击任何列或行。您将注意到插入选项已完全消除 - 只有#34;插入复制的单元格"的选项。只要工作表在CutCopyMode中,这仍然适用;当它出来时,Insert选项返回。我猜是

  • 当代码被禁止操作时,您的代码会尝试插入(而不是插入已复制的单元格)或
  • 当您尝试插入的范围只准备插入一些空白时,您的代码会尝试插入复制的单元格。

但是要确定这一点,你可能不得不对两种方法进行反编译,这超出了我的范畴。很高兴听到你提出解决方案。