VBA xlPasteValues在第二次运行时失败

我有一个简短的代码,基本上复制到另一个选定的行,并从第一个删除它。

由于某种原因,当我运行这个,它会运行得很好,如果我然后select不同的行,我得到一个pasteSpecial method of RangeClass failed错误。

 Sub Completed() Dim trackerRow As Integer, compRow As Integer, answer As Integer Application.ScreenUpdating = False Application.CutCopyMode = False trackerRow = ActiveCell.Row compRow = Sheets("Completed").Cells(Rows.Count, "B").End(xlUp).Row If trackerRow < 3 Then Exit Sub If Cells(trackerRow, 2) = "" Then MsgBox "This row is empty, please select the candidate you want to move.", vbExclamation, "Empty Row" Else answer = MsgBox("Are you sure you want to move " & Cells(trackerRow, 3).Value & "?", vbYesNo, "Confirm move?") If answer = vbYes Then 'move row Rows(trackerRow).EntireRow.Copy With ThisWorkbook With .Sheets("Completed") .Activate .Unprotect "HSBC2017" .Cells(compRow + 1, 1).PasteSpecial xlPasteValues '**error line**. .Protect "HSBC2017" End With With .Sheets("Tracker") .Unprotect "HSBC2017" .Rows(trackerRow).EntireRow.Delete .Protect "HSBC2017" .Activate End With End With End If End If Application.ScreenUpdating = True Application.CutCopyMode = False End Sub 

我不知道为什么当我打开文档时,它会工作一次,但你必须重新打开运行第二次?

每次您崩溃到一个debugging,您保留目标完成工作表不受保护。 closures工作簿并重新打开它将不受保护。

取消保护不受保护的工作表不会取消.CutCopyMode,但取消保护受保护的工作表。

因此,在第一次使用不受保护的目标工作表的情况下,剪贴板上有一些东西(并且在Tracker工作表上的“复制行”上有“跳舞的ant”)。 由于一切都运行完毕,目标Completed工作performance在受保护,而第二个运行将在工作表未受保护时取消.CutCopyMode。 您可以通过使用F8单步执行代码来观察此情况,只要您再次解除“已完成”工作表的保护,就可以在“跟踪器”工作表上看到“跳舞的ant”从复制区域消失。

可能的解决scheme(点击Peh和Rory评论):

使用密码和UserInterfaceOnly保护工作表。

 with worksheets("Completed") .Protect Password:="HSBC2017", UserInterfaceOnly:=True end with 

这只需要做一次,你可以从未来的子过程操作中删除.Unprotect和.Protect代码。 只有用户手动执行的操作才会受到限制。

取消保护目标工作表后,从源工作表中启动副本。

 with worksheets("Completed") .Unprotect Password:="HSBC2017" worksheets("Tracker").Rows(trackerRow).EntireRow.Copy .Cells(compRow + 1, 1).PasteSpecial xlPasteValues .Protect Password:="HSBC2017" end with