在启用宏的工作表中,我对要调节数据输入的列进行了数据验证。我在这里面临的问题是,考虑到客户希望从另一个Excel文件复制数据的情况。实施此方案后,我已将一些数据从国外Excel复制到了启用了数据验证功能的工作表中。我有一列,用户只能输入小于9的文本长度,但是当我复制数据时说文本长度大于9,这样的情况似乎没有显示任何错误消息。有没有解决方法可以帮助我克服这种情况?
答案 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"))
...,现在规则将遵循指定的范围,您可以根据需要插入和移动范围。