Как динамически заблокировать и разблокировать ячейку в Excel? - PullRequest
0 голосов
/ 28 октября 2019

Что я должен сделать, чтобы динамически заблокировать / разблокировать мою ячейку в Excel? Например, если я создаю новый документ, по умолчанию все ячейки разблокированы, но я ввел данные в эту ячейку, они будут заблокированы. Я попробовал это, что я нашел здесь Блокировка пустых ячеек и разблокировка свободных ячеек

Sub test()
    Dim rngTemp As Range

    For Each rngTemp In Range("A1:XFD1048576").Cells
        With rngTemp
            If .Value > 0 Or Len(.Value) > 0 Then
                .Locked = False
            End If
        End With
    Next
End Sub

, но это не работает в моем случае. Я использую версию 2007 Excel. Мне все еще нужно сохранить код или Alt + Q достаточно?


РЕДАКТИРОВАТЬ: Согласно ответу @ JvdV, я попробовал следующее:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
With Sheet1
    .Unprotect
    .Cells.Locked = True
    .Cells.SpecialCells(xlCellTypeBlanks).Locked = False
    .Protect
End With
End Sub

Но это возвращает ошибку Run-time error '1004' No cells were found на .Cells.SpecialCells(xlCellTypeBlanks).Locked = False.

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Если вы действительно ввели в эти ячейки, вы можете просто сослаться на ячейки рабочего листа. Кроме того, нет необходимости циклически проходить по этим ячейкам, например:

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

1 голос
/ 28 октября 2019

В качестве дополнения к (правильному) ответу выше, вот мое предложение для события Worksheet_Change, как вы просили в комментариях. Это должно быть помещено в модуль кода рабочей книги:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cll As Range
On Error Resume Next

For Each cll In Target.Cells
    With cll
        If .Value2 <> vbNullString Then
            .Locked = True
        Else
            .Locked = False
        End If
    End With
Next
End Sub

Важно отметить, что (по крайней мере, в моей версии Excel) свойство .Locked ячейки влияет толькокогда лист защищен. Однако для изменения значения свойства .Locked лист не должен быть защищен. Чтобы включить это, вы можете использовать что-то вроде этого:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cll As Range
On Error GoTo Handler

Me.Unprotect
For Each cll In Target.Cells
    With cll
        If .Value2 <> vbNullString Then
            MsgBox cll.Value2
            .Locked = True
        Else
            MsgBox "NullString"
            .Locked = False
        End If
    End With
Next
Handler:
    Me.Protect
End Sub

Это приведет к тому, что каждая ячейка станет неизменяемой после ввода значения, но при этом пользователь сможет вводить значения во все пустые ячейки. Чтобы изменить существующие значения, вам нужно снять защитную пленку вручную. Вы можете использовать что-то вроде кода, приведенного в ответе выше, чтобы восстановить желаемое состояние после того, как лист был незащищен и изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...