基于选定的数据验证禁止在特定列中粘贴功能,同时仍允许在同一数据验证列中粘贴

问题描述 投票:0回答:1

首先我要说的是,我对任何形式的编码都很陌生,VBA 是我第一次尝试学习它,而且我学得并不快。

我的问题是我有一张表,我打算将其提供给供应商,让他们填写我们的产品信息。我提供了下拉菜单,并尝试创建一些公式来减少供应商必须做的工作,同时还控制我返回的数据是有意义的。不幸的是,供应商决定复制并粘贴下拉选项,从而覆盖数据验证,使我最初投入的工作变得多余,同时删除任何形式的数据标准化。

我想创建一些代码,使我能够限制复制和粘贴单元格的能力

  1. 不包含数据验证
  2. 是与分配给该列的数据验证类型不同的数据验证类型
  3. 将特定列中的单元格复制并粘贴到同一列中 前任。 E:E 列有 3 个值可供选择(红、蓝、黄)。 G:G 列有 5 个值,可以从(大众、沃尔沃、MINI、梅赛德斯、捷豹)中选择。我希望 E:E 能够越过 E 列内部,但不能进入 G 列,即使两者都有数据验证。

我关注了很久以前发布的一个帖子:

初始源线程

辅助源线程

在第二个源线程中,有一个讨论有助于描述我的确切挑战,但不会导致答案评论中的任何地方

以下是我正在使用的代码

`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`
excel vba validation copy-paste restriction
1个回答
0
投票

尝试下面的代码,列的条件设置为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
© www.soinside.com 2019 - 2024. All rights reserved.