excel - 在 Excel 中的复制粘贴事件期间不遵循数据验证规则
问题描述
在这个启用宏的工作表中,我对要调节数据输入的列进行了数据验证。我在这里面临的问题是,考虑到客户希望从另一个 Excel 文件复制数据的情况。实现这个场景,我已经将一些数据从国外的 excel 复制到我的数据验证启用表中。我有一列,用户只能输入小于 9 的文本长度,但是当我复制数据时说文本长度大于 9,这种情况似乎没有显示任何错误消息。有没有一种解决方法可以帮助我克服这种情况?
解决方案
一种解决方法,因为数据验证不适用于复制/粘贴
删除 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 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 代码中。例如,如果您为列 C 设置验证规则,然后在该列 C 之前插入一列,它将移至 D,但验证规则仍适用于 C。
为避免此问题,您可以使用命名范围而不是硬编码范围。因此,您在工作表中定义了一个范围,例如。命名它Rule1
(最好选择一个有意义的名称而不是编号规则)。例如标记列 C 并为其命名。
然后你就可以在……中使用这个名字了。</p>
Set AffectedCells = Intersect(Target, Target.Parent.Range("Rule1"))
…现在规则将坚持命名范围,您可以根据需要插入和移动范围。
推荐阅读
- r - 在 R 中折叠共享唯一值的列
- java - JOOQ - 使用字符串名称连接表
- r - 在 geom_bar 上绘制一条线
- python - 计算 pandas df 中的运行回报
- angular - NGINX + Angular - 如何创建和写入自定义文本文件
- python - 如何在 Python 中绘制同一投资组合中多个资产的分布
- php - 关闭范围问题:脚本试图执行方法或访问不完整对象的属性
- jboss - 如何获得总时间,我的 KEYCLOAK 服务器正在处理每个传入的 HTTP 请求?
- ios - iOS 自动登录 WKWebView 使用 Google 登录 (Swift)
- python - Python - AttributeError:'str'对象没有属性'destroy'