2017-04-26 69 views
1

基本的に選択された行を別のシートにコピーし、最初の行から削除する短いコードがあります。2回目の実行時にVBA xlPasteValuesが失敗する

これを実行すると何らかの理由で正常に実行されますが、別の行を選択すると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 

私はドキュメントを開いたときに一度は機能しますが、もう一度開くには再度開く必要があります。

+3

サイドノート:あなたは '.PROTECTパスワードを使用して、シートを保護する場合:=「HSBC2017」、UserInterfaceOnly:= true'を一度、あなたは後で任意のマクロアクションのためにそれの保護を解除する必要はありません。このようにして、シートはユーザーアクションからのみ保護されますが、マクロは引き続き実行できます。 [Worksheet.Protectメソッド(Excel)](http://msdn.microsoft.com/en-us/library/office/ff840611.aspx)を参照してください。 –

+3

貼り付け直前にコピーをすることをお勧めします: 'Sheets(" Tracker ")。行(trackerRow).EntireRow.Copy'を' .Cells(compRow + 1,1).PasteSpecial xlPasteValues'の直前に置く。 – Rory

+0

@Roryそれは明示的に宣言していないのでコピーされた行を変更します – Tom

答えて

2

デバッグにクラッシュするたびに、宛先Completedワークシートは保護されません。ブックを閉じて再度開くと、保護されません。

保護されていないワークシートの保護を解除しても、.CutCopyModeはキャンセルされませんが、保護されていないワークシートは保護されません。

保護されていないデスティネーションワークシートがある最初のスルースルーでは、クリップボードに何かがあります(また、トラッカーワークシートの行コピーには「ダンスアリ」があります)。すべてが実行されるため、ワークシートが保護されていない場合、宛先Completedワークシートは保護され、2つ目のRun-Throughは.CutCopyModeを取り消します。これを見るには、F8でコードをステップ実行し、完了したワークシートの保護をもう一度解除するとすぐにトラッカーワークシートのコピー領域から「ダンスアリ」が消えるのを見てください。 (PehRoryからのコメントにうなずきで)

考えられる解決策:

は、パスワードと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 
+0

その説明は理にかなっています。私はこれを将来思いつきます。 'UserInterfaceOnly'のための[Peh](http://stackoverflow.com/users/3219613/peh)のおかげで、私は気づいていなかったものの、非常に便利なものになりました。 –

関連する問題