Блокировка ячейки в диапазоне после ввода содержимого в Excel через VBA - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть таблица, которая служит точкой входа в инвентарь для ручного сканера. Когда код сканируется, сканер автоматически нажимает клавишу возврата и выбирает следующую ячейку вниз. Я хочу, чтобы ячейки, в которые было введено содержимое, автоматически защищались или блокировались, оставляя пустые ячейки доступными для редактирования.

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim MyRange As Range
    Set MyRange = Range("A:A")

    If Not MyRange Is Nothing Then
        Sheets("Data In").Unprotect Password:="mypassword"
        MyRange.Locked = True
        Sheets("Data In").Protect Password:="mypassword"
    End If

End Sub

Опять же, очень плохо знаком с VBA, поэтому, если я упускаю что-то сверхъестественное, пожалуйста, дайте мне знать.

Спасибо !!

1 Ответ

1 голос
/ 08 ноября 2019

Я считаю, что ваша проблема на самом деле в том, что вы не разблокируете остаток от пустого диапазона . Это будет блокировать только те ячейки в столбце А., которые уже имеют значения.

Как и BigBen, я бы также предложил использовать Worksheet_Change вместо Worksheet_SelectionChange

Private Sub Worksheet_Change(ByVal Target As Range)

    With Me
        ''unprotect for VBA only
        .Protect Password:="mypassword", UserInterfaceOnly:=True

        ''lock entire column
        .Range("A:A").Locked = True

        ''unlock empty cells in the usedrange
        On Error Resume Next  'xlCellTypeBlanks will error out when there are no blank cells in the UsedRange
        .Range("A:A").SpecialCells(xlCellTypeBlanks).Locked = False

        ''unlock empty cells after the usedrange
        .Range(.Range("A" & UsedRange.Rows.Count + 1), .Range("A" & UsedRange.Rows.Count + 1).End(xlDown)).Locked = False
    End With

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