Excel VBA: как заблокировать (сделать только для чтения) определенный диапазон в Excel - PullRequest
1 голос
/ 16 октября 2019

Я работаю над инструментом мониторинга планирования, и мне нужно заблокировать диапазон ячеек на основе условия (точнее: на основе значения ячейки).

Вот пример: что бы яхотелось бы получить следующее: когда значение в столбце «Q» равно «Подтверждено», ячейки в одной и той же строке от столбца М до Q блокируются.

enter image description here

Вот код, который я сейчас запускаю:

Sub planning_blocker()

Dim last_row As Integer

' Compute the last row
last_row = Worksheets("Planning").Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print last_row

For i = 3 To last_row

If Worksheets("Planning").Cells(i, 17).Value = "" Then
    Sheets("Planning").Range("M" & i & ":" & "P" & i).Locked = False

Else
    Sheets("Planning").Range("M" & i & ":" & "P" & i).Locked = True

End If

Next i

Sheets("Planning").Protect Password:="User"

End Sub

Это работает частично потому, что: - он блокирует всю строку, где обнаруживается «подтвержденный», а не только диапазон - эторассмотрим только первую строку, в которой обнаружено «подтверждено», а не остальные (если у меня более одной строки, помеченной «подтверждено», блокируется только первая строка).

Я новичок вVBA, так что я действительно не знаю, где ошибка.

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Что ж, если вам нужно следить за изменениями в столбце status , я бы предложил использовать Sub Worksheet_Change. это будет запускать ваш код каждый раз, когда что-то меняется на вашем листе.

Я внес некоторые изменения, чтобы адаптировать ваш код, и вот результат:

Sub Worksheet_Change(ByVal target As Range)
    Dim intesection As Range
    Dim rowIndex As Integer
    Set intesection = Intersect(target, Range("Q:Q"))

    'watch changes in intersection (column Q)
    If Not intesection Is Nothing Then
        'get row index of changed status
        rowIndex = Range(intesection.Address(0, 0)).Row

        If Cells(rowIndex, 17).Value = "" Then
            'unlock if status is blank
            ActiveSheet.Range("M" & rowIndex & ":" & "P" & rowIndex).Locked = False
            Call ActiveSheet.Protect(UserInterfaceOnly:=True, Password:="User")

        Else
            'lock if not blank
            ActiveSheet.Range("M" & rowIndex & ":" & "P" & rowIndex).Locked = True
            Call ActiveSheet.Protect(UserInterfaceOnly:=True, Password:="User")
        End If
    End If

End Sub

И вам нужно добавить это кsheet где у вас есть таблица, которую вы хотите заблокировать / разблокировать.

Примерно так: enter image description here

Источники:

Как заблокировать данные в ячейке

Как определить, изменилась ли ячейка

0 голосов
/ 16 октября 2019

Я проверил ваш код, и он работает для меня (Excel2016). диапазоны (M: P) блокируются, если 17-й столбец (столбец Q) текущей строки не пуст. нет, в чем может быть ваша проблема здесь ...

...