Защита ячейки, но возможность работы с раскрывающимся списком

Я хочу защитить ячейку, в которой есть раскрывающийся список, но все же хочу, чтобы раскрывающийся список работал.

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

Я получаю это сообщение об ошибке

"Ячейка или диаграмма, которую вы пытаетесь изменить, защищена и, следовательно, доступна только для чтения. Чтобы изменить защищенную ячейку или диаграмму, сначала снимите защиту с помощью команды" Незащищенный лист "(вкладка" Обзор ", группа" Изменения "). Возможно, вам будет предложено ввести пароль. ".

5 ответов

Раскрывающийся список прикреплен к ячейке. Вот где хранятся данные. Проверка будет гарантировать, что данные действительны.

Если вы этого еще не сделали, убедитесь, что ячейка не заблокирована. Щелкните правой кнопкой мыши ячейку, выберите ячейки формата и перейдите на вкладку "Защита". Флажок Заблокировано должен быть снят.

Я думаю, что этот вопрос мог быть неправильно истолкован. Если да, и если я правильно это понимаю, то вот решение.

Excel на самом деле позволяет пользователю электронной таблицы перезаписывать ячейку, которая использует список проверки; если список включает значения «Яблоко», «Персик» и «Апельсин», стандартная операция позволяет пользователю ввести «Брокколи» в ячейку, если она незащищена, так же, как если бы к ней не был прикреплен проверочный список. Однако защита ячейки и листа отключает возможность выбора элемента из списка проверки, и это может быть проблемой.

Если проблема в этом, вот решение:

      1.  Format the cell using the validation list so it's 
    unprotected. 
2.  With the cursor positioned at that cell, open the 
    Validation menu origintally used to identify the validation 
    list. 
3.  On the Settings tab of the Data Validation window pane,
    be sure that "ignore blank" is unchecked, and 
    continue to leave that window pane open. 
4.  On the "Error alert" tab of the Data Validation window
    pane:  
      a) Be sure "Show error alert after invalid data is
         entered" is checked. 
      b) Select "Stop" under the "Style" heading.
      c) Give your error alert a name under "Title"; this 
         can be anything, but a short title is best. 
      d) Under "Error message", type a short message that you
         want to appear if a user tries to manually type a value
         in the cell - something like "Please use the drop-down
         menu provided to select a value for this cell."
      e) Click "OK". 

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

На моем компьютере (ПК под управлением Excel 2010) сам выпадающий список, кажется, непосредственно прикреплен к ячейке справа. Поэтому, если я хочу раскрывающийся список в A7, я должен разблокировать как A7, так и B7.

Это может быть ошибкой, но это относительно простое исправление.

Некоторые другие ответы затронули проблему: вы не можете защитить ячейку, потому что тогда пользователь не сможет изменить ее значение даже с помощью раскрывающегося списка, и вы не сможете оставить ее незащищенной, потому что кто-то может скопировать и вставить ее. текст непосредственно в ячейку, несмотря на проверку данных. Однако, несмотря на то, что проверка данных не предотвращает вставку данных, она все равно выполняется и все равно знает, что ячейка не соответствует правилам проверки. Если вам удобно добавлять макрос, вы можете добавить приведенный ниже код на любой лист, нуждающийся в такой защите.

      Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Validation.Value = False Then Application.Undo
End Sub

Альтернативно вы можете добавить этот макрос вчтобы он защитил все рабочие листы. Однако имейте в виду, что это будет срабатывать при каждом изменении каждой ячейки на каждом листе. Если у вас есть какой-то автоматизированный процесс, который одновременно изменяет множество ячеек, это может замедлить этот процесс.

      Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Validation.Value = False Then Application.Undo
End Sub

Оба этих макроса выполняют одну и ту же функцию: после изменения они оценивают проверку данных измененной ячейки, если таковые имеются. Если эта проверка сообщает, что содержимое ячейки не соответствует требованиям, она выполняет действие «Отменить», чтобы отменить редактирование. Однако это работает только тогда, когда лист защищен. Если лист не защищен и кто-то скопирует и вставит ячейку, все , включая проверку данных , будет перезаписано, и проверять больше будет не на что.


Посмотрите, что происходит, когда я пытаюсь скопировать/вставить конец этого видео.

В защищенных листах:

Вставить ссылку ниже в книгу

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim wsh As Variant
    For Each wsh In Worksheets(Array("Sheet1"))
        wsh.EnableOutlining = True
        wsh.Protect UserInterfaceOnly:=True, Password:="", _
            DrawingObjects:=False, _
    Contents:=True, _
    Scenarios:=True, _
    AllowFormattingCells:=False, _
    AllowFormattingColumns:=False, _
    AllowFormattingRows:=False, _
    AllowInsertingColumns:=False, _
    AllowInsertingRows:=False, _
    AllowInsertingHyperlinks:=False, _
    AllowDeletingColumns:=False, _
    AllowDeletingRows:=False, _
    AllowSorting:=False, _
    AllowFiltering:=False, _
    AllowUsingPivotTables:=False
    Next wsh

Dim Oldvalue As String
Dim Newvalue As String

On Error GoTo Exitsub
If Target.Address = "$C$2" Then 'As required
    If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then
    GoTo Exitsub
    Else: If Target.Value = "" Then GoTo Exitsub Else
        Application.EnableEvents = False
        Newvalue = Target.Value
        Application.Undo
        Oldvalue = Target.Value
        If Oldvalue = "" Then
            Target.Value = Newvalue
        Else
            Target.Value = Oldvalue & ", " & Newvalue
        End If
    End If
End If


Exitsub:
Application.EnableEvents = True

End Sub
Другие вопросы по тегам