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

时间:2019-01-24 09:07:03

标签: excel vba

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

2 个答案:

答案 0 :(得分:1)

这是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,则在停用此工作簿时,该行为将重置为正常状态。

答案 1 :(得分:1)

一种解决方法,因为数据验证不适用于复制/粘贴

删除Excel的数据验证并将其替换为您自己的验证可以解决您的问题。

这使您可以执行自己的验证检查。如果插入了无效数据,我们只需.Undo插入操作。因此只能插入完全有效的数据。

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 <=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代码中进行了硬编码。例如,如果您为C列设置验证规则,然后在C列之前插入一列,它将移至D,但验证规则仍适用于C。

为避免此问题,您可以使用Named Ranges而不是硬编码范围。因此,您可以在工作表等中定义一个范围。将其命名为Rule1(最好选择一个有意义的名称,而不是编号规则)。例如,标记C列并为其命名。

然后您可以在...中使用该名称

Set AffectedCells = Intersect(Target, Target.Parent.Range("Rule1"))

...,现在规则将遵循指定的范围,您可以根据需要插入和移动范围。