我想保护一个单元格,但也允许用户从下拉列表中选择选项?
我读了下面的问题,但没有提供答案。
取消保护单元格不是我想要做的,因为用户可以简单地粘贴到单元格上,然后数据验证就消失了。
有没有办法锁定单元格并启用工作表保护,但仍允许选择数据验证列表选项?
我会尝试任何选项,包括 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)
检查,如果失败则撤消。