2016-04-27 9 views
1

Ich habe ein VBA-Makro, das Zellen durchläuft, deren Werte geändert wurden, und ändert die Werte anderer Zellen in derselben Zeile.Excel VBA - Blatt wird zu schnell geschützt

Public Sub Worksheet_Change (ByVal Target As Range) 
    Dim r As Integer 
    Application.ScreenUpdating = false 
    ' Unprotect the sheet 
    ActiveSheet.Unprotect("password") 

    Set newRange = Range("K:K") 

    If Not Application.Intersect(newRange, Range(Target.Address)) Is Nothing Then 
     For Each cell in Target.Cells  
      ' Change the values of cells in the same row 
      r = cell.Row 

      Cells(r, 2).Value = "New Value" 
      Cells(r, 3).Value = "New Value" ' Debug highlights this line 
      Cells(r, 4).Value = "New Value" 
      Cells(r, 5).Value = "New Value" 

     Next 


    End If 

    ' Reprotect the sheet 
    ActiveSheet.Protect Password:="password", AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, _ 
     AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True 
    Application.ScreenUpdating = True 

End Sub 

Ohne unprotecting/Erneuter Schutz des Blattes das Makro funktioniert gut, aber wenn hinzugefügt erzeugt es eine Runtime Error Application-Defined or Object-Defined error, aber nicht vor Eingang der ersten Zelle Wert Cells(r, 2).Value = "New Value" ändern.

Ich kann nur annehmen, dass dies daran liegt, dass das Blatt beim Start ungeschützt ist und die erste Zellenwertänderung abgeschlossen ist, bevor das Blatt dann gesperrt wird (vielleicht läuft es in einem separaten Thread zur For-Schleife?). Das Makro enthält dann Fehler in der folgenden Zeile, da versucht wird, eine Änderung an einem geschützten Blatt vorzunehmen.

Wie kann ich das beheben und verhindern, dass das Blatt zu schnell einrastet?

+0

erste Zeile: "ByVal Ziel als Zeile" sollte "ByVal Ziel als Bereich" sein – NiH

+0

Danke, änderte die Frage – ryansin

+0

Sind Sie wirklich zuweisen "New Value" '? Können Sie das Problem mit dem genauen Code reproduzieren, den Sie in Ihrer Frage angegeben haben? (außer für das Passwort natürlich) – trincot

Antwort

3

Sie ändern Zellen mit dem Ereignismakro.

Sie müssen:

Application.EnableEvents = False 

vor dem For Schleife und

Application.EnableEvents = True 

nach der For Schleife.

+1

Danke, Spot auf – ryansin

+0

@ user2696497 danke für die Rückmeldung. –

Verwandte Themen