我有一个(简化示例)矩阵,由输入和报警组成。每个动作(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 - 应用程序定义的或对象定义的错误”。有什么想法吗?
答案 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和外部资源中使用文本和数字进行测试,从不使用高级公式等,因此可能无法满足所有需求。
每次粘贴是一个额外的步骤,但它为我需要检查字符数的特定项目节省了大量时间。