Если вы действительно ввели в эти ячейки, вы можете просто сослаться на ячейки рабочего листа. Кроме того, нет необходимости циклически проходить по этим ячейкам, например:
Sub test()
Dim rng As Range
With Sheet1 'Change according to your sheet's CodeName
.Unprotect
.Cells.Locked = False
.Cells.SpecialCells(xlCellTypeBlanks).Locked = True
.Protect
End With
End Sub
Где .Cells.Locked = False
разблокирует все ячейки, а .Cells.SpecialCells(xlCellTypeBlanks).Locked = True
блокирует все ячейки; пустые ячейки (Примечание. : a =""
значение в формулах считается значением и останется разблокированным)
И Unprotect
, и Protect
необходимы для полного эффекта ваших изменений.
Если этот код вы хотите запускать каждый раз при изменении значения, вам нужно посмотреть на событие Worksheet_Change
. И если ваша цель - разблокировать пустые ячейки и заблокировать ячейки, содержащие значение, просто поменяйте местами True
и False
.
EDIT (согласно вашемукомментарии)
Если это то, что вам нравится запускать при каждом следующем выборе ячеек, попробуйте следующее (обработчик ошибок включен, так как вы не используете весь рабочий лист nomore)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Sheet1.Unprotect 'Change according to your sheet's CodeName
With Target
.Cells.Locked = True
On Error Resume Next
.Cells.SpecialCells(xlCellTypeBlanks).Locked = False
On Error GoTo 0
End With
Sheet1.Protect
End Sub
Если выища альтернативу, в которой вы перебираете свой целевой диапазон, вы можете реализовать это предложение с помощью @ M.Schalk