Вот один из способов сделать то, что вы просите.(Или, по крайней мере, то, что я думаю, вы спрашиваете.)
Сначала разблокируйте все ячейки на листе.По умолчанию все они находятся в заблокированном состоянии (хотя это не вступит в силу, пока вы на самом деле не защитите лист), поэтому вам нужно сначала разблокировать их, иначе вы не сможете вводить какие-либо данные в любом месте, как только вы защититепростынь.Это можно сделать вручную (в 2003 году: выберите все ячейки, выберите «Формат»> «Ячейки»> «Защита»> снимите флажок «Заблокировано») или используйте VBA следующим образом:
Sub UnlockAll()
With Sheet1 ' Or whatever sheet you're working on
.Unprotect
.Cells.Locked = False
.Protect
End With
End Sub
Вышеуказанное необходимо выполнить только один раз.
Затем вы должны использовать событие Worksheet_Change
для динамической блокировки и разблокировки ячеек.В модуле вашего листа напишите этот код:
Private Sub Worksheet_Change(ByVal Target As Range)
Me.Unprotect
If Not IsEmpty(Target) Then
'Data was added in target cell. Lock its neighbours.
Me.Cells(Target.Row, 1).Resize(, 4).Locked = True
Target.Locked = False
Else
'Data was erased from target cell. Release its neighbours.
Me.Cells(Target.Row, 1).Resize(, 4).Locked = False
End If
Me.Protect
End Sub
Скажем, вы записываете данные в ячейку B2;это заблокирует ячейки B1, B3 и B4, так что данные не могут быть введены.Если позже вы решите очистить ячейку B2, это разблокирует B1, B3 и B4.