我正在尝试使用此代码,基于我在网上找到的代码,防止数据验证被复制并粘贴到已定义数据验证的单元格中:
Private Sub Worksheet_Change(ByVal Target As Range)
'Does the validation range still have validation?
If HasValidation(Range("D3:D4")) Then
Exit Sub
Else
Application.Undo
MsgBox "Your last operation was canceled." & _
"It would have deleted data validation rules.", vbCritical
End If
End Sub
Function HasValidation(r) As Boolean
' Returns True if every cell in Range r uses Data Validation
On Error Resume Next
x = r.Validation.Type
If Err.Number = 0 Then HasValidation = True Else HasValidation = False
End Function
但是,它总是触发撤消和错误对话框,即使我尝试编辑不相关的单元格,如果我注释掉On Error Resume Next
,我可以看到该行
x = r.Validation.Type
失败,错误1004。
发生这种情况是因为我在一个单元格中更新了数据验证的错误消息,但没有更新另一个单元格。
当我将错误消息复制并粘贴到该范围内其他单元格的数据验证中时,此问题就消失了。
结论:确保对范围内的所有单元格以完全相同的方式定义数据验证,包括错误消息。
如果您使用具有不同规则/列表的数据验证范围,则还需要单独检查它们(不要将不连续的并集验证范围定义为HasValidation函数的输入) - 否则它也将通过错误1004。
'Does the validation ranges still have validation? Need to be checked seperately, otherwise error 1004
If HasValidation(Range("ValidationRangeA")) = True And _
HasValidation(Range("ValidationRangeB")) And _
HasValidation(Range("ValidationRangeC")) And _
HasValidation(Range("ValidationRangeD")) Then
Exit Sub
Else
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
MsgBox "Your last operation was canceled." & _
"It would have deleted data validation rules.", vbCritical
End If
结束子