首先我要说的是,我对任何形式的编码都很陌生,VBA 是我第一次尝试学习它,而且我学得并不快。
我的问题是我有一张表,我打算将其提供给供应商,让他们填写我们的产品信息。我提供了下拉菜单,并尝试创建一些公式来减少供应商必须做的工作,同时还控制我返回的数据是有意义的。不幸的是,供应商决定复制并粘贴下拉选项,从而覆盖数据验证,使我最初投入的工作变得多余,同时删除任何形式的数据标准化。
我想创建一些代码,使我能够限制复制和粘贴单元格的能力
我关注了很久以前发布的一个帖子:
在第二个源线程中,有一个讨论有助于描述我的确切挑战,但不会导致答案评论中的任何地方
以下是我正在使用的代码
`Dim boolDontShowAgain As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Whoa
Application.EnableEvents = False
'Does the validation range still have validation?
If Not HasValidation(Range("PIM - MASTER DATA!A3:A999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!G3:G999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!H3:H999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!I3:I999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!O3:O999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!P3:P999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!Q3:Q999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!R3:R999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!S3:S999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!R3:R999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!AF3:AF999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!AG3:AG999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!BG3:BG999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!BH3:BH999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!BR3:BR999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!BS3:BS999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!CG3:CG999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!CH3:CH999")) Then RestoreValidation
If Not HasValidation(Range("PIM - MASTER DATA!CI3:CI999")) Then RestoreValidation
Letscontinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume Letscontinue
End Sub
Private Sub RestoreValidation()
Application.Undo
If boolDontShowAgain = False Then
MsgBox "Your last operation was canceled." & _
"It would have deleted data validation rules.", vbCritical
boolDontShowAgain = True
End If
End Sub
Private Function HasValidation(r) As Boolean
On Error Resume Next
Debug.Print r.Validation.Type
If Err.Number = 0 Then HasValidation = True
End Function`
尝试下面的代码,列的条件设置为1(A)和5(E),并且不触发第1行(cell.Row > 1)。根据您的特定列和行的需要进行调整。
Dim AllowUndo As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
On Error GoTo ErrorHandler
Application.EnableEvents = False
' Check if undo operation is allowed
If AllowUndo Then
AllowUndo = False
GoTo ExitProcedure
End If
For Each cell In Target
If (cell.Column = 1 And Not HasValidation(cell) And cell.Row > 1) Or _
(cell.Column = 5 And Not HasValidation(cell) And cell.Row > 1) Then
GoTo RestoreValidation
End If
Next cell
ExitProcedure:
Application.EnableEvents = True
Exit Sub
RestoreValidation:
MsgBox "Your last operation was canceled." & _
"It would have deleted data validation rules.", vbCritical
' Enable undo operation
AllowUndo = True
Application.EnableEvents = True
Application.Undo
Exit Sub
ErrorHandler:
MsgBox Err.Description
Resume ExitProcedure
End Sub
Private Function HasValidation(r As Range) As Boolean
On Error Resume Next
If Err.Number = 0 Then HasValidation = Not IsEmpty(r.Validation.Type)
End Function