强制粘贴值以遵守数据验证规则

时间:2015-04-01 09:15:40

标签: excel vba validation

我有一个(简化示例)矩阵,由输入和报警组成。每个动作(X)都应有一个输入和一个警报,即不应在E列或第6行插入任何动作。

我使用数据验证来实现它并且它可以工作。

但是,如果我将数据粘贴到这些单元格,则它们不遵循验证规则。我插入了这个VBA代码以防止这种情况(摘自www.j-walk.com/ss/excel/tips/tip98.htm):

Private Sub Worksheet_Change(ByVal Target As Range)
    'Does the validation range still have validation?
    If HasValidation(Range("ValidationRange")) Then
        Exit Sub
    Else
       Application.EnableEvents = False
       Application.Undo
        MsgBox "Your last operation was canceled." & _
        " It would have deleted data validation rules.", vbCritical
    End If
End Sub

Private 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

但是,此代码还可以防止将值粘贴到单元格中,即使它们不会破坏验证规则,例如如果我粘贴一个X输入a;报警1,我收到一条错误信息。有没有办法阻止值只有在它们破坏验证规则时被粘贴?

编辑:

我已将代码更改为:

Private Sub Worksheet_Change(ByVal Target As Range)

With Range("D4:H8").Validation
        .Delete
        .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=OR(ISBLANK(D4),AND(NOT(ISBLANK($C4)),NOT(ISBLANK(D$3))))"
        .IgnoreBlank = False
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = "Stop"
        .InputMessage = ""
        .ErrorMessage = "Actions Must Have Input and Output"
        .ShowInput = True
        .ShowError = True
    End With

Me.CircleInvalid

Count = 0
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
    If Not Intersect(shp.TopLeftCell, Range("D4:H8")) Is Nothing Then Count = Count + 1
Next

If Count > 0 Then
MsgBox "Actions Must Have Input and Output"
End If

End Sub

现在这会循环无效的单元格并生成一个msg框(如果找到一个)。这是基于无效圆是形状的事实来完成的。我可以通过搜索整个工作表来获取代码,但我正在尝试将搜索范围缩小到指定范围。但是由于shp.TopLeftCell,我收到错误“1004 - 应用程序定义的或对象定义的错误”。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

决定不沿形状路线走,而是搜索验证值:

Dim Cell As Range
For Each Cell In Range("D4:H8")
    If Not Cell.Validation.Value Then
        MsgBox "Actions Should Have Input and Output"
        Exit Sub
    End If
Next

答案 1 :(得分:-1)

尝试粘贴特殊;普通的粘贴会覆盖单元格的format属性。

答案 2 :(得分:-1)

单击单元格并将数据粘贴到excel顶部的公式栏中,而不是单击单元格并点击粘贴。然后按回车键。这允许我从剪贴板粘贴文本但保留数据验证。

我只在excel和外部资源中使用文本和数字进行测试,从不使用高级公式等,因此可能无法满足所有需求。

每次粘贴是一个额外的步骤,但它为我需要检查字符数的特定项目节省了大量时间。