我有一个简短的代码,基本上将选定的行复制到另一个工作表,并从第一个工作表中删除它。
出于某种原因,当我运行它时,它会运行得很好,如果我然后选择另一行,我会收到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
我无法理解为什么当我打开文档时它会工作一次,但是你必须重新打开才能再次运行?
答案 0 :(得分:2)
每次进入调试时,都会使目标“已完成”工作表不受保护。关闭工作簿并重新打开它会使其不受保护。
取消保护未受保护的工作表不会取消.CutCopyMode,但会取消保护受保护的工作表。
因此,在第一次使用不受保护的目标工作表时,剪贴板上会有一些内容(并且您在跟踪器工作表的行复制上跳过了蚂蚁)。由于所有内容都已运行,目标已完成的工作表现在受到保护,第二个贯穿期将在工作表未受保护时取消.CutCopyMode。您可以通过使用F8单步执行代码并观看跳舞的蚂蚁&#39;只要您再次取消保护已完成的工作表,就会从Tracker工作表上的复制区域中消失。
使用密码和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