如何实时验证和更正excel中的数据?
我知道excel具有数据验证功能,但是否有一种方法可以自动为用户应用更改,而不是提示他们存在问题 例如,我们有一个通用的电子表格模板,用于内部系统添加项目。在第一列中,对于项目编号,不能有任何非法字符。因此,如果用户在A1中输入AN-XR10LP/1,然后单击下一个单元格,我希望验证能够在用户不做任何操作的情况下将A1值更正为ANXR10LP1如何实时验证和更正excel中的数据?,excel,vba,validation,Excel,Vba,Validation,我知道excel具有数据验证功能,但是否有一种方法可以自动为用户应用更改,而不是提示他们存在问题 例如,我们有一个通用的电子表格模板,用于内部系统添加项目。在第一列中,对于项目编号,不能有任何非法字符。因此,如果用户在A1中输入AN-XR10LP/1,然后单击下一个单元格,我希望验证能够在用户不做任何操作的情况下将A1值更正为ANXR10LP1 有什么想法可以从这个开始吗?为工作表更改创建一个处理程序 Private Sub Worksheet_Change(ByVal Target As Ra
有什么想法可以从这个开始吗?为工作表更改创建一个处理程序
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
在处理程序中,查看Target
指向的位置,并在此基础上应用验证逻辑
请确保在回写更正的值时忽略引发的更改事件:
Private Sub Worksheet_Change(ByVal Target As Range)
static self_protect as boolean
if self_protect then exit sub
...
self_protect = true
Target.Value = "corrected value"
self_protect = false
...
End Sub
我认为只有使用VBA才能实现这一点。请尝试下面的代码。如果对单元格进行数据验证,则可能需要对其进行调整
将此模块放置在要验证数据的工作表对象中
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Rows.Count = 1 Then '-> make sure row count is 1 and target is in column A, can further refine if needed
Dim strValue As String
strValue = CleanString(Target.Value)
Application.EnableEvents = False
Target = strValue
Application.EnableEvents = True
End If
End Sub
Function CleanString(str As String) As String
CleanString = Replace(str, "-", "")
CleanString = Replace(CleanString, "/", "")
'...
'keep adding replacements as needed
End Function
与其自我保护,为什么不关闭应用程序.EnableEvents,然后再打开?@Doug-如果您在一个可能有其他代码需要处理事件的环境中运行代码,那么关闭它们可能会导致问题。“有时候更具选择性是更好的。”蒂姆·威廉姆斯,这是真的,但我不认为是这样。我发现像上面这样的代码比使用内置的应用程序.EnableEvents
更难维护,所以我认为最好使用它,除非需要像GSerg这样的定制方法。我想你的观点是,你不知道是哪种情况。如果你不关闭事件或以其他方式不处理自己的更新值,你将在这里陷入循环…@TimWilliams。我完全明白你的意思,但当我在一个(小)样本集上测试这个时,它似乎工作顺利。我确实编辑了我的代码以获得最佳实践。谢谢,你能解释一下如何将其放入工作表对象中吗?我试图创建一个新的宏,但它不是这样工作的@user7954->这对您来说做得很好。嘿,Scott,在我尝试执行的第一个If语句行上:If Target.Column=1和Target.Rows.Count=1和Target.Row>=2,然后使其跳过标题,但它会使Excel崩溃!