2015-04-01 43 views
1

我有一个(简化示例)由输入和警报组成的矩阵。每个动作(X)应具有一个输入和一个报警即不行动应在6强制粘贴值以遵守数据验证规则

我使用的数据验证,以实现此塔E或行被插入和它的工作原理。

然而,如果我粘贴到这些细胞中,它们不遵守验证规则的数据。我插入这个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来输入;警报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 

现在这圈子无效细胞,如果发现产生味精盒。这是基于无效圆是形状的事实而完成的。我可以通过搜索整个工作表来获取代码,但我试图将搜索范围缩小到指定的范围。但是,由于shp.TopLeftCell,我得到错误“1004 - 应用程序定义或对象定义的错误”。有任何想法吗?

+0

有太多的答案需要解决这个问题。 J-Walk的代码是防止单元格粘贴到数据验证范围的具体示例。你是否重新进行验证并检查整个范围内的无效条目;定义复制范围然后测试它;显示消息或突出显示无效单元格;在允许用户编辑并替换它们的表单中列出无效单元格? – 2015-04-01 09:52:20

+0

第一或第三条建议是我正在寻找的。我希望让用户知道他粘贴的数据是否违反了数据验证规则。这可以通过错误/警告消息或突出显示无效单元格,无论哪个可能。 – oliveirano25 2015-04-01 10:02:43

+0

你将不得不尝试它,当你遇到你无法解决的事情时回来。 SO不是代码写入服务。我会帮助你在正确的方向,但只有到目前为止。 – 2015-04-01 10:06:50

回答

0

决定不下去形状的路线,而是搜索验证值:

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

这个想法是为没有VBA知识或数据验证的人按照自己的意愿进行复制和粘贴而被告知他们正在违反规则。 – oliveirano25 2015-04-02 09:02:12

-1

而是单击该单元格,打糊,单击单元格并粘贴数据代入公式栏的顶部Excel中。然后按回车。这使我可以从剪贴板粘贴文本,但保留数据验证。

我只用excel和外部来源的文本和数字来测试它,从来没有使用高级公式等,所以它可能无法满足所有需求。

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