Макрос VBA — оптимизация

Мне нужна помощь. Я работаю с документом Excel, который имеет более 200 строк и 25 столбцов. Приведенный ниже код пытается заблокировать и разблокировать данные из строки F3 и столбцов G, H, I и J3. Есть ли способ очистить код и заставить код выполнять этот процесс для всех строк F3: F200? Я пытаюсь избежать необходимости делать код для каждой строки (например, F4 и остальная часть кода, затем F5 и так далее). Любые идеи?

Спасибо заранее.

Private Sub Worksheet_Change(ByVal Target As Range)


    ActiveSheet.Unprotect Password:="code"

    If Range("F3") = "Yes" Then
    Range("G3").Locked = False
    Range("H3").Locked = False
    Range("I3").Locked = False
    Range("J3").Locked = False

    ElseIf Range("F3") = "No" Then
    Range("G3").Locked = True
    Range("H3").Locked = True
    Range("I3").Locked = True
    Range("J3").Locked = True

    End If



    ActiveSheet.Protect Password:="code"

  End Sub

  Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  End Sub

person redfoxbat    schedule 23.01.2018    source источник
comment
Что, если пользователь удалит значение из столбца F? Должно ли это изменить заблокированный статус в этой строке? Возможны ли другие значения, кроме Yes/No/{blank}?   -  person Tim Williams    schedule 23.01.2018
comment
Чтобы уточнить, код работает как есть. Мне интересно, есть ли способ избежать необходимости кодировать каждую строку (каждую F3, F4 и т. д.) и последующие G, H, I, J на ​​всем протяжении 200 строк и 25 столбцов. Первоначально я играл с концепцией сообщения Excel — если Range (F3: F200) и Range (G3: G200) — будет ли это работать для выполнения того, что мне нужно? И это не так. Итак, я здесь в надежде, что кто-то уже нашел способ сделать это. Кстати, спасибо Тиму за исправление кода. Плохая копия и вставка с моей стороны. :-)   -  person redfoxbat    schedule 23.01.2018
comment
МОЙ БОГ!!! Я бесконечно благодарна!!! Ваш код сработал. Сейчас я изучу сценарий и изучу то, что вы предоставили. Спасибо, ТИМ. А+++   -  person redfoxbat    schedule 23.01.2018


Ответы (2)


Что-то вроде этого:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range, v

    ActiveSheet.Unprotect Password:="code"

    For Each c in Range("F3:F200")
        v = c.Value
        If v = "Yes" or v = "No" then
            c.Offset(0,1).Resize(1,4).Locked = (v = "No")
        End If
    Next c

    ActiveSheet.Protect Password:="code"

End Sub
person Tim Williams    schedule 23.01.2018

Вот быстрое переписывание, которое зацикливается на всем диапазоне... мой единственный вопрос был, есть ли да/нет в каждой строке, чтобы указать заблокировано/разблокировано?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long

ActiveSheet.Unprotect
For i = 1 To 200
    If Cells(i + 2, 6) = "yes" Then
        Range(Cells(i + 2, 7), Cells(i + 2, 10)).Locked = False
    ElseIf Cells(i + 2, 6) = "no" Then
        Range(Cells(i + 2, 7), Cells(i + 2, 10)).Locked = True
    End If
Next i
ActiveSheet.Protect

  End Sub
person Reverus    schedule 23.01.2018