У меня есть макрос 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?). Затем макрос выводится на следующую строку, потому что он пытается внести изменения в защищенный лист.
Как это исправить и предотвратить слишком быстрое блокирование листа?
первая строка: «ByVal Target As Row» должен быть «ByVal Target As Range» – NiH
Спасибо, внесли поправки в вопрос – ryansin
Вы действительно назначаете '' New Value''? Можете ли вы воспроизвести проблему с точным кодом, каким вы его дали в своем вопросе? (за исключением пароля, конечно) – trincot