2015-10-16 3 views
1

Я пытаюсь адаптировать следующий код, чтобы заблокировать соседние ячейки, когда колонна M содержит «NO»Блокировка смежной ячейки, если ячейка содержит определенный текст

Например, если M12 содержит «NO», я хотел бы, чтобы заблокировать «V12 : AG12, AI12: AT12"

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim rng1 As Range 
Dim c As Range 
Set rng1 = Intersect(Target, Range("M:M")) 
If rng1 Is Nothing Then Exit Sub 
ActiveSheet.Unprotect Password:="Password" 

With Application 
.ScreenUpdating = False 
.EnableEvents = False 
End With 

For Each c In rng1 
    Select Case LCase(c.Value) 
     Case Is = "YES" 
     ActiveSheet.Unprotect Password:="Password" 
     Cells(c.Row, 13).Resize(1, 12).Locked = False 
     Range(Cells(c.Row, "V"), Cells(c.Row, "AG")).Locked = False 
     Range(Cells(c.Row, "AI"), Cells(c.Row, "AT")).Locked = False 
     ActiveSheet.Protect Password:="Password" 
    Case Is = "NO" 
     ActiveSheet.Unprotect Password:="Password" 
     Range(Cells(c.Row, "V"), Cells(c.Row, "AG")).Locked = True 
     Range(Cells(c.Row, "AI"), Cells(c.Row, "AT")).Locked = True 
     ActiveSheet.Protect Password:="Password" 
    Case Else 
     ActiveSheet.Unprotect Password:="Password" 
     MsgBox "Please only input YES or NO in this column", vbCritical + vbOKOnly 
     ActiveSheet.Protect Password:="Password" 
     Exit Sub 
End Select 
Next c 

With Application 
.ScreenUpdating = True 
.EnableEvents = True 
End With 
ActiveSheet.Protect Password:="Password" 
End Sub 

Однако я запутался в , где я бы вставить условие „НЕТ“ в приведенном выше коде, а также как выбрать диапазон „Lock“

Прикрепленный изображение, демонстрирующее, что я пытаюсь достичь. enter image description here

Благодаря

ответ

0

Это должно делать то, что вы хотите:

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim rng1 As Range 
Dim c As Range 
Set rng1 = Intersect(Target, Me.Range("M:M")) 
If rng1 Is Nothing Then Exit Sub 

With Application 
    .ScreenUpdating = False 
    .EnableEvents = False 
End With 
Me.Unprotect Password:="Password" 

For Each c In rng1 
    Select Case LCase(c.Value) 
     Case Is = "yes" 
     Me.Cells(c.Row, 13).Resize(1, 12).Locked = False 
     Me.Range(Me.Cells(c.Row, "V"), Me.Cells(c.Row, "AG")).Locked = False 
     Me.Range(Me.Cells(c.Row, "AI"), Me.Cells(c.Row, "AT")).Locked = False 
    Case Is = "no" 
     Me.Range(Me.Cells(c.Row, "V"), Me.Cells(c.Row, "AG")).Locked = True 
     Me.Range(Me.Cells(c.Row, "AI"), Me.Cells(c.Row, "AT")).Locked = True 
    Case Else 
     MsgBox "Please only input YES or NO in this column", vbCritical + vbOKOnly 
     Exit Sub 
End Select 
Next c 

Me.Protect Password:="Password" 
With Application 
    .ScreenUpdating = True 
    .EnableEvents = True 
End With 

End Sub 

Обратите внимание, что я также включил линии, чтобы разблокировать ячейки, которые будут заблокированы «нет» так, чтобы они могли разблокировать, если вы измените значение на «ДА»

+0

Спасибо, что так быстро посмотрели! Очень ценно, функция блокировки, похоже, не работает. Я думаю, что это связано с защитой моего листа. Я немного поместил ваш код, но он все равно не блокирует соседние ячейки, когда условие «НЕТ». См. Исправленный код (в оригинальном вопросе). У вас есть какие-то дальнейшие идеи о том, как заставить это работать? –

+0

Хорошо, я также добавил защиту паролем (нет необходимости размещать его везде), и поскольку этот модуль является модулем листа, вам лучше использовать 'Me.', чем' ActiveSheet.'. Также будьте осторожны в своем коде, который вы использовали для проверки «НЕТ» и «ДА», но мы тестируем «LCase (c)», поэтому это будет только строчный регистр. – R3uK

Смежные вопросы