保护 CELL 但允许下拉选项

保护 CELL 但允许下拉选项

我想保护一个单元格,但也允许用户从下拉列表中选择选项?

我读了下面的问题,但没有提供答案。

保护单元格,但允许下拉列表工作

取消保护单元格不是我想要做的,因为用户可以简单地粘贴到单元格上,然后数据验证就消失了。

有没有办法锁定单元格并启用工作表保护,但仍允许选择数据验证列表选项?

我会尝试任何选项,包括 VBA。

答案1

可能有更好的方法,但我有一个想法,而且到目前为止,通过我的测试,它似乎效果很好。

因此我使用Worksheet_SelectionChange它来监视用户对列表的操作。
我只需在选定单元格时解锁工作表,然后在选定其他内容时再次锁定它:
请注意我的列表在 N26

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("N26")) Is Nothing Then
    ActiveSheet.Unprotect
Else
    ActiveSheet.Protect
End If
End Sub

显然,这个问题在于您应该能够选择单元格,然后粘贴任何内容。

所以我们需要检查用户是否正在粘贴某些内容,我在这里发现了一些有趣的东西:https://stackoverflow.com/questions/27818152/excel-vba-how-to-detect-if-something-was-pasted-in-a-worksheet

因此我们可以检查是否已粘贴内容并将其撤消。

我将它们放在一起并进行了修改,以便用户可以粘贴到任何未锁定的单元格中,但不能粘贴到N26

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("N26")) Is Nothing Then 'Data validation list adress
    ActiveSheet.Unprotect
Else
    ActiveSheet.Protect
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("N26")) Is Nothing Then
  Dim UndoList As String
  '~~> Get the undo List to capture the last action performed by user
  UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1)

  '~~> Check if the last action was not a paste nor an autofill
  If Left(UndoList, 5) = "Paste" Then
        With Application
            .EnableEvents = False
            .Undo                  'Undo paste
            .EnableEvents = True
        End With
  End If
End If
End Sub

请注意,如果您使用的不是英文版 Excel,其中一些值可能会发生变化。我不得不将其更改"&Undo"(UndoList, 5) = "Paste"我的语言。

我想你也可以用这个来回答你的下一个问题。如果你再次允许粘贴,但随后检查每个更改是否粘贴,如果是,则运行IsNumeric(Target.value)检查,如果失败则撤消。

相关内容