我有一個(簡化示例)由輸入和警報組成的矩陣。每個動作(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