我的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
答案 0 :(得分:0)
这可能与VB命令通常对应于Excel在其自己的界面中执行的命令有关。大多数情况下,这并不会导致任何问题 - 实际上它是宏录制工作的原因(即使它不能很好地工作)。但有时你会得到怪癖。这有点像其中一个(其中一个涉及复制/粘贴的其他一个通常是工作簿层上的任何交互,而不是粘贴命令会在最终调用粘贴时导致InvalidOperation异常。)
在这种情况下,我建议复制一些单元格,然后右键单击任何列或行。您将注意到插入选项已完全消除 - 只有#34;插入复制的单元格"的选项。只要工作表在CutCopyMode
中,这仍然适用;当它出来时,Insert选项返回。我猜是
但是要确定这一点,你可能不得不对两种方法进行反编译,这超出了我的范畴。很高兴听到你提出解决方案。