2016-04-27 5 views
1

У меня есть макрос VBA, который проходит через ячейки, значения которых были изменены и изменяет значения других ячеек в той же строке.Excel VBA - лист слишком быстро защищен

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 

без снятия защиты/reprotecting листа макро работает нормально, но при добавлении он генерирует ошибку Runtime Application-Defined or Object-Defined error, но не перед изменением значения первой ячейки Cells(r, 2).Value = "New Value".

Я могу только предположить, что это связано с тем, что лист не защищен в начале и первое изменение значения ячейки заканчивается до того, как лист заблокирован (возможно, работает в отдельном потоке в цикле For?). Затем макрос выводится на следующую строку, потому что он пытается внести изменения в защищенный лист.

Как это исправить и предотвратить слишком быстрое блокирование листа?

+0

первая строка: «ByVal Target As Row» должен быть «ByVal Target As Range» – NiH

+0

Спасибо, внесли поправки в вопрос – ryansin

+0

Вы действительно назначаете '' New Value''? Можете ли вы воспроизвести проблему с точным кодом, каким вы его дали в своем вопросе? (за исключением пароля, конечно) – trincot

ответ

3

Вы меняете ячейки с помощью макроса события.

Вы должны:

Application.EnableEvents = False 

перед циклом For и

Application.EnableEvents = True 

после цикла For.

+1

Спасибо, место на – ryansin

+0

@ user2696497 благодарит за отзыв. –