我有一张工作表,其中只有应编辑的单元格被解锁,然后整个工作表都受到保护。允许编辑的单元格之一设置了数据验证,基于 2 项列表。数据验证设置为允许List
和 的适当范围Source
。
验证在某种程度上是有效的,即选择下拉菜单中的两个选项之一会被接受,而输入列表中不包含的值则会被拒绝。
我遇到的问题是 Excel 允许我删除该单元格的内容(我不想这样做 - 我希望它始终包含列表中的两个值之一)。在数据验证窗口中,我尝试选中和取消选中复选框Ignore blank
,但似乎没有任何效果。
理想情况下,我希望不需要 就能做到这一点VBA
,但如果这是唯一的方法,我就会让步。
以下是示例工作簿的链接- 对于Option4x
,您可以选择任一下拉选项,但不允许输入随机文本。但是,您也可以删除单元格的内容(我不想要)。
答案1
数据验证仅检查输入的数据是否符合规则/列表。由于单元格是可编辑的,因此 Excel 允许您删除输入的数据,但不允许写出列表。
如果您不允许删除已验证的数据,则需要禁用 Delete 键。下面编写的示例代码将帮助您阻止这些操作。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$9" Then Exit Sub
If Len(Target.Value) = 0 Then
Application.EnableEvents = False
Application.Undo
MsgBox "You can't Delete,,,!"
Application.EnableEvents = True
End If
End Sub
注意:由于 Excel 没有任何函数可以阻止该单元格,因此在这种情况下只有 VBA 可以起作用。
答案2
如果您愿意依赖数据验证单元格的“忽略空白”属性,则以下内容更容易维护...
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Validation.IgnoreBlank = False And Len(Target.Value) = 0 Then
Application.EnableEvents = False
Application.Undo
MsgBox "This cell can't be blank.", vbOKOnly + vbInformation, "Value Required"
Application.EnableEvents = True
End If
End Sub
所需的行为将会在任何您已指示不应忽略空白的数据验证单元格上强制执行......
通过这种方式,您不需要对任何范围进行硬编码。