我有一个(简化示例)由输入和警报组成的矩阵。每个动作(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 - 应用程序定义或对象定义的错误”。有任何想法吗?
有太多的答案需要解决这个问题。 J-Walk的代码是防止单元格粘贴到数据验证范围的具体示例。你是否重新进行验证并检查整个范围内的无效条目;定义复制范围然后测试它;显示消息或突出显示无效单元格;在允许用户编辑并替换它们的表单中列出无效单元格? – 2015-04-01 09:52:20
第一或第三条建议是我正在寻找的。我希望让用户知道他粘贴的数据是否违反了数据验证规则。这可以通过错误/警告消息或突出显示无效单元格,无论哪个可能。 – oliveirano25 2015-04-01 10:02:43
你将不得不尝试它,当你遇到你无法解决的事情时回来。 SO不是代码写入服务。我会帮助你在正确的方向,但只有到目前为止。 – 2015-04-01 10:06:50