2017-04-26 8 views
1

Ich habe einen kurzen Code, der im Grunde eine ausgewählte Zeile in ein anderes Blatt kopiert und löscht es von der ersten.VBA xlPasteValues ​​schlägt auf dem zweiten Lauf

Aus irgendeinem Grund, wenn ich dies ausführen, wird es gut laufen, wenn ich dann eine andere Zeile auswählen, bekomme ich einen pasteSpecial method of RangeClass failed Fehler.

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 

ich nicht herausfinden können, warum, wenn ich das Dokument öffnen, wird es einmal funktioniert, aber Sie müssen wieder zu öffnen, ein zweites Mal laufen zu lassen?

+3

Randbemerkung: Wenn Sie Ihre Blätter mit '.Schutz Passwort schützen: =„HSBC2017“, Userinterfaceonly: = true' einmal, dann müssen Sie es nicht für alle Makroaktionen später aufzuheben. Auf diese Weise wird das Blatt nur vor Benutzeraktionen geschützt, aber Makros können trotzdem ausgeführt werden. Siehe [Worksheet.Protect-Methode (Excel)] (http://msdn.microsoft.com/en-us/library/office/ff840611.aspx). –

+3

Ich würde vorschlagen, dass Sie die Kopie unmittelbar vor dem Einfügen tun: 'Sheets (" Tracker "). Zeilen (TrackerRow). EntireRow.Copy' direkt vor '.Cells (compRow + 1, 1) .PasteSpecial xlPasteValues' – Rory

+0

@Rory das würde die kopierte Zeile ändern, da er sie nicht explizit deklariert hat. – Tom

Antwort

2

Jedes Mal, wenn Sie bei einem Debug-Vorgang abstürzen, lassen Sie das Ziel "Abgeschlossenes Arbeitsblatt" ungeschützt. Wenn Sie die Arbeitsmappe schließen und erneut öffnen, bleibt sie ungeschützt.

Das Aufheben des Schutzes eines ungeschützten Arbeitsblatts bricht den .CutCopyMode nicht ab, aber das Schützen eines geschützten Arbeitsblatts wird aufgehoben.

Also im ersten Durchlauf mit einem ungeschützten Zielarbeitsblatt ist etwas in der Zwischenablage (und Sie haben "tanzende Ameisen" auf der Zeile zu kopieren auf dem Tracker-Arbeitsblatt). Da alles durchläuft, ist das Arbeitsblatt Ziel abgeschlossen jetzt geschützt und ein zweiter Durchlauf wird den .CutCopyMode abbrechen, wenn das Arbeitsblatt nicht geschützt ist. Sie können dies beobachten, indem Sie mit F8 durch Ihren Code gehen und sehen, wie die "tanzenden Ameisen" aus dem Kopierbereich auf dem Tracker-Arbeitsblatt verschwinden, sobald Sie das Abgeschlossene Arbeitsblatt ein zweites Mal aufheben.

Mögliche Lösungen (mit einem Nicken auf die Kommentare von Peh und Rory):

das Arbeitsblatt mit einem Passwort und Userinterfaceonly schützen.

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

Dies hat nur einmal durchgeführt werden und Sie können sowohl den .Unprotect und .Schutz Code aus zukünftigen Unter Verfahren Operationen entfernen. Nur vom Benutzer manuell vorgenommene Aktionen sind eingeschränkt.

Initiieren Sie die Kopie aus dem Quellarbeitsblatt nach den Schutz des Zielarbeitsblattes.

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

Diese Erklärung macht durchaus Sinn, darauf werde ich in Zukunft achten. Und danke an [Peh] (http://stackoverflow.com/users/3219613/peh) für das 'UserInterfaceOnly', etwas, das mir nicht bekannt war, aber sehr nützlich sein wird. –

Verwandte Themen