Excel VBA Macro - Pt2 - PullRequest
       32

Excel VBA Macro - Pt2

1 голос
/ 20 марта 2020

Попытка запретить пользователю выбирать что-либо из трех столбцов с списком проверки данных

Целевой диапазон: (три столбца L: N), т.е. L3, M3, N3 до L40, M40, N40.

Если пользователь сначала не заполняет поле в столбце U

Целевой диапазон: U3-U40

Я пытался найти способ блокировки выбора ячеек если соответствующая ячейка не выбрана за последние несколько дней безрезультатно. Думаю, проблема в том, что в целевые ячейки на самом деле не введено значение, а вместо этого используется список из условного форматирования.

РЕДАКТИРОВАТЬ: Не уверен, если я сделал это ясно или нет, но каждая строка должна работать независимо от другие, т.е. хотят заблокировать L3, M3 и N3, если не заполнен U3, то же самое касается L4, M4 и N4, если не заполнен U4 .. et c

Спасибо! Эндрю.

1 Ответ

0 голосов
/ 20 марта 2020

В кодовом модуле листа, который вы хотите защитить sh, введите следующее ...

Private Sub Worksheet_Activate()
    Shield
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Shield
    If Len(Me.[u5]) Then Me.Unprotect '<-- change 'u5' to the cell in column U that unlocks
End Sub

Sub Shield()
    With Me
        .Unprotect
        .Cells.Locked = False
        .[L3:n40].Locked = True
        .Protect , 0, 1, 1, 1, 1, 1, 1, 1, 1, 1
    End With
End Sub

Обновление

Приведенный выше код работает, ввод отключить только одну ячейку U5, чтобы контролировать, заблокирован ли весь диапазон L3:N40.

Теперь я понимаю, что вы хотите, чтобы каждая строка L3:N40 была независимо заблокирована / разблокирована в зависимости от того, строка диапазона U3:U40 имеет значение.

Следующий код работает для этого нового сценария ...

Private Sub Worksheet_Activate()
    Shield
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Shield
End Sub

Sub Shield()
    Dim c
    With Me
        .Unprotect
        .Cells.Locked = False
        For Each c In .[u3:u40]
            If Len(c) = 0 Then c.Offset(, -9).Resize(, 3).Locked = True
        Next
        .Protect , 0, 1, 1, 1, 1, 1, 1, 1, 1, 1
    End With
End Sub
...