excel中复制粘贴事件期间未遵循数据验证规则

excel中复制粘贴事件期间未遵循数据验证规则,excel,vba,Excel,Vba,在这个启用了宏的工作表中,我对要调节数据输入的列进行了数据验证。我在这里面临的问题是,考虑到客户希望从另一个excel文件复制数据的情况。实现此方案时,我已将一些数据从外部excel复制到启用数据验证的工作表中。我有一个专栏,用户只能输入小于9的文本长度,但当我复制数据时,比如说文本长度大于9,这样的场景似乎不会显示任何错误消息。是否有一种解决方法可以帮助我克服这种情况 这是Excel的一个已知问题。如果用户将值粘贴到单元格中,则数据验证不起作用 但是,您可以做的是至少通过使用Ctrl+v来减少

在这个启用了宏的工作表中,我对要调节数据输入的列进行了数据验证。我在这里面临的问题是,考虑到客户希望从另一个excel文件复制数据的情况。实现此方案时,我已将一些数据从外部excel复制到启用数据验证的工作表中。我有一个专栏,用户只能输入小于9的文本长度,但当我复制数据时,比如说文本长度大于9,这样的场景似乎不会显示任何错误消息。是否有一种解决方法可以帮助我克服这种情况

这是Excel的一个已知问题。如果用户将值粘贴到单元格中,则数据验证不起作用

但是,您可以做的是至少通过使用Ctrl+v来减少粘贴。在VBA编辑器的ThisWorkbook模块中输入以下内容:

Private Sub Workbook_Activate()
    Application.OnKey "^v", ""
End Sub
 
Private Sub Workbook_Deactivate()
    Application.OnKey "^v"
End Sub

这使得在激活工作簿时,Ctrl+v设置为不执行任何操作。然后,如果您正在使用多个工作簿,并且希望在其他位置使用Ctrl+v,则当您停用此工作簿时,该行为将重置为正常。

这是Excel的已知问题。如果用户将值粘贴到单元格中,则数据验证不起作用

但是,您可以做的是至少通过使用Ctrl+v来减少粘贴。在VBA编辑器的ThisWorkbook模块中输入以下内容:

Private Sub Workbook_Activate()
    Application.OnKey "^v", ""
End Sub
 
Private Sub Workbook_Deactivate()
    Application.OnKey "^v"
End Sub
这使得在激活工作簿时,Ctrl+v设置为不执行任何操作。然后,如果您正在使用多个工作簿,并且希望在其他位置使用Ctrl+v,则当您停用此工作簿时,行为将重置为正常状态。

由于数据验证不适用于复制/粘贴,因此这是一种解决方法 删除Excel的数据验证并用您自己的验证替换它可能是您问题的解决方案

这允许您执行自己的验证检查。如果插入了无效数据,我们只需撤消插入操作。因此,只能插入完全有效的数据

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim AffectedCells As Range
    Dim Cell As Range
    
    'rule 1: column A allows only text length up to 9
    Set AffectedCells = Intersect(Target, Target.Parent.Range("A:A"))
    If Not AffectedCells Is Nothing Then
        For Each Cell In AffectedCells
            If Not Len(Cell.Value) <= 9 Then 'check length of each cell
                MsgBox "The data """ & Cell.Value & """ inserted in " & Cell.Address & " in column A was longer than 9. We undo!", vbCritical
                Application.Undo 'undo insert
                Exit Sub 'stop checking after one invalid data was found.
            End If
        Next Cell
    End If
    
    'rule 2: column B allows only …
    'Set AffectedCells = Intersect(Target, Target.Parent.Range("B:B"))
    'If Not AffectedCells Is Nothing Then
       'to be continued as above …
    
    
End Sub
…现在规则将保留到指定的范围,您可以随意插入和移动范围。

这是一种解决方法,因为数据验证与复制/粘贴不起作用 删除Excel的数据验证并用您自己的验证替换它可能是您问题的解决方案

这允许您执行自己的验证检查。如果插入了无效数据,我们只需撤消插入操作。因此,只能插入完全有效的数据

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim AffectedCells As Range
    Dim Cell As Range
    
    'rule 1: column A allows only text length up to 9
    Set AffectedCells = Intersect(Target, Target.Parent.Range("A:A"))
    If Not AffectedCells Is Nothing Then
        For Each Cell In AffectedCells
            If Not Len(Cell.Value) <= 9 Then 'check length of each cell
                MsgBox "The data """ & Cell.Value & """ inserted in " & Cell.Address & " in column A was longer than 9. We undo!", vbCritical
                Application.Undo 'undo insert
                Exit Sub 'stop checking after one invalid data was found.
            End If
        Next Cell
    End If
    
    'rule 2: column B allows only …
    'Set AffectedCells = Intersect(Target, Target.Parent.Range("B:B"))
    'If Not AffectedCells Is Nothing Then
       'to be continued as above …
    
    
End Sub

…现在规则将坚持指定的范围,您可以随意插入和移动范围。

如果您将值复制/粘贴到具有数据验证的单元格中,则不会进行数据验证检查。•同样,如果将数据验证放在已经包含数据的单元格上,那么它也不会检查数据。只有通过用户操作手动写入数据时,才会检查数据验证。即使使用VBA输入数据也不会触发数据验证,而不是数据验证本身。但是我怎样才能克服这个问题呢?我发布了一个内置数据验证的替代方法。它更复杂,但可以处理复制/粘贴操作。如果将值复制/粘贴到具有数据验证的单元格中,则不会进行数据验证检查同样,如果将数据验证放在已经包含数据的单元格上,那么它也不会检查数据。只有通过用户操作手动写入数据时,才会检查数据验证。即使使用VBA输入数据也不会触发数据验证,而不是数据验证本身。但是我怎样才能克服这个问题呢?我发布了一个内置数据验证的替代方法。它更复杂,但可以处理复制/粘贴操作。考虑数据流入量巨大的场景。在这种情况下,复制粘贴是唯一的选择。数据验证从未设计用于用户从外部源复制和粘贴大量数据。如果您的方法依赖于用户这样做,我建议取消验证,但使用条件格式化:例如,您可以突出显示一个红色的单元格,其中的值位于参数之外,以便手动向用户标记某个东西不是预期的。考虑数据流入量巨大的场景。在这种情况下,复制粘贴是唯一的选择。数据验证从未设计用于用户从外部源复制和粘贴大量数据。如果您的方法依赖于用户这样做,我建议取消验证,但使用条件格式:例如,您可以突出显示一个红色单元格,其中值不在您的参数范围内,以便手动向用户标记某些内容不符合预期。使用Intersect和Undo的好解决方案!作为我简单的Select Case Target.Address建议,只有在粘贴了1个单元格的情况下才有效,我将删除我的答案:您能帮我验证十进制数据吗?例如,一列应该包含长度为9的数字,并有两个小数点位置。@ThanujaReddy您可以吗
作为新问题发布?包括你已经尝试过的代码,并告诉你哪里卡住了。这里的问题是,我们无法在评论中回答这个问题,原来的问题已经得到了回答。所以只要打开一个新的ᴇʜ我用我尝试过的代码发布了一个新问题。问题的链接如下:[link]请看一看。@Pᴇʜ此代码存在问题。假设我从另一个excel工作表复制一组数据,部分数据可能不符合数据验证的条件。在此场景中,使用此代码将撤消所有数据,包括条件后面的数据。我们如何克服这一点?使用交叉和撤销的好解决方案!作为我简单的Select Case Target.Address建议,只有在粘贴了1个单元格的情况下才有效,我将删除我的答案:您能帮我验证十进制数据吗?例如,一列应该包含长度为9的数字,并有2个小数点。@ThanujaReddy您可以将其作为新问题发布吗?包括你已经尝试过的代码,并告诉你哪里卡住了。这里的问题是,我们无法在评论中回答这个问题,原来的问题已经得到了回答。所以只要打开一个新的ᴇʜ我用我尝试过的代码发布了一个新问题。问题的链接如下:[link]请看一看。@Pᴇʜ此代码存在问题。假设我从另一个excel工作表复制一组数据,部分数据可能不符合数据验证的条件。在此场景中,使用此代码将撤消所有数据,包括条件后面的数据。我们如何克服这一点?